@kumologica/sdk 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/README.md +1 -0
  2. package/bin/kl.js +3 -0
  3. package/cli/cli.js +6 -0
  4. package/cli/commands/build-commands/aws.js +49 -0
  5. package/cli/commands/build-commands/azure.js +43 -0
  6. package/cli/commands/build-commands/kumohub.js +7 -0
  7. package/cli/commands/build.js +6 -0
  8. package/cli/commands/create.js +32 -0
  9. package/cli/commands/deploy-commands/kumohub.js +114 -0
  10. package/cli/commands/deploy.js +6 -0
  11. package/cli/commands/doc-commands/html.js +61 -0
  12. package/cli/commands/doc.js +6 -0
  13. package/cli/commands/export-commands/cloudformation.js +338 -0
  14. package/cli/commands/export-commands/serverless.js +164 -0
  15. package/cli/commands/export-commands/terraform-commands/aws.js +193 -0
  16. package/cli/commands/export-commands/terraform-commands/azure.js +148 -0
  17. package/cli/commands/export-commands/terraform.js +6 -0
  18. package/cli/commands/export-commands/utils/validator.js +152 -0
  19. package/cli/commands/export.js +6 -0
  20. package/cli/commands/import-commands/mulesoft.js +61 -0
  21. package/cli/commands/import.js +6 -0
  22. package/cli/commands/open.js +46 -0
  23. package/cli/commands/test-utils/TestSuiteController.js +359 -0
  24. package/cli/commands/test-utils/TestSuiteController.test.js +171 -0
  25. package/cli/commands/test-utils/fixtures/example3-flow.json +148 -0
  26. package/cli/commands/test-utils/fixtures/package.json +6 -0
  27. package/cli/commands/test-utils/fixtures/s3-event.js +43 -0
  28. package/cli/commands/test-utils/util/output.js +14 -0
  29. package/cli/commands/test-utils/util/updates/index.js +17 -0
  30. package/cli/commands/test-utils/util/updates/pkg.js +13 -0
  31. package/cli/commands/test-utils/util/updates/templates/default-settings.js +209 -0
  32. package/cli/commands/test.js +66 -0
  33. package/cli/commands/utils.js +14 -0
  34. package/package.json +158 -0
  35. package/src/app/lib/aws/aws-profile.js +43 -0
  36. package/src/app/lib/aws/ca-alexa-api.js +29 -0
  37. package/src/app/lib/aws/ca-apigw-api.js +216 -0
  38. package/src/app/lib/aws/ca-cloudwatch-api.js +78 -0
  39. package/src/app/lib/aws/ca-codecommit-api.js +63 -0
  40. package/src/app/lib/aws/ca-dynamodb-api.js +27 -0
  41. package/src/app/lib/aws/ca-elb-api.js +44 -0
  42. package/src/app/lib/aws/ca-events-api.js +27 -0
  43. package/src/app/lib/aws/ca-iot-api.js +105 -0
  44. package/src/app/lib/aws/ca-s3-api.js +115 -0
  45. package/src/app/lib/aws/ca-sns-api.js +38 -0
  46. package/src/app/lib/aws/ca-sqs-api.js +51 -0
  47. package/src/app/lib/aws/cf.js +439 -0
  48. package/src/app/lib/aws/index.js +970 -0
  49. package/src/app/lib/aws/kl-iam-api.js +27 -0
  50. package/src/app/lib/aws/kl-rekognition-api.js +66 -0
  51. package/src/app/lib/aws/kl-ssm-api.js +24 -0
  52. package/src/app/lib/azure/index.js +80 -0
  53. package/src/app/lib/dependencies.js +50 -0
  54. package/src/app/lib/kumohub/index.js +201 -0
  55. package/src/app/lib/runtime-loader/index.js +42 -0
  56. package/src/app/lib/serverless/index.js +318 -0
  57. package/src/app/lib/stores/aws-cloud-config-store.js +35 -0
  58. package/src/app/lib/stores/azure-config-store.js +24 -0
  59. package/src/app/lib/stores/kumohub-config-store.js +24 -0
  60. package/src/app/lib/stores/project-info-config-store.js +26 -0
  61. package/src/app/lib/stores/settings-cloud-store.js +117 -0
  62. package/src/app/lib/stores/settings-cloud-store.spec.js +26 -0
  63. package/src/app/lib/stores/settings-network-store.js +119 -0
  64. package/src/app/lib/stores/settings-network-store.spec.js +27 -0
  65. package/src/app/lib/stores/store.js +97 -0
  66. package/src/app/lib/stores/test-config-store.js +26 -0
  67. package/src/app/lib/stores/user-preference-store.js +44 -0
  68. package/src/app/lib/utils/editor.js +98 -0
  69. package/src/app/lib/utils/fix-path.js +15 -0
  70. package/src/app/main-process/favicon.ico +0 -0
  71. package/src/app/main-process/main-window.js +209 -0
  72. package/src/app/main-process/menu.js +219 -0
  73. package/src/app/main-process/modal-home.js +118 -0
  74. package/src/app/main-process/modal-newproject.js +119 -0
  75. package/src/app/main-process/modal-nodelibrary.js +90 -0
  76. package/src/app/main-process/modal-welcome.js +114 -0
  77. package/src/app/main-process/runtime-manager.js +141 -0
  78. package/src/app/main.js +590 -0
  79. package/src/app/preload.js +633 -0
  80. package/src/app/ui/editor-api/lib/admin/context.js +42 -0
  81. package/src/app/ui/editor-api/lib/admin/flow.js +55 -0
  82. package/src/app/ui/editor-api/lib/admin/flows.js +53 -0
  83. package/src/app/ui/editor-api/lib/admin/index.js +155 -0
  84. package/src/app/ui/editor-api/lib/admin/nodes.js +164 -0
  85. package/src/app/ui/editor-api/lib/auth/clients.js +17 -0
  86. package/src/app/ui/editor-api/lib/auth/index.js +267 -0
  87. package/src/app/ui/editor-api/lib/auth/permissions.js +51 -0
  88. package/src/app/ui/editor-api/lib/auth/strategies.js +144 -0
  89. package/src/app/ui/editor-api/lib/auth/tokens.js +138 -0
  90. package/src/app/ui/editor-api/lib/auth/users.js +122 -0
  91. package/src/app/ui/editor-api/lib/editor/comms.js +247 -0
  92. package/src/app/ui/editor-api/lib/editor/credentials.js +22 -0
  93. package/src/app/ui/editor-api/lib/editor/index.js +234 -0
  94. package/src/app/ui/editor-api/lib/editor/library.js +69 -0
  95. package/src/app/ui/editor-api/lib/editor/locales.js +37 -0
  96. package/src/app/ui/editor-api/lib/editor/projects.js +497 -0
  97. package/src/app/ui/editor-api/lib/editor/settings.js +118 -0
  98. package/src/app/ui/editor-api/lib/editor/sshkeys.js +87 -0
  99. package/src/app/ui/editor-api/lib/editor/theme.js +184 -0
  100. package/src/app/ui/editor-api/lib/editor/ui.js +149 -0
  101. package/src/app/ui/editor-api/lib/index.js +149 -0
  102. package/src/app/ui/editor-api/lib/runner/index.js +81 -0
  103. package/src/app/ui/editor-api/lib/util.js +51 -0
  104. package/src/app/ui/editor-client/README.md +10 -0
  105. package/src/app/ui/editor-client/constants.js +5 -0
  106. package/src/app/ui/editor-client/index.js +3 -0
  107. package/src/app/ui/editor-client/public/favicon.ico +0 -0
  108. package/src/app/ui/editor-client/public/red/images/bolt.png +0 -0
  109. package/src/app/ui/editor-client/public/red/images/debugger/continue-full.png +0 -0
  110. package/src/app/ui/editor-client/public/red/images/debugger/continue-outline.png +0 -0
  111. package/src/app/ui/editor-client/public/red/images/debugger/pause.png +0 -0
  112. package/src/app/ui/editor-client/public/red/images/debugger/restart.png +0 -0
  113. package/src/app/ui/editor-client/public/red/images/debugger/stepover.png +0 -0
  114. package/src/app/ui/editor-client/public/red/images/debugger/stop.png +0 -0
  115. package/src/app/ui/editor-client/public/red/images/deploy-flows-o.png +0 -0
  116. package/src/app/ui/editor-client/public/red/images/deploy-flows.png +0 -0
  117. package/src/app/ui/editor-client/public/red/images/deploy-full-o.png +0 -0
  118. package/src/app/ui/editor-client/public/red/images/deploy-full.png +0 -0
  119. package/src/app/ui/editor-client/public/red/images/deploy-nodes-o.png +0 -0
  120. package/src/app/ui/editor-client/public/red/images/deploy-nodes.png +0 -0
  121. package/src/app/ui/editor-client/public/red/images/deploy-reload.png +0 -0
  122. package/src/app/ui/editor-client/public/red/images/grip.png +0 -0
  123. package/src/app/ui/editor-client/public/red/images/icons/arrow-in.png +0 -0
  124. package/src/app/ui/editor-client/public/red/images/icons/bolt.png +0 -0
  125. package/src/app/ui/editor-client/public/red/images/icons/node-changed.png +0 -0
  126. package/src/app/ui/editor-client/public/red/images/icons/node-error.png +0 -0
  127. package/src/app/ui/editor-client/public/red/images/icons/node-play.png +0 -0
  128. package/src/app/ui/editor-client/public/red/images/kumologica-app.png +0 -0
  129. package/src/app/ui/editor-client/public/red/images/node-red-256.png +0 -0
  130. package/src/app/ui/editor-client/public/red/images/node-red-icon-black.svg +9 -0
  131. package/src/app/ui/editor-client/public/red/images/node-red-icon.svg +33 -0
  132. package/src/app/ui/editor-client/public/red/images/node-red.png +0 -0
  133. package/src/app/ui/editor-client/public/red/images/pw_maze_white.png +0 -0
  134. package/src/app/ui/editor-client/public/red/images/spin.svg +41 -0
  135. package/src/app/ui/editor-client/public/red/images/spinner.gif +0 -0
  136. package/src/app/ui/editor-client/public/red/images/subflow_tab.png +0 -0
  137. package/src/app/ui/editor-client/public/red/images/test-icon.png +0 -0
  138. package/src/app/ui/editor-client/public/red/images/typedInput/09.png +0 -0
  139. package/src/app/ui/editor-client/public/red/images/typedInput/az.png +0 -0
  140. package/src/app/ui/editor-client/public/red/images/typedInput/bin.png +0 -0
  141. package/src/app/ui/editor-client/public/red/images/typedInput/bool.png +0 -0
  142. package/src/app/ui/editor-client/public/red/images/typedInput/env.png +0 -0
  143. package/src/app/ui/editor-client/public/red/images/typedInput/expr.png +0 -0
  144. package/src/app/ui/editor-client/public/red/images/typedInput/json.png +0 -0
  145. package/src/app/ui/editor-client/public/red/images/typedInput/re.png +0 -0
  146. package/src/app/ui/editor-client/public/red/keymap.json +54 -0
  147. package/src/app/ui/editor-client/public/red/main-modals.js +14 -0
  148. package/src/app/ui/editor-client/public/red/main-modals.min.js +16 -0
  149. package/src/app/ui/editor-client/public/red/main.js +10 -0
  150. package/src/app/ui/editor-client/public/red/main.min.js +16 -0
  151. package/src/app/ui/editor-client/public/red/red.js +44903 -0
  152. package/src/app/ui/editor-client/public/red/red.min.js +16 -0
  153. package/src/app/ui/editor-client/public/red/style.min.css +24 -0
  154. package/src/app/ui/editor-client/public/vendor/ace/LICENSE +24 -0
  155. package/src/app/ui/editor-client/public/vendor/ace/ace.js +17 -0
  156. package/src/app/ui/editor-client/public/vendor/ace/ext-language_tools.js +8 -0
  157. package/src/app/ui/editor-client/public/vendor/ace/ext-searchbox.js +8 -0
  158. package/src/app/ui/editor-client/public/vendor/ace/mode-css.js +8 -0
  159. package/src/app/ui/editor-client/public/vendor/ace/mode-handlebars.js +8 -0
  160. package/src/app/ui/editor-client/public/vendor/ace/mode-html.js +8 -0
  161. package/src/app/ui/editor-client/public/vendor/ace/mode-javascript.js +8 -0
  162. package/src/app/ui/editor-client/public/vendor/ace/mode-json.js +8 -0
  163. package/src/app/ui/editor-client/public/vendor/ace/mode-jsonata.js +1 -0
  164. package/src/app/ui/editor-client/public/vendor/ace/mode-markdown.js +8 -0
  165. package/src/app/ui/editor-client/public/vendor/ace/mode-properties.js +8 -0
  166. package/src/app/ui/editor-client/public/vendor/ace/mode-python.js +8 -0
  167. package/src/app/ui/editor-client/public/vendor/ace/mode-sql.js +8 -0
  168. package/src/app/ui/editor-client/public/vendor/ace/mode-swift.js +8 -0
  169. package/src/app/ui/editor-client/public/vendor/ace/mode-text.js +8 -0
  170. package/src/app/ui/editor-client/public/vendor/ace/mode-xml.js +8 -0
  171. package/src/app/ui/editor-client/public/vendor/ace/mode-yaml.js +8 -0
  172. package/src/app/ui/editor-client/public/vendor/ace/snippets/css.js +8 -0
  173. package/src/app/ui/editor-client/public/vendor/ace/snippets/handlebars.js +8 -0
  174. package/src/app/ui/editor-client/public/vendor/ace/snippets/html.js +8 -0
  175. package/src/app/ui/editor-client/public/vendor/ace/snippets/javascript.js +8 -0
  176. package/src/app/ui/editor-client/public/vendor/ace/snippets/json.js +8 -0
  177. package/src/app/ui/editor-client/public/vendor/ace/snippets/jsonata.js +1 -0
  178. package/src/app/ui/editor-client/public/vendor/ace/snippets/markdown.js +8 -0
  179. package/src/app/ui/editor-client/public/vendor/ace/snippets/properties.js +8 -0
  180. package/src/app/ui/editor-client/public/vendor/ace/snippets/python.js +8 -0
  181. package/src/app/ui/editor-client/public/vendor/ace/snippets/sql.js +8 -0
  182. package/src/app/ui/editor-client/public/vendor/ace/snippets/swift.js +8 -0
  183. package/src/app/ui/editor-client/public/vendor/ace/snippets/text.js +8 -0
  184. package/src/app/ui/editor-client/public/vendor/ace/snippets/xml.js +8 -0
  185. package/src/app/ui/editor-client/public/vendor/ace/snippets/yaml.js +8 -0
  186. package/src/app/ui/editor-client/public/vendor/ace/theme-chrome.js +8 -0
  187. package/src/app/ui/editor-client/public/vendor/ace/theme-tomorrow.js +8 -0
  188. package/src/app/ui/editor-client/public/vendor/ace/worker-css.js +1 -0
  189. package/src/app/ui/editor-client/public/vendor/ace/worker-html.js +1 -0
  190. package/src/app/ui/editor-client/public/vendor/ace/worker-javascript.js +1 -0
  191. package/src/app/ui/editor-client/public/vendor/ace/worker-json.js +1 -0
  192. package/src/app/ui/editor-client/public/vendor/ace/worker-jsonata.js +2140 -0
  193. package/src/app/ui/editor-client/public/vendor/ace/worker-xml.js +1 -0
  194. package/src/app/ui/editor-client/public/vendor/beautifyjs/beautify.min.js +1 -0
  195. package/src/app/ui/editor-client/public/vendor/bootstrap/css/bootstrap.min.css +9 -0
  196. package/src/app/ui/editor-client/public/vendor/bootstrap/img/glyphicons-halflings-white.png +0 -0
  197. package/src/app/ui/editor-client/public/vendor/bootstrap/img/glyphicons-halflings.png +0 -0
  198. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/active-line.js +72 -0
  199. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/coffeescript-lint.js +47 -0
  200. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/javascript-hint.js +157 -0
  201. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/javascript-lint.js +63 -0
  202. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/jshint.js +29591 -0
  203. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/lint.css +73 -0
  204. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/lint.js +252 -0
  205. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/show-hint.css +36 -0
  206. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/show-hint.js +460 -0
  207. package/src/app/ui/editor-client/public/vendor/code-mirror/addon/sql-hint.js +304 -0
  208. package/src/app/ui/editor-client/public/vendor/code-mirror/lib/codemirror.css +350 -0
  209. package/src/app/ui/editor-client/public/vendor/code-mirror/lib/codemirror.js +9800 -0
  210. package/src/app/ui/editor-client/public/vendor/code-mirror/mode/javascript.js +927 -0
  211. package/src/app/ui/editor-client/public/vendor/code-mirror/mode/sql.js +494 -0
  212. package/src/app/ui/editor-client/public/vendor/code-mirror/theme/base16-dark.css +38 -0
  213. package/src/app/ui/editor-client/public/vendor/code-mirror/theme/monokai.css +42 -0
  214. package/src/app/ui/editor-client/public/vendor/code-mirror/theme/solarized.css +168 -0
  215. package/src/app/ui/editor-client/public/vendor/d3-context-menu/d3-context-menu.css +43 -0
  216. package/src/app/ui/editor-client/public/vendor/d3-context-menu/d3-context-menu.js +87 -0
  217. package/src/app/ui/editor-client/public/vendor/easy-json-schema/index.js +88 -0
  218. package/src/app/ui/editor-client/public/vendor/font-awesome/css/font-awesome.min.css +4 -0
  219. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  220. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  221. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  222. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  223. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  224. package/src/app/ui/editor-client/public/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  225. package/src/app/ui/editor-client/public/vendor/icofont/fonts/icofont.eot +0 -0
  226. package/src/app/ui/editor-client/public/vendor/icofont/fonts/icofont.svg +2105 -0
  227. package/src/app/ui/editor-client/public/vendor/icofont/fonts/icofont.ttf +0 -0
  228. package/src/app/ui/editor-client/public/vendor/icofont/fonts/icofont.woff +0 -0
  229. package/src/app/ui/editor-client/public/vendor/icofont/fonts/icofont.woff2 +0 -0
  230. package/src/app/ui/editor-client/public/vendor/icofont/icofont.min.css +7 -0
  231. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/animated-overlay.gif +0 -0
  232. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  233. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  234. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  235. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  236. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  237. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  238. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  239. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  240. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  241. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  242. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  243. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  244. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  245. package/src/app/ui/editor-client/public/vendor/jquery/css/smoothness/jquery-ui-1.10.3.custom.min.css +5 -0
  246. package/src/app/ui/editor-client/public/vendor/jsonata/jsonata.min.js +183 -0
  247. package/src/app/ui/editor-client/public/vendor/misc/toggleswitch.css +181 -0
  248. package/src/app/ui/editor-client/public/vendor/misc/toggleswitch.js +48 -0
  249. package/src/app/ui/editor-client/public/vendor/simplemde/simplemde.min.css +7 -0
  250. package/src/app/ui/editor-client/public/vendor/simplemde/simplemde.min.js +15 -0
  251. package/src/app/ui/editor-client/public/vendor/vendor.css +0 -0
  252. package/src/app/ui/editor-client/public/vendor/vendor.js +125 -0
  253. package/src/app/ui/editor-client/public/vendor/xterm/lib/xterm.js +2 -0
  254. package/src/app/ui/editor-client/src/ace/README.md +50 -0
  255. package/src/app/ui/editor-client/src/ace/mode/nrjavascript.js +35 -0
  256. package/src/app/ui/editor-client/src/ace/mode/nrjavascript_worker.js +189 -0
  257. package/src/app/ui/editor-client/src/favicon.ico +0 -0
  258. package/src/app/ui/editor-client/src/images/bolt.png +0 -0
  259. package/src/app/ui/editor-client/src/images/debugger/continue-full.png +0 -0
  260. package/src/app/ui/editor-client/src/images/debugger/continue-outline.png +0 -0
  261. package/src/app/ui/editor-client/src/images/debugger/pause.png +0 -0
  262. package/src/app/ui/editor-client/src/images/debugger/restart.png +0 -0
  263. package/src/app/ui/editor-client/src/images/debugger/stepover.png +0 -0
  264. package/src/app/ui/editor-client/src/images/debugger/stop.png +0 -0
  265. package/src/app/ui/editor-client/src/images/deploy-flows-o.png +0 -0
  266. package/src/app/ui/editor-client/src/images/deploy-flows.png +0 -0
  267. package/src/app/ui/editor-client/src/images/deploy-full-o.png +0 -0
  268. package/src/app/ui/editor-client/src/images/deploy-full.png +0 -0
  269. package/src/app/ui/editor-client/src/images/deploy-nodes-o.png +0 -0
  270. package/src/app/ui/editor-client/src/images/deploy-nodes.png +0 -0
  271. package/src/app/ui/editor-client/src/images/deploy-reload.png +0 -0
  272. package/src/app/ui/editor-client/src/images/grip.png +0 -0
  273. package/src/app/ui/editor-client/src/images/icons/arrow-in.png +0 -0
  274. package/src/app/ui/editor-client/src/images/icons/bolt.png +0 -0
  275. package/src/app/ui/editor-client/src/images/icons/node-changed.png +0 -0
  276. package/src/app/ui/editor-client/src/images/icons/node-error.png +0 -0
  277. package/src/app/ui/editor-client/src/images/icons/node-play.png +0 -0
  278. package/src/app/ui/editor-client/src/images/kumologica-app.png +0 -0
  279. package/src/app/ui/editor-client/src/images/node-red-256.png +0 -0
  280. package/src/app/ui/editor-client/src/images/node-red-icon-black.svg +9 -0
  281. package/src/app/ui/editor-client/src/images/node-red-icon.svg +33 -0
  282. package/src/app/ui/editor-client/src/images/node-red.png +0 -0
  283. package/src/app/ui/editor-client/src/images/pw_maze_white.png +0 -0
  284. package/src/app/ui/editor-client/src/images/spin.svg +41 -0
  285. package/src/app/ui/editor-client/src/images/spinner.gif +0 -0
  286. package/src/app/ui/editor-client/src/images/subflow_tab.png +0 -0
  287. package/src/app/ui/editor-client/src/images/test-icon.png +0 -0
  288. package/src/app/ui/editor-client/src/images/typedInput/09.png +0 -0
  289. package/src/app/ui/editor-client/src/images/typedInput/az.png +0 -0
  290. package/src/app/ui/editor-client/src/images/typedInput/bin.png +0 -0
  291. package/src/app/ui/editor-client/src/images/typedInput/bool.png +0 -0
  292. package/src/app/ui/editor-client/src/images/typedInput/env.png +0 -0
  293. package/src/app/ui/editor-client/src/images/typedInput/expr.png +0 -0
  294. package/src/app/ui/editor-client/src/images/typedInput/json.png +0 -0
  295. package/src/app/ui/editor-client/src/images/typedInput/re.png +0 -0
  296. package/src/app/ui/editor-client/src/js/comms.js +174 -0
  297. package/src/app/ui/editor-client/src/js/events.js +39 -0
  298. package/src/app/ui/editor-client/src/js/font-awesome.js +818 -0
  299. package/src/app/ui/editor-client/src/js/history.js +337 -0
  300. package/src/app/ui/editor-client/src/js/i18n.js +81 -0
  301. package/src/app/ui/editor-client/src/js/jquery-addons.js +21 -0
  302. package/src/app/ui/editor-client/src/js/keymap.json +54 -0
  303. package/src/app/ui/editor-client/src/js/main-modals.js +14 -0
  304. package/src/app/ui/editor-client/src/js/main.js +10 -0
  305. package/src/app/ui/editor-client/src/js/modals/modal-home.js +162 -0
  306. package/src/app/ui/editor-client/src/js/modals/modal-new-project.js +86 -0
  307. package/src/app/ui/editor-client/src/js/modals/modal-node-library.js +255 -0
  308. package/src/app/ui/editor-client/src/js/modals/modal-welcome.js +102 -0
  309. package/src/app/ui/editor-client/src/js/nodes.js +1736 -0
  310. package/src/app/ui/editor-client/src/js/red.js +704 -0
  311. package/src/app/ui/editor-client/src/js/settings.js +275 -0
  312. package/src/app/ui/editor-client/src/js/text/bidi.js +116 -0
  313. package/src/app/ui/editor-client/src/js/text/format.js +1316 -0
  314. package/src/app/ui/editor-client/src/js/ui/actions.js +39 -0
  315. package/src/app/ui/editor-client/src/js/ui/clipboard.js +510 -0
  316. package/src/app/ui/editor-client/src/js/ui/common/checkboxSet.js +117 -0
  317. package/src/app/ui/editor-client/src/js/ui/common/editableList.js +322 -0
  318. package/src/app/ui/editor-client/src/js/ui/common/menu.js +277 -0
  319. package/src/app/ui/editor-client/src/js/ui/common/panels.js +104 -0
  320. package/src/app/ui/editor-client/src/js/ui/common/popover.js +268 -0
  321. package/src/app/ui/editor-client/src/js/ui/common/searchBox.js +98 -0
  322. package/src/app/ui/editor-client/src/js/ui/common/stack.js +184 -0
  323. package/src/app/ui/editor-client/src/js/ui/common/tabs.js +730 -0
  324. package/src/app/ui/editor-client/src/js/ui/common/treeList.js +170 -0
  325. package/src/app/ui/editor-client/src/js/ui/common/typedInput.js +819 -0
  326. package/src/app/ui/editor-client/src/js/ui/common/typedInputLong.js +829 -0
  327. package/src/app/ui/editor-client/src/js/ui/deploy.js +422 -0
  328. package/src/app/ui/editor-client/src/js/ui/diff.js +2225 -0
  329. package/src/app/ui/editor-client/src/js/ui/editor.js +3020 -0
  330. package/src/app/ui/editor-client/src/js/ui/editors/buffer.js +195 -0
  331. package/src/app/ui/editor-client/src/js/ui/editors/expression.js +627 -0
  332. package/src/app/ui/editor-client/src/js/ui/editors/js.js +89 -0
  333. package/src/app/ui/editor-client/src/js/ui/editors/json.js +107 -0
  334. package/src/app/ui/editor-client/src/js/ui/editors/markdown.js +267 -0
  335. package/src/app/ui/editor-client/src/js/ui/editors/string.js +75 -0
  336. package/src/app/ui/editor-client/src/js/ui/event-log.js +107 -0
  337. package/src/app/ui/editor-client/src/js/ui/header.js +372 -0
  338. package/src/app/ui/editor-client/src/js/ui/keyboard.js +565 -0
  339. package/src/app/ui/editor-client/src/js/ui/library.js +570 -0
  340. package/src/app/ui/editor-client/src/js/ui/logviewer.js +116 -0
  341. package/src/app/ui/editor-client/src/js/ui/notifications.js +282 -0
  342. package/src/app/ui/editor-client/src/js/ui/palette-editor.js +1061 -0
  343. package/src/app/ui/editor-client/src/js/ui/palette.js +788 -0
  344. package/src/app/ui/editor-client/src/js/ui/project-info.js +232 -0
  345. package/src/app/ui/editor-client/src/js/ui/projects/projectSettings.js +1651 -0
  346. package/src/app/ui/editor-client/src/js/ui/projects/projectUserSettings.js +404 -0
  347. package/src/app/ui/editor-client/src/js/ui/projects/projects.js +2395 -0
  348. package/src/app/ui/editor-client/src/js/ui/projects/tab-versionControl.js +1383 -0
  349. package/src/app/ui/editor-client/src/js/ui/search.js +366 -0
  350. package/src/app/ui/editor-client/src/js/ui/sidebar.js +409 -0
  351. package/src/app/ui/editor-client/src/js/ui/state.js +14 -0
  352. package/src/app/ui/editor-client/src/js/ui/subflow.js +748 -0
  353. package/src/app/ui/editor-client/src/js/ui/tab-awsDeploy.js +1427 -0
  354. package/src/app/ui/editor-client/src/js/ui/tab-azure.js +852 -0
  355. package/src/app/ui/editor-client/src/js/ui/tab-config.js +452 -0
  356. package/src/app/ui/editor-client/src/js/ui/tab-context.js +406 -0
  357. package/src/app/ui/editor-client/src/js/ui/tab-info.js +661 -0
  358. package/src/app/ui/editor-client/src/js/ui/tab-kumohub.js +800 -0
  359. package/src/app/ui/editor-client/src/js/ui/tab-nodeInfo.js +60 -0
  360. package/src/app/ui/editor-client/src/js/ui/tab-test.js +915 -0
  361. package/src/app/ui/editor-client/src/js/ui/terminal.js +240 -0
  362. package/src/app/ui/editor-client/src/js/ui/touch/radialMenu.js +170 -0
  363. package/src/app/ui/editor-client/src/js/ui/tray.js +411 -0
  364. package/src/app/ui/editor-client/src/js/ui/typeSearch.js +411 -0
  365. package/src/app/ui/editor-client/src/js/ui/ui-settings.js +422 -0
  366. package/src/app/ui/editor-client/src/js/ui/update-panel.js +84 -0
  367. package/src/app/ui/editor-client/src/js/ui/userSettings.js +673 -0
  368. package/src/app/ui/editor-client/src/js/ui/utils.js +1287 -0
  369. package/src/app/ui/editor-client/src/js/ui/view-navigator.js +169 -0
  370. package/src/app/ui/editor-client/src/js/ui/view-tools.js +123 -0
  371. package/src/app/ui/editor-client/src/js/ui/view.js +5333 -0
  372. package/src/app/ui/editor-client/src/js/ui/workspaces.js +498 -0
  373. package/src/app/ui/editor-client/src/js/user.js +282 -0
  374. package/src/app/ui/editor-client/src/js/validators.js +54 -0
  375. package/src/app/ui/editor-client/src/kumologica-app.png +0 -0
  376. package/src/app/ui/editor-client/src/sass/ace.scss +29 -0
  377. package/src/app/ui/editor-client/src/sass/bootstrap.scss +21 -0
  378. package/src/app/ui/editor-client/src/sass/colors.scss +76 -0
  379. package/src/app/ui/editor-client/src/sass/debug.scss +383 -0
  380. package/src/app/ui/editor-client/src/sass/diff.scss +695 -0
  381. package/src/app/ui/editor-client/src/sass/dragdrop.scss +37 -0
  382. package/src/app/ui/editor-client/src/sass/dropdownMenu.scss +93 -0
  383. package/src/app/ui/editor-client/src/sass/editor.scss +683 -0
  384. package/src/app/ui/editor-client/src/sass/flow.scss +330 -0
  385. package/src/app/ui/editor-client/src/sass/forms.scss +1093 -0
  386. package/src/app/ui/editor-client/src/sass/header.scss +502 -0
  387. package/src/app/ui/editor-client/src/sass/jquery.scss +152 -0
  388. package/src/app/ui/editor-client/src/sass/keyboard.scss +136 -0
  389. package/src/app/ui/editor-client/src/sass/library.scss +54 -0
  390. package/src/app/ui/editor-client/src/sass/mixins.scss +283 -0
  391. package/src/app/ui/editor-client/src/sass/modals/modalHome.scss +138 -0
  392. package/src/app/ui/editor-client/src/sass/modals/modalNewProject.scss +96 -0
  393. package/src/app/ui/editor-client/src/sass/modals/modalNodeLibrary.scss +131 -0
  394. package/src/app/ui/editor-client/src/sass/modals/modalWelcome.scss +102 -0
  395. package/src/app/ui/editor-client/src/sass/notifications.scss +118 -0
  396. package/src/app/ui/editor-client/src/sass/palette-editor.scss +275 -0
  397. package/src/app/ui/editor-client/src/sass/palette.scss +279 -0
  398. package/src/app/ui/editor-client/src/sass/panels.scss +61 -0
  399. package/src/app/ui/editor-client/src/sass/popover.scss +166 -0
  400. package/src/app/ui/editor-client/src/sass/project-info.scss +74 -0
  401. package/src/app/ui/editor-client/src/sass/projects.scss +875 -0
  402. package/src/app/ui/editor-client/src/sass/search.scss +201 -0
  403. package/src/app/ui/editor-client/src/sass/sidebar.scss +201 -0
  404. package/src/app/ui/editor-client/src/sass/style.scss +170 -0
  405. package/src/app/ui/editor-client/src/sass/tab-azure.scss +68 -0
  406. package/src/app/ui/editor-client/src/sass/tab-cloud.scss +67 -0
  407. package/src/app/ui/editor-client/src/sass/tab-config.scss +100 -0
  408. package/src/app/ui/editor-client/src/sass/tab-context.scss +54 -0
  409. package/src/app/ui/editor-client/src/sass/tab-info.scss +307 -0
  410. package/src/app/ui/editor-client/src/sass/tab-kumohub.scss +68 -0
  411. package/src/app/ui/editor-client/src/sass/tab-test.scss +257 -0
  412. package/src/app/ui/editor-client/src/sass/tabs.scss +395 -0
  413. package/src/app/ui/editor-client/src/sass/terminal.scss +246 -0
  414. package/src/app/ui/editor-client/src/sass/ui/common/checkboxSet.scss +29 -0
  415. package/src/app/ui/editor-client/src/sass/ui/common/editableList.scss +81 -0
  416. package/src/app/ui/editor-client/src/sass/ui/common/nodeList.scss +65 -0
  417. package/src/app/ui/editor-client/src/sass/ui/common/searchBox.scss +77 -0
  418. package/src/app/ui/editor-client/src/sass/ui/common/stack.scss +26 -0
  419. package/src/app/ui/editor-client/src/sass/ui/common/treeList.scss +108 -0
  420. package/src/app/ui/editor-client/src/sass/ui/common/typedInput.scss +181 -0
  421. package/src/app/ui/editor-client/src/sass/ui/common/typedInputLong.scss +183 -0
  422. package/src/app/ui/editor-client/src/sass/ui-settings.scss +119 -0
  423. package/src/app/ui/editor-client/src/sass/update-panel.scss +18 -0
  424. package/src/app/ui/editor-client/src/sass/userSettings.scss +93 -0
  425. package/src/app/ui/editor-client/src/sass/widgetStyle.scss +23 -0
  426. package/src/app/ui/editor-client/src/sass/workspace.scss +123 -0
  427. package/src/app/ui/editor-client/src/sass/workspaceToolbar.scss +85 -0
  428. package/src/app/ui/editor-client/src/vendor/ace/LICENSE +24 -0
  429. package/src/app/ui/editor-client/src/vendor/ace/ace.js +17 -0
  430. package/src/app/ui/editor-client/src/vendor/ace/ext-language_tools.js +8 -0
  431. package/src/app/ui/editor-client/src/vendor/ace/ext-searchbox.js +8 -0
  432. package/src/app/ui/editor-client/src/vendor/ace/mode-css.js +8 -0
  433. package/src/app/ui/editor-client/src/vendor/ace/mode-handlebars.js +8 -0
  434. package/src/app/ui/editor-client/src/vendor/ace/mode-html.js +8 -0
  435. package/src/app/ui/editor-client/src/vendor/ace/mode-javascript.js +8 -0
  436. package/src/app/ui/editor-client/src/vendor/ace/mode-json.js +8 -0
  437. package/src/app/ui/editor-client/src/vendor/ace/mode-markdown.js +8 -0
  438. package/src/app/ui/editor-client/src/vendor/ace/mode-properties.js +8 -0
  439. package/src/app/ui/editor-client/src/vendor/ace/mode-python.js +8 -0
  440. package/src/app/ui/editor-client/src/vendor/ace/mode-sql.js +8 -0
  441. package/src/app/ui/editor-client/src/vendor/ace/mode-swift.js +8 -0
  442. package/src/app/ui/editor-client/src/vendor/ace/mode-text.js +8 -0
  443. package/src/app/ui/editor-client/src/vendor/ace/mode-xml.js +8 -0
  444. package/src/app/ui/editor-client/src/vendor/ace/mode-yaml.js +8 -0
  445. package/src/app/ui/editor-client/src/vendor/ace/snippets/css.js +8 -0
  446. package/src/app/ui/editor-client/src/vendor/ace/snippets/handlebars.js +8 -0
  447. package/src/app/ui/editor-client/src/vendor/ace/snippets/html.js +8 -0
  448. package/src/app/ui/editor-client/src/vendor/ace/snippets/javascript.js +8 -0
  449. package/src/app/ui/editor-client/src/vendor/ace/snippets/json.js +8 -0
  450. package/src/app/ui/editor-client/src/vendor/ace/snippets/markdown.js +8 -0
  451. package/src/app/ui/editor-client/src/vendor/ace/snippets/properties.js +8 -0
  452. package/src/app/ui/editor-client/src/vendor/ace/snippets/python.js +8 -0
  453. package/src/app/ui/editor-client/src/vendor/ace/snippets/sql.js +8 -0
  454. package/src/app/ui/editor-client/src/vendor/ace/snippets/swift.js +8 -0
  455. package/src/app/ui/editor-client/src/vendor/ace/snippets/text.js +8 -0
  456. package/src/app/ui/editor-client/src/vendor/ace/snippets/xml.js +8 -0
  457. package/src/app/ui/editor-client/src/vendor/ace/snippets/yaml.js +8 -0
  458. package/src/app/ui/editor-client/src/vendor/ace/theme-chrome.js +8 -0
  459. package/src/app/ui/editor-client/src/vendor/ace/theme-tomorrow.js +8 -0
  460. package/src/app/ui/editor-client/src/vendor/ace/worker-css.js +1 -0
  461. package/src/app/ui/editor-client/src/vendor/ace/worker-html.js +1 -0
  462. package/src/app/ui/editor-client/src/vendor/ace/worker-javascript.js +1 -0
  463. package/src/app/ui/editor-client/src/vendor/ace/worker-json.js +1 -0
  464. package/src/app/ui/editor-client/src/vendor/ace/worker-xml.js +1 -0
  465. package/src/app/ui/editor-client/src/vendor/beautifyjs/beautify.min.js +1 -0
  466. package/src/app/ui/editor-client/src/vendor/bootstrap/css/bootstrap.css +5406 -0
  467. package/src/app/ui/editor-client/src/vendor/bootstrap/css/bootstrap.min.css +9 -0
  468. package/src/app/ui/editor-client/src/vendor/bootstrap/img/glyphicons-halflings-white.png +0 -0
  469. package/src/app/ui/editor-client/src/vendor/bootstrap/img/glyphicons-halflings.png +0 -0
  470. package/src/app/ui/editor-client/src/vendor/bootstrap/js/bootstrap.min.js +6 -0
  471. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/active-line.js +72 -0
  472. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/coffeescript-lint.js +47 -0
  473. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/javascript-hint.js +157 -0
  474. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/javascript-lint.js +63 -0
  475. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/jshint.js +29591 -0
  476. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/lint.css +73 -0
  477. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/lint.js +252 -0
  478. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/show-hint.css +36 -0
  479. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/show-hint.js +460 -0
  480. package/src/app/ui/editor-client/src/vendor/code-mirror/addon/sql-hint.js +304 -0
  481. package/src/app/ui/editor-client/src/vendor/code-mirror/lib/codemirror.css +350 -0
  482. package/src/app/ui/editor-client/src/vendor/code-mirror/lib/codemirror.js +9800 -0
  483. package/src/app/ui/editor-client/src/vendor/code-mirror/mode/javascript.js +927 -0
  484. package/src/app/ui/editor-client/src/vendor/code-mirror/mode/sql.js +494 -0
  485. package/src/app/ui/editor-client/src/vendor/code-mirror/theme/base16-dark.css +38 -0
  486. package/src/app/ui/editor-client/src/vendor/code-mirror/theme/monokai.css +42 -0
  487. package/src/app/ui/editor-client/src/vendor/code-mirror/theme/solarized.css +168 -0
  488. package/src/app/ui/editor-client/src/vendor/d3/d3.v3.min.js +4 -0
  489. package/src/app/ui/editor-client/src/vendor/d3/d3.v4.min.js +2 -0
  490. package/src/app/ui/editor-client/src/vendor/d3-context-menu/d3-context-menu.css +43 -0
  491. package/src/app/ui/editor-client/src/vendor/d3-context-menu/d3-context-menu.js +87 -0
  492. package/src/app/ui/editor-client/src/vendor/easy-json-schema/index.js +88 -0
  493. package/src/app/ui/editor-client/src/vendor/font-awesome/css/font-awesome.min.css +4 -0
  494. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/FontAwesome.otf +0 -0
  495. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  496. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/fontawesome-webfont.svg +2671 -0
  497. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  498. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  499. package/src/app/ui/editor-client/src/vendor/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  500. package/src/app/ui/editor-client/src/vendor/i18next/i18next.min.js +5 -0
  501. package/src/app/ui/editor-client/src/vendor/icofont/fonts/icofont.eot +0 -0
  502. package/src/app/ui/editor-client/src/vendor/icofont/fonts/icofont.svg +2105 -0
  503. package/src/app/ui/editor-client/src/vendor/icofont/fonts/icofont.ttf +0 -0
  504. package/src/app/ui/editor-client/src/vendor/icofont/fonts/icofont.woff +0 -0
  505. package/src/app/ui/editor-client/src/vendor/icofont/fonts/icofont.woff2 +0 -0
  506. package/src/app/ui/editor-client/src/vendor/icofont/icofont.min.css +7 -0
  507. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/animated-overlay.gif +0 -0
  508. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  509. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  510. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  511. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  512. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  513. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  514. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  515. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  516. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-icons_222222_256x240.png +0 -0
  517. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  518. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-icons_454545_256x240.png +0 -0
  519. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-icons_888888_256x240.png +0 -0
  520. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  521. package/src/app/ui/editor-client/src/vendor/jquery/css/smoothness/jquery-ui-1.10.3.custom.min.css +5 -0
  522. package/src/app/ui/editor-client/src/vendor/jquery/js/jquery-1.11.3.min.js +5 -0
  523. package/src/app/ui/editor-client/src/vendor/jquery/js/jquery-ui-1.10.3.custom.min.js +7 -0
  524. package/src/app/ui/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js +11 -0
  525. package/src/app/ui/editor-client/src/vendor/jsonata/formatter.js +183 -0
  526. package/src/app/ui/editor-client/src/vendor/jsonata/mode-jsonata.js +134 -0
  527. package/src/app/ui/editor-client/src/vendor/jsonata/snippets-jsonata.js +11 -0
  528. package/src/app/ui/editor-client/src/vendor/jsonata/worker-jsonata.js +2140 -0
  529. package/src/app/ui/editor-client/src/vendor/marked/marked.min.js +6 -0
  530. package/src/app/ui/editor-client/src/vendor/misc/toggleswitch.css +181 -0
  531. package/src/app/ui/editor-client/src/vendor/misc/toggleswitch.js +48 -0
  532. package/src/app/ui/editor-client/templates/index.mst +314 -0
  533. package/src/app/ui/editor-client/templates/modals/modalHome.mst +107 -0
  534. package/src/app/ui/editor-client/templates/modals/modalNewProject.mst +104 -0
  535. package/src/app/ui/editor-client/templates/modals/modalNodeLibrary.mst +72 -0
  536. package/src/app/ui/editor-client/templates/modals/modalWelcome.mst +111 -0
  537. package/src/assets/eula.txt +170 -0
  538. package/src/assets/icon.icns +0 -0
  539. package/src/assets/kumologica-app.png +0 -0
  540. package/src/assets/license_en.txt +170 -0
@@ -0,0 +1,748 @@
1
+
2
+
3
+ RED.subflow = (function() {
4
+
5
+ var _subflowEditTemplate = '<script type="text/x-kumologica" data-template-name="subflow">'+
6
+ '<div class="form-row"><label for="node-input-name" data-i18n="[append]editor:common.label.name"><i class="fa fa-tag"></i> </label><input type="text" id="node-input-name"></div>'+
7
+ '<div class="form-row" style="margin-bottom: 0px;"><label style="width: auto;" data-i18n="[append]editor:editor-tab.env"><i class="fa fa-th-list"></i> </label></div>'+
8
+ '<div class="form-row node-input-env-container-row"><ol id="node-input-env-container"></ol></div>'+
9
+ '</script>';
10
+
11
+ var _subflowTemplateEditTemplate = '<script type="text/x-kumologica" data-template-name="subflow-template">'+
12
+ '<div class="form-row"><i class="fa fa-tag"></i> <label for="subflow-input-name" data-i18n="common.label.name"></label><input type="text" id="subflow-input-name"></div>'+
13
+ '<div class="form-row"><i class="fa fa-folder-o"></i> <label for="subflow-input-category" data-i18n="editor:subflow.category"></label><select style="width: 250px;" id="subflow-input-category"></select><input style="display:none; margin-left: 10px; width:calc(100% - 250px)" type="text" id="subflow-input-custom-category"></div>'+
14
+ '<div class="form-row" style="margin-bottom: 0px;"><label style="width: auto;" data-i18n="[append]editor:editor-tab.env"><i class="fa fa-th-list"></i> </label></div>'+
15
+ '<div class="form-row node-input-env-container-row"><ol id="node-input-env-container"></ol></div>'+
16
+ '<div class="form-row form-tips" id="subflow-dialog-user-count"></div>'+
17
+ '</script>';
18
+
19
+ function findAvailableSubflowIOPosition(subflow,isInput) {
20
+ var pos = {x:50,y:30};
21
+ if (!isInput) {
22
+ pos.x += 110;
23
+ }
24
+ var ports = [].concat(subflow.out).concat(subflow.in);
25
+ if (subflow.status) {
26
+ ports.push(subflow.status);
27
+ }
28
+ ports.sort(function(A,B) {
29
+ return A.x-B.x;
30
+ });
31
+ for (var i=0; i<ports.length; i++) {
32
+ var port = ports[i];
33
+ if (port.x == pos.x && port.y == pos.y) {
34
+ pos.x += 55;
35
+ }
36
+ }
37
+ return pos;
38
+ }
39
+
40
+ function addSubflowInput() {
41
+ var subflow = RED.nodes.subflow(RED.workspaces.active());
42
+ if (subflow.in.length === 1) {
43
+ return;
44
+ }
45
+ var position = findAvailableSubflowIOPosition(subflow,true);
46
+ var newInput = {
47
+ type:"subflow",
48
+ direction:"in",
49
+ z:subflow.id,
50
+ i:subflow.in.length,
51
+ x:position.x,
52
+ y:position.y,
53
+ id:RED.nodes.id()
54
+ };
55
+ var oldInCount = subflow.in.length;
56
+ subflow.in.push(newInput);
57
+ subflow.dirty = true;
58
+ var wasDirty = RED.nodes.dirty();
59
+ var wasChanged = subflow.changed;
60
+ subflow.changed = true;
61
+ var result = refresh(true);
62
+ var historyEvent = {
63
+ t:'edit',
64
+ node:subflow,
65
+ dirty:wasDirty,
66
+ changed:wasChanged,
67
+ subflow: {
68
+ inputCount: oldInCount,
69
+ instances: result.instances
70
+ }
71
+ };
72
+ RED.history.push(historyEvent);
73
+ RED.view.select();
74
+ RED.nodes.dirty(true);
75
+ RED.view.redraw();
76
+ $("#workspace-subflow-input-add").addClass("active");
77
+ $("#workspace-subflow-input-remove").removeClass("active");
78
+ RED.palette.refresh();
79
+ }
80
+
81
+ function removeSubflowInput() {
82
+ var activeSubflow = RED.nodes.subflow(RED.workspaces.active());
83
+ if (activeSubflow.in.length === 0) {
84
+ return;
85
+ }
86
+ var removedInput = activeSubflow.in[0];
87
+ var removedInputLinks = [];
88
+ RED.nodes.eachLink(function(l) {
89
+ if (l.source.type == "subflow" && l.source.z == activeSubflow.id && l.source.i == removedInput.i) {
90
+ removedInputLinks.push(l);
91
+ } else if (l.target.type == "subflow:"+activeSubflow.id) {
92
+ removedInputLinks.push(l);
93
+ }
94
+ });
95
+ removedInputLinks.forEach(function(l) { RED.nodes.removeLink(l)});
96
+ activeSubflow.in = [];
97
+ $("#workspace-subflow-input-add").removeClass("active");
98
+ $("#workspace-subflow-input-remove").addClass("active");
99
+ activeSubflow.changed = true;
100
+ RED.palette.refresh();
101
+ return {subflowInputs: [ removedInput ], links:removedInputLinks};
102
+ }
103
+
104
+ function addSubflowOutput(id) {
105
+ var subflow = RED.nodes.subflow(RED.workspaces.active());
106
+ var position = findAvailableSubflowIOPosition(subflow,false);
107
+
108
+ var newOutput = {
109
+ type:"subflow",
110
+ direction:"out",
111
+ z:subflow.id,
112
+ i:subflow.out.length,
113
+ x:position.x,
114
+ y:position.y,
115
+ id:RED.nodes.id()
116
+ };
117
+ var oldOutCount = subflow.out.length;
118
+ subflow.out.push(newOutput);
119
+ subflow.dirty = true;
120
+ var wasDirty = RED.nodes.dirty();
121
+ var wasChanged = subflow.changed;
122
+ subflow.changed = true;
123
+
124
+ var result = refresh(true);
125
+
126
+ var historyEvent = {
127
+ t:'edit',
128
+ node:subflow,
129
+ dirty:wasDirty,
130
+ changed:wasChanged,
131
+ subflow: {
132
+ outputCount: oldOutCount,
133
+ instances: result.instances
134
+ }
135
+ };
136
+ RED.history.push(historyEvent);
137
+ RED.view.select();
138
+ RED.nodes.dirty(true);
139
+ RED.view.redraw();
140
+ $("#workspace-subflow-output .spinner-value").text(subflow.out.length);
141
+ RED.palette.refresh();
142
+ }
143
+
144
+ function removeSubflowOutput(removedSubflowOutputs) {
145
+ var activeSubflow = RED.nodes.subflow(RED.workspaces.active());
146
+ if (activeSubflow.out.length === 0) {
147
+ return;
148
+ }
149
+ if (typeof removedSubflowOutputs === "undefined") {
150
+ removedSubflowOutputs = [activeSubflow.out[activeSubflow.out.length-1]];
151
+ }
152
+ var removedLinks = [];
153
+ removedSubflowOutputs.sort(function(a,b) { return b.i-a.i});
154
+ for (i=0;i<removedSubflowOutputs.length;i++) {
155
+ var output = removedSubflowOutputs[i];
156
+ activeSubflow.out.splice(output.i,1);
157
+ var subflowRemovedLinks = [];
158
+ var subflowMovedLinks = [];
159
+ RED.nodes.eachLink(function(l) {
160
+ if (l.target.type == "subflow" && l.target.z == activeSubflow.id && l.target.i == output.i) {
161
+ subflowRemovedLinks.push(l);
162
+ }
163
+ if (l.source.type == "subflow:"+activeSubflow.id) {
164
+ if (l.sourcePort == output.i) {
165
+ subflowRemovedLinks.push(l);
166
+ } else if (l.sourcePort > output.i) {
167
+ subflowMovedLinks.push(l);
168
+ }
169
+ }
170
+ });
171
+ subflowRemovedLinks.forEach(function(l) { RED.nodes.removeLink(l)});
172
+ subflowMovedLinks.forEach(function(l) { l.sourcePort--; });
173
+
174
+ removedLinks = removedLinks.concat(subflowRemovedLinks);
175
+ for (var j=output.i;j<activeSubflow.out.length;j++) {
176
+ activeSubflow.out[j].i--;
177
+ activeSubflow.out[j].dirty = true;
178
+ }
179
+ }
180
+ activeSubflow.changed = true;
181
+ RED.palette.refresh();
182
+ return {subflowOutputs: removedSubflowOutputs, links: removedLinks}
183
+ }
184
+
185
+ function addSubflowStatus() {
186
+ var subflow = RED.nodes.subflow(RED.workspaces.active());
187
+ if (subflow.status) {
188
+ return;
189
+ }
190
+ var position = findAvailableSubflowIOPosition(subflow,false);
191
+ var statusNode = {
192
+ type:"subflow",
193
+ direction:"status",
194
+ z:subflow.id,
195
+ x:position.x,
196
+ y:position.y,
197
+ id:RED.nodes.id()
198
+ };
199
+ subflow.status = statusNode;
200
+ subflow.dirty = true;
201
+ var wasDirty = RED.nodes.dirty();
202
+ var wasChanged = subflow.changed;
203
+ subflow.changed = true;
204
+ var result = refresh(true);
205
+ var historyEvent = {
206
+ t:'edit',
207
+ node:subflow,
208
+ dirty:wasDirty,
209
+ changed:wasChanged,
210
+ subflow: { status: true }
211
+ };
212
+ RED.history.push(historyEvent);
213
+ RED.view.select();
214
+ RED.nodes.dirty(true);
215
+ RED.view.redraw();
216
+ $("#workspace-subflow-status").prop("checked",!!subflow.status);
217
+ $("#workspace-subflow-status").parent().parent().toggleClass("active",!!subflow.status);
218
+ }
219
+
220
+ function removeSubflowStatus() {
221
+ var subflow = RED.nodes.subflow(RED.workspaces.active());
222
+ if (!subflow.status) {
223
+ return;
224
+ }
225
+ var subflowRemovedLinks = [];
226
+ RED.nodes.eachLink(function(l) {
227
+ if (l.target.type == "subflow" && l.target.z == subflow.id && l.target.direction == "status") {
228
+ subflowRemovedLinks.push(l);
229
+ }
230
+ });
231
+ subflowRemovedLinks.forEach(function(l) { RED.nodes.removeLink(l)});
232
+ delete subflow.status;
233
+
234
+ $("#workspace-subflow-status").prop("checked",!!subflow.status);
235
+ $("#workspace-subflow-status").parent().parent().toggleClass("active",!!subflow.status);
236
+
237
+ return { links: subflowRemovedLinks }
238
+ }
239
+
240
+ function refresh(markChange) {
241
+ var activeSubflow = RED.nodes.subflow(RED.workspaces.active());
242
+ refreshToolbar(activeSubflow);
243
+ var subflowInstances = [];
244
+ if (activeSubflow) {
245
+ RED.nodes.filterNodes({type:"subflow:"+activeSubflow.id}).forEach(function(n) {
246
+ subflowInstances.push({
247
+ id: n.id,
248
+ changed: n.changed
249
+ });
250
+ if (markChange) {
251
+ n.changed = true;
252
+ }
253
+ n.inputs = activeSubflow.in.length;
254
+ n.outputs = activeSubflow.out.length;
255
+ while (n.outputs < n.ports.length) {
256
+ n.ports.pop();
257
+ }
258
+ n.resize = true;
259
+ n.dirty = true;
260
+ RED.editor.updateNodeProperties(n);
261
+ });
262
+ RED.editor.validateNode(activeSubflow);
263
+ return {
264
+ instances: subflowInstances
265
+ }
266
+ }
267
+ }
268
+
269
+ function refreshToolbar(activeSubflow) {
270
+ if (activeSubflow) {
271
+ $("#workspace-subflow-input-add").toggleClass("active", activeSubflow.in.length !== 0);
272
+ $("#workspace-subflow-input-remove").toggleClass("active",activeSubflow.in.length === 0);
273
+
274
+ $("#workspace-subflow-output .spinner-value").text(activeSubflow.out.length);
275
+
276
+ $("#workspace-subflow-status").prop("checked",!!activeSubflow.status);
277
+ $("#workspace-subflow-status").parent().parent().toggleClass("active",!!activeSubflow.status);
278
+
279
+ }
280
+ }
281
+
282
+ function showWorkspaceToolbar(activeSubflow) {
283
+ var toolbar = $("#workspace-toolbar");
284
+ toolbar.empty();
285
+
286
+ // Edit properties
287
+ $('<a class="button" id="workspace-subflow-edit" href="#" data-i18n="[append]subflow.editSubflowProperties"><i class="fa fa-pencil"></i> </a>').appendTo(toolbar);
288
+
289
+ // Inputs
290
+ $('<span style="margin-left: 5px;" data-i18n="subflow.input"></span> '+
291
+ '<div style="display: inline-block;" class="button-group">'+
292
+ '<a id="workspace-subflow-input-remove" class="button active" href="#">0</a>'+
293
+ '<a id="workspace-subflow-input-add" class="button" href="#">1</a>'+
294
+ '</div>').appendTo(toolbar);
295
+
296
+ // Outputs
297
+ $('<span style="margin-left: 5px;" data-i18n="subflow.output"></span> <div id="workspace-subflow-output" style="display: inline-block;" class="button-group spinner-group">'+
298
+ '<a id="workspace-subflow-output-remove" class="button" href="#"><i class="fa fa-minus"></i></a>'+
299
+ '<div class="spinner-value">3</div>'+
300
+ '<a id="workspace-subflow-output-add" class="button" href="#"><i class="fa fa-plus"></i></a>'+
301
+ '</div>').appendTo(toolbar);
302
+
303
+ // Status
304
+ $('<span class="button-group"><span class="button" style="padding:0"><label for="workspace-subflow-status"><input id="workspace-subflow-status" type="checkbox"> <span data-i18n="subflow.status"></span></label></span></span>').appendTo(toolbar);
305
+
306
+ // $('<a class="button disabled" id="workspace-subflow-add-input" href="#" data-i18n="[append]subflow.input"><i class="fa fa-plus"></i> </a>').appendTo(toolbar);
307
+ // $('<a class="button" id="workspace-subflow-add-output" href="#" data-i18n="[append]subflow.output"><i class="fa fa-plus"></i> </a>').appendTo(toolbar);
308
+
309
+ // Delete
310
+ $('<a class="button" id="workspace-subflow-delete" href="#" data-i18n="[append]subflow.deleteSubflow"><i class="fa fa-trash"></i> </a>').appendTo(toolbar);
311
+
312
+ toolbar.i18n();
313
+
314
+
315
+ $("#workspace-subflow-output-remove").click(function(event) {
316
+ event.preventDefault();
317
+ var wasDirty = RED.nodes.dirty();
318
+ var wasChanged = activeSubflow.changed;
319
+ var result = removeSubflowOutput();
320
+ if (result) {
321
+ var inst = refresh(true);
322
+ RED.history.push({
323
+ t:'delete',
324
+ links:result.links,
325
+ subflowOutputs: result.subflowOutputs,
326
+ changed: wasChanged,
327
+ dirty:wasDirty,
328
+ subflow: {
329
+ instances: inst.instances
330
+ }
331
+ });
332
+
333
+ RED.view.select();
334
+ RED.nodes.dirty(true);
335
+ RED.view.redraw(true);
336
+ }
337
+ });
338
+
339
+ $("#workspace-subflow-output-add").click(function(event) {
340
+ event.preventDefault();
341
+ addSubflowOutput();
342
+ });
343
+
344
+ $("#workspace-subflow-input-add").click(function(event) {
345
+ event.preventDefault();
346
+ addSubflowInput();
347
+ });
348
+
349
+ $("#workspace-subflow-input-remove").click(function(event) {
350
+ event.preventDefault();
351
+ var wasDirty = RED.nodes.dirty();
352
+ var wasChanged = activeSubflow.changed;
353
+ activeSubflow.changed = true;
354
+ var result = removeSubflowInput();
355
+ if (result) {
356
+ var inst = refresh(true);
357
+ RED.history.push({
358
+ t:'delete',
359
+ links:result.links,
360
+ changed: wasChanged,
361
+ subflowInputs: result.subflowInputs,
362
+ dirty:wasDirty,
363
+ subflow: {
364
+ instances: inst.instances
365
+ }
366
+ });
367
+ RED.view.select();
368
+ RED.nodes.dirty(true);
369
+ RED.view.redraw(true);
370
+ }
371
+ });
372
+
373
+ $("#workspace-subflow-status").change(function(evt) {
374
+ if (this.checked) {
375
+ addSubflowStatus();
376
+ } else {
377
+ var currentStatus = activeSubflow.status;
378
+ var wasChanged = activeSubflow.changed;
379
+ var result = removeSubflowStatus();
380
+ if (result) {
381
+ activeSubflow.changed = true;
382
+ var wasDirty = RED.nodes.dirty();
383
+ RED.history.push({
384
+ t:'delete',
385
+ links:result.links,
386
+ changed: wasChanged,
387
+ dirty:wasDirty,
388
+ subflow: {
389
+ id: activeSubflow.id,
390
+ status: currentStatus
391
+ }
392
+ });
393
+ RED.view.select();
394
+ RED.nodes.dirty(true);
395
+ RED.view.redraw();
396
+ }
397
+ }
398
+ })
399
+
400
+ $("#workspace-subflow-edit").click(function(event) {
401
+ RED.editor.editSubflow(RED.nodes.subflow(RED.workspaces.active()));
402
+ event.preventDefault();
403
+ });
404
+
405
+ $("#workspace-subflow-delete").click(function(event) {
406
+ event.preventDefault();
407
+ var startDirty = RED.nodes.dirty();
408
+ var historyEvent = removeSubflow(RED.workspaces.active());
409
+ historyEvent.t = 'delete';
410
+ historyEvent.dirty = startDirty;
411
+
412
+ RED.history.push(historyEvent);
413
+
414
+ });
415
+
416
+ refreshToolbar(activeSubflow);
417
+
418
+ $("#chart").css({"margin-top": "40px"});
419
+ $("#workspace-toolbar").show();
420
+ }
421
+
422
+ function hideWorkspaceToolbar() {
423
+ $("#workspace-toolbar").hide().empty();
424
+ $("#chart").css({"margin-top": "0"});
425
+ }
426
+
427
+ function removeSubflow(id) {
428
+ var removedNodes = [];
429
+ var removedLinks = [];
430
+
431
+ var activeSubflow = RED.nodes.subflow(id);
432
+
433
+ RED.nodes.eachNode(function(n) {
434
+ if (n.type == "subflow:"+activeSubflow.id) {
435
+ removedNodes.push(n);
436
+ }
437
+ if (n.z == activeSubflow.id) {
438
+ removedNodes.push(n);
439
+ }
440
+ });
441
+ RED.nodes.eachConfig(function(n) {
442
+ if (n.z == activeSubflow.id) {
443
+ removedNodes.push(n);
444
+ }
445
+ });
446
+
447
+ var removedConfigNodes = [];
448
+ for (var i=0;i<removedNodes.length;i++) {
449
+ var removedEntities = RED.nodes.remove(removedNodes[i].id);
450
+ removedLinks = removedLinks.concat(removedEntities.links);
451
+ removedConfigNodes = removedConfigNodes.concat(removedEntities.nodes);
452
+ }
453
+ // TODO: this whole delete logic should be in RED.nodes.removeSubflow..
454
+ removedNodes = removedNodes.concat(removedConfigNodes);
455
+
456
+ RED.nodes.removeSubflow(activeSubflow);
457
+ RED.workspaces.remove(activeSubflow);
458
+ RED.nodes.dirty(true);
459
+ RED.view.redraw();
460
+
461
+ return {
462
+ nodes:removedNodes,
463
+ links:removedLinks,
464
+ subflows: [activeSubflow]
465
+ }
466
+ }
467
+
468
+ function init() {
469
+ RED.events.on("workspace:change",function(event) {
470
+ var activeSubflow = RED.nodes.subflow(event.workspace);
471
+ if (activeSubflow) {
472
+ showWorkspaceToolbar(activeSubflow);
473
+ } else {
474
+ hideWorkspaceToolbar();
475
+ }
476
+ });
477
+ RED.events.on("view:selection-changed",function(selection) {
478
+ if (!selection.nodes) {
479
+ RED.menu.setDisabled("menu-item-subflow-convert",true);
480
+ } else {
481
+ RED.menu.setDisabled("menu-item-subflow-convert",false);
482
+ }
483
+ });
484
+
485
+ RED.actions.add("core:create-subflow",createSubflow);
486
+ RED.actions.add("core:convert-to-subflow",convertToSubflow);
487
+
488
+ $(_subflowEditTemplate).appendTo(document.body);
489
+ $(_subflowTemplateEditTemplate).appendTo(document.body);
490
+
491
+ }
492
+
493
+ function createSubflow() {
494
+ var lastIndex = 0;
495
+ RED.nodes.eachSubflow(function(sf) {
496
+ var m = (new RegExp("^Subflow (\\d+)$")).exec(sf.name);
497
+ if (m) {
498
+ lastIndex = Math.max(lastIndex,m[1]);
499
+ }
500
+ });
501
+
502
+ var name = "Subflow "+(lastIndex+1);
503
+
504
+ var subflowId = RED.nodes.id();
505
+ var subflow = {
506
+ type:"subflow",
507
+ id:subflowId,
508
+ name:name,
509
+ info:"",
510
+ in: [],
511
+ out: []
512
+ };
513
+ RED.nodes.addSubflow(subflow);
514
+ RED.history.push({
515
+ t:'createSubflow',
516
+ subflow: {
517
+ subflow:subflow
518
+ },
519
+ dirty:RED.nodes.dirty()
520
+ });
521
+ RED.workspaces.show(subflowId);
522
+ RED.nodes.dirty(true);
523
+ }
524
+
525
+ function snapToGrid(x) {
526
+ if (RED.settings.get("editor").view['view-snap-grid']) {
527
+ x = Math.round(x / RED.view.gridSize()) * RED.view.gridSize();
528
+ }
529
+ return x;
530
+ }
531
+
532
+ function convertToSubflow() {
533
+ var selection = RED.view.selection();
534
+ if (!selection.nodes) {
535
+ RED.notify(RED._("subflow.errors.noNodesSelected"),"error");
536
+ return;
537
+ }
538
+ var i,n;
539
+ var nodes = {};
540
+ var new_links = [];
541
+ var removedLinks = [];
542
+
543
+ var candidateInputs = [];
544
+ var candidateOutputs = [];
545
+ var candidateInputNodes = {};
546
+
547
+ var boundingBox = [selection.nodes[0].x,
548
+ selection.nodes[0].y,
549
+ selection.nodes[0].x,
550
+ selection.nodes[0].y];
551
+
552
+ for (i=0;i<selection.nodes.length;i++) {
553
+ n = selection.nodes[i];
554
+ nodes[n.id] = {n:n,outputs:{}};
555
+ boundingBox = [
556
+ Math.min(boundingBox[0],n.x),
557
+ Math.min(boundingBox[1],n.y),
558
+ Math.max(boundingBox[2],n.x),
559
+ Math.max(boundingBox[3],n.y)
560
+ ]
561
+ }
562
+ var offsetX = snapToGrid(boundingBox[0] - 200);
563
+ var offsetY = snapToGrid(boundingBox[1] - 80);
564
+
565
+
566
+ var center = [
567
+ snapToGrid((boundingBox[2]+boundingBox[0]) / 2),
568
+ snapToGrid((boundingBox[3]+boundingBox[1]) / 2)
569
+ ];
570
+
571
+ RED.nodes.eachLink(function(link) {
572
+ if (nodes[link.source.id] && nodes[link.target.id]) {
573
+ // A link wholely within the selection
574
+ }
575
+
576
+ if (nodes[link.source.id] && !nodes[link.target.id]) {
577
+ // An outbound link from the selection
578
+ candidateOutputs.push(link);
579
+ removedLinks.push(link);
580
+ }
581
+ if (!nodes[link.source.id] && nodes[link.target.id]) {
582
+ // An inbound link
583
+ candidateInputs.push(link);
584
+ candidateInputNodes[link.target.id] = link.target;
585
+ removedLinks.push(link);
586
+ }
587
+ });
588
+
589
+ var outputs = {};
590
+ candidateOutputs = candidateOutputs.filter(function(v) {
591
+ if (outputs[v.source.id+":"+v.sourcePort]) {
592
+ outputs[v.source.id+":"+v.sourcePort].targets.push(v.target);
593
+ return false;
594
+ }
595
+ v.targets = [];
596
+ v.targets.push(v.target);
597
+ outputs[v.source.id+":"+v.sourcePort] = v;
598
+ return true;
599
+ });
600
+ candidateOutputs.sort(function(a,b) { return a.source.y-b.source.y});
601
+
602
+ if (Object.keys(candidateInputNodes).length > 1) {
603
+ RED.notify(RED._("subflow.errors.multipleInputsToSelection"),"error");
604
+ return;
605
+ }
606
+
607
+ var lastIndex = 0;
608
+ RED.nodes.eachSubflow(function(sf) {
609
+ var m = (new RegExp("^Subflow (\\d+)$")).exec(sf.name);
610
+ if (m) {
611
+ lastIndex = Math.max(lastIndex,m[1]);
612
+ }
613
+ });
614
+
615
+ var name = "Subflow "+(lastIndex+1);
616
+
617
+ var subflowId = RED.nodes.id();
618
+ var subflow = {
619
+ type:"subflow",
620
+ id:subflowId,
621
+ name:name,
622
+ info:"",
623
+ in: Object.keys(candidateInputNodes).map(function(v,i) { var index = i; return {
624
+ type:"subflow",
625
+ direction:"in",
626
+ x:snapToGrid(candidateInputNodes[v].x-(candidateInputNodes[v].w/2)-80 - offsetX),
627
+ y:snapToGrid(candidateInputNodes[v].y - offsetY),
628
+ z:subflowId,
629
+ i:index,
630
+ id:RED.nodes.id(),
631
+ wires:[{id:candidateInputNodes[v].id}]
632
+ }}),
633
+ out: candidateOutputs.map(function(v,i) { var index = i; return {
634
+ type:"subflow",
635
+ direction:"out",
636
+ x:snapToGrid(v.source.x+(v.source.w/2)+80 - offsetX),
637
+ y:snapToGrid(v.source.y - offsetY),
638
+ z:subflowId,
639
+ i:index,
640
+ id:RED.nodes.id(),
641
+ wires:[{id:v.source.id,port:v.sourcePort}]
642
+ }})
643
+ };
644
+
645
+ RED.nodes.addSubflow(subflow);
646
+
647
+ var subflowInstance = {
648
+ id:RED.nodes.id(),
649
+ type:"subflow:"+subflow.id,
650
+ x: center[0],
651
+ y: center[1],
652
+ z: RED.workspaces.active(),
653
+ inputs: subflow.in.length,
654
+ outputs: subflow.out.length,
655
+ h: Math.max(30/*node_height*/,(subflow.out.length||0) * 15),
656
+ changed:true
657
+ }
658
+ subflowInstance._def = RED.nodes.getType(subflowInstance.type);
659
+ RED.editor.validateNode(subflowInstance);
660
+ RED.nodes.add(subflowInstance);
661
+
662
+ candidateInputs.forEach(function(l) {
663
+ var link = {source:l.source, sourcePort:l.sourcePort, target: subflowInstance};
664
+ new_links.push(link);
665
+ RED.nodes.addLink(link);
666
+ });
667
+
668
+ candidateOutputs.forEach(function(output,i) {
669
+ output.targets.forEach(function(target) {
670
+ var link = {source:subflowInstance, sourcePort:i, target: target};
671
+ new_links.push(link);
672
+ RED.nodes.addLink(link);
673
+ });
674
+ });
675
+
676
+ subflow.in.forEach(function(input) {
677
+ input.wires.forEach(function(wire) {
678
+ var link = {source: input, sourcePort: 0, target: RED.nodes.node(wire.id) }
679
+ new_links.push(link);
680
+ RED.nodes.addLink(link);
681
+ });
682
+ });
683
+ subflow.out.forEach(function(output,i) {
684
+ output.wires.forEach(function(wire) {
685
+ var link = {source: RED.nodes.node(wire.id), sourcePort: wire.port , target: output }
686
+ new_links.push(link);
687
+ RED.nodes.addLink(link);
688
+ });
689
+ });
690
+
691
+ for (i=0;i<removedLinks.length;i++) {
692
+ RED.nodes.removeLink(removedLinks[i]);
693
+ }
694
+
695
+ for (i=0;i<selection.nodes.length;i++) {
696
+ n = selection.nodes[i];
697
+ if (/^link /.test(n.type)) {
698
+ n.links = n.links.filter(function(id) {
699
+ var isLocalLink = nodes.hasOwnProperty(id);
700
+ if (!isLocalLink) {
701
+ var otherNode = RED.nodes.node(id);
702
+ if (otherNode && otherNode.links) {
703
+ var i = otherNode.links.indexOf(n.id);
704
+ if (i > -1) {
705
+ otherNode.links.splice(i,1);
706
+ }
707
+ }
708
+ }
709
+ return isLocalLink;
710
+ });
711
+ }
712
+ n.x -= offsetX;
713
+ n.y -= offsetY;
714
+ n.z = subflow.id;
715
+ }
716
+
717
+ RED.history.push({
718
+ t:'createSubflow',
719
+ nodes:[subflowInstance.id],
720
+ links:new_links,
721
+ subflow: {
722
+ subflow: subflow,
723
+ offsetX: offsetX,
724
+ offsetY: offsetY
725
+ },
726
+
727
+ activeWorkspace: RED.workspaces.active(),
728
+ removedLinks: removedLinks,
729
+
730
+ dirty:RED.nodes.dirty()
731
+ });
732
+ RED.view.select(null);
733
+ RED.editor.validateNode(subflow);
734
+ RED.nodes.dirty(true);
735
+ RED.view.redraw(true);
736
+ }
737
+
738
+ return {
739
+ init: init,
740
+ createSubflow: createSubflow,
741
+ convertToSubflow: convertToSubflow,
742
+ removeSubflow: removeSubflow,
743
+ refresh: refresh,
744
+ removeInput: removeSubflowInput,
745
+ removeOutput: removeSubflowOutput,
746
+ removeStatus: removeSubflowStatus
747
+ }
748
+ })();