Compare commits

..

1 Commits

Author SHA1 Message Date
Dave Conway-Jones
746512b8b8 Remove sentiment from core
(moved to node-red-nodes)
2018-06-14 20:44:17 +01:00
1205 changed files with 42065 additions and 106381 deletions

1
.gitattributes vendored
View File

@@ -1 +0,0 @@
/packages/node_modules/** linguist-generated=false

View File

@@ -28,8 +28,7 @@ To help us understand the issue, please fill-in as much of the following informa
### Please tell us about your environment: ### Please tell us about your environment:
- [ ] Node-RED version: - [ ] Node-RED version:
- [ ] Node.js version: - [ ] node.js version:
- [ ] npm version: - [ ] npm version:
- [ ] Platform/OS: - [ ] Platform/OS:
- [ ] Browser: - [ ] Browser:
- [ ] running in Docker:

View File

@@ -1,39 +0,0 @@
---
name: Bug report
about: Reproducible software issues in the core of Node-RED
title: ''
labels: ''
assignees: ''
---
<!--
This issue tracker is for problems with the Node-RED runtime, the editor or the core nodes.
If your issue is:
- a general 'how-to' type question,
- a feature request or suggestion for a change,
- or problems with 3rd party (`node-red-contrib-`) nodes
please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack).
You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
That way the whole Node-RED user community can help, rather than rely on the core development team.
To help us understand the issue, please fill-in as much of the following information as you can:
-->
### What are the steps to reproduce?
### What happens?
### What do you expect to happen?
### Please tell us about your environment:
- [ ] Node-RED version:
- [ ] Node.js version:
- [ ] npm version:
- [ ] Platform/OS:
- [ ] Browser:

View File

@@ -1,17 +0,0 @@
---
name: Anything Else
about: Something that is not a bug report
title: ''
labels: ''
assignees: ''
---
Please DO NOT raise an issue.
We DO NOT use the issue tracker for general support or feature requests. Only bug reports should be raised here using the 'Bug report' template.
For general support, please use the [Node-RED Forum](https://discourse.nodered.org) or [slack team](https://nodered.org/slack). You could also consider asking a question on [Stack Overflow](https://stackoverflow.com/questions/tagged/node-red) and tag it `node-red`.
That way the whole Node-RED user community can help, rather than rely on the core development team.
For feature requests, please use the Node-RED Forum](https://discourse.nodered.org). Many ideas have already been discussed there and you should search that for your request before starting a new discussion.

View File

@@ -29,6 +29,6 @@ the [forum](https://discourse.nodered.org) or
<!-- Put an `x` in the boxes that apply --> <!-- Put an `x` in the boxes that apply -->
- [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md) - [ ] I have read the [contribution guidelines](https://github.com/node-red/node-red/blob/master/CONTRIBUTING.md)
- [ ] For non-bugfix PRs, I have discussed this change on the forum/slack team. - [ ] For non-bugfix PRs, I have discussed this change on the mailing list/slack team.
- [ ] I have run `grunt` to verify the unit tests pass - [ ] I have run `grunt` to verify the unit tests pass
- [ ] I have added suitable unit tests to cover the new/changed functionality - [ ] I have added suitable unit tests to cover the new/changed functionality

View File

@@ -1,29 +0,0 @@
const fs = require("fs");
const newVersion = require("../../package.json").version;
if (process.env.GITHUB_REF !== "refs/tags/"+newVersion) {
console.log(`GITHUB_REF doesn't match the package.json version: ${process.env.GITHUB_REF} !== ${newVersion}`);
process.exit(0);
}
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
console.log(`Not updating for a non-stable release - ${newVersion}`);
process.exit(0);
}
const currentVersion = require("../../../node-red-docker/package.json").version;
console.log(`Update from ${currentVersion} to ${newVersion}`)
updateFile(__dirname+"/../../../node-red-docker/package.json", currentVersion, newVersion);
updateFile(__dirname+"/../../../node-red-docker/docker-custom/package.json", currentVersion, newVersion);
updateFile(__dirname+"/../../../node-red-docker/README.md", currentVersion, newVersion);
console.log(`::set-env name=newVersion::${newVersion}`);
function updateFile(path,from,to) {
let contents = fs.readFileSync(path,"utf8");
contents = contents.replace(new RegExp(from.replace(/\./g,"\\."),"g"), to);
fs.writeFileSync(path, contents);
}

View File

@@ -1,18 +0,0 @@
const fs = require("fs");
const newVersion = require("../../package.json").version;
if (process.env.GITHUB_REF !== "refs/tags/"+newVersion) {
console.log(`GITHUB_REF doesn't match the package.json version: ${process.env.GITHUB_REF} !== ${newVersion}`);
process.exit(0);
}
if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
console.log(`Not updating for a non-stable release - ${newVersion}`);
process.exit(0);
}
const path = __dirname+"/../../../node-red.github.io/index.html";
let contents = fs.readFileSync(path, "utf8");
contents = contents.replace(/<span class="node-red-latest-version">v\d+\.\d+\.\d+<\/span>/, `<span class="node-red-latest-version">v${newVersion}<\/span>` );
fs.writeFileSync(path, contents);

View File

@@ -1,59 +0,0 @@
name: PublishDockerImage
env:
ACTIONS_ALLOW_UNSECURE_COMMANDS: true
on:
release:
types: [published]
jobs:
generate:
name: 'Update node-red-docker image'
runs-on: ubuntu-latest
steps:
- name: Check out node-red repository
uses: actions/checkout@v2
with:
path: 'node-red'
- name: Check out node-red-docker repository
uses: actions/checkout@v2
with:
repository: 'node-red/node-red-docker'
path: 'node-red-docker'
- name: Check out node-red.github.io repository
uses: actions/checkout@v2
with:
repository: 'node-red/node-red.github.io'
path: 'node-red.github.io'
- uses: actions/setup-node@v1
with:
node-version: '12'
- run: node ./node-red/.github/scripts/update-node-red-docker.js
- name: Create Docker Pull Request
uses: peter-evans/create-pull-request@v2
with:
token: ${{ secrets.NR_REPO_TOKEN }}
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
path: 'node-red-docker'
commit-message: 'Bump to ${{ env.newVersion }}'
title: '🚀 Update to Node-RED ${{ env.newVersion }} release'
body: |
Updates the Node-RED Docker repo for the ${{ env.newVersion }} release.
Once this is merged, you will need to create a new release with the tag `v${{ env.newVersion }}`.
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary
- run: node ./node-red/.github/scripts/update-node-red-website.js
- name: Create Website Pull Request
uses: peter-evans/create-pull-request@v2
with:
token: ${{ secrets.NR_REPO_TOKEN }}
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
path: 'node-red.github.io'
commit-message: 'Bump to ${{ env.newVersion }}'
title: '🚀 Update to Node-RED ${{ env.newVersion }} release'
body: |
Updates the Node-RED Website repo for the ${{ env.newVersion }} release.
This PR was auto-generated by a GitHub Action. Any questions, speak to @knolleary

7
.gitignore vendored
View File

@@ -17,10 +17,3 @@ node_modules
public public
locales/zz-ZZ locales/zz-ZZ
nodes/core/locales/zz-ZZ nodes/core/locales/zz-ZZ
!packages/node_modules
packages/node_modules/@node-red/editor-client/public
!test/**/node_modules
docs
!packages/node_modules/**/docs
.vscode
.nyc_output

View File

@@ -1,4 +1,5 @@
/Gruntfile.js /Gruntfile.js
/.git/* /.git/*
/lib/*
*.backup *.backup
/public/* /public/*

7
.npmignore Normal file
View File

@@ -0,0 +1,7 @@
.settings
.jshintignore
.jshintrc
.project
.tern-project
.travis.yml
.git

View File

@@ -1,21 +1,12 @@
sudo: false sudo: false
addons:
chrome: stable
language: node_js language: node_js
matrix: matrix:
include: include:
- node_js: "14"
script:
- ./node_modules/.bin/grunt && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
# - scripts/install-ui-test-dependencies.sh && grunt test-ui
before_script:
- npm install -g coveralls
- node_js: "12"
script:
- ./node_modules/.bin/grunt no-coverage
- node_js: "10" - node_js: "10"
script: script:
- ./node_modules/.bin/grunt no-coverage - ./node_modules/.bin/grunt && istanbul report text && ( cat coverage/lcov.info | $(npm get prefix)/bin/coveralls || true ) && rm -rf coverage
before_script:
- npm install -g istanbul coveralls
- node_js: "8" - node_js: "8"
script: - node_js: "6"
- ./node_modules/.bin/grunt no-coverage - node_js: "4"

15
API.md
View File

@@ -1,15 +0,0 @@
Node-RED Modules
---
Node-RED provides a set of node modules that implement different parts of the
application.
Module | Description
-------|-------
[node-red](node-red.html) | the main module that pulls together all of the internal modules and provides the executable version of Node-RED
[@node-red/editor-api](@node-red_editor-api.html) | an Express application that serves the Node-RED editor and provides the Admin HTTP API
[@node-red/runtime](@node-red_runtime.html) | the core runtime of Node-RED
[@node-red/util](@node-red_util.html) | common utilities for the Node-RED runtime and editor modules
@node-red/registry | the internal node registry
@node-red/nodes | the default set of core nodes
@node-red/editor-client | the client-side resources of the Node-RED editor application

File diff suppressed because it is too large Load Diff

View File

@@ -26,7 +26,7 @@ relevant nodes, press Ctrl-E and copy the flow data from the Export dialog.
At a minimum, please include: At a minimum, please include:
- Version of Node-RED - either release number if you downloaded a zip, or the first few lines of `git log` if you are cloning the repository directly. - Version of Node-RED - either release number if you downloaded a zip, or the first few lines of `git log` if you are cloning the repository directly.
- Version of Node.js - what does `node -v` say? - Version of node.js - what does `node -v` say?
## Feature requests ## Feature requests

View File

@@ -15,31 +15,15 @@
**/ **/
var path = require("path"); var path = require("path");
var fs = require("fs-extra");
var sass = require("node-sass");
module.exports = function(grunt) { module.exports = function(grunt) {
var nodemonArgs = ["-V"]; var nodemonArgs = ["-v"];
var flowFile = grunt.option('flowFile'); var flowFile = grunt.option('flowFile');
if (flowFile) { if (flowFile) {
nodemonArgs.push(flowFile); nodemonArgs.push(flowFile);
process.env.NODE_RED_ENABLE_PROJECTS=false;
}
var userDir = grunt.option('userDir');
if (userDir) {
nodemonArgs.push("-u");
nodemonArgs.push(userDir);
} }
var browserstack = grunt.option('browserstack');
if (browserstack) {
process.env.BROWSERSTACK = true;
}
var nonHeadless = grunt.option('non-headless');
if (nonHeadless) {
process.env.NODE_RED_NON_HEADLESS = true;
}
grunt.initConfig({ grunt.initConfig({
pkg: grunt.file.readJSON('package.json'), pkg: grunt.file.readJSON('package.json'),
paths: { paths: {
@@ -53,8 +37,8 @@ module.exports = function(grunt) {
ui: 'bdd', ui: 'bdd',
reporter: 'spec' reporter: 'spec'
}, },
all: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js","test/nodes/**/*_spec.js"] }, all: { src: ['test/**/*_spec.js'] },
core: { src: ["test/unit/_spec.js","test/unit/**/*_spec.js"]}, core: { src: ["test/_spec.js","test/red/**/*_spec.js"]},
nodes: { src: ["test/nodes/**/*_spec.js"]} nodes: { src: ["test/nodes/**/*_spec.js"]}
}, },
webdriver: { webdriver: {
@@ -62,19 +46,18 @@ module.exports = function(grunt) {
configFile: 'test/editor/wdio.conf.js' configFile: 'test/editor/wdio.conf.js'
} }
}, },
nyc: { mocha_istanbul: {
options: { options: {
cwd: '.', globals: ['expect'],
include: ['packages/node_modules/**'], timeout: 3000,
excludeNodeModules: false, ignoreLeaks: false,
exclude: ['packages/node_modules/@node-red/editor-client/**'], ui: 'bdd',
reporter: ['lcov', 'html','text-summary'], reportFormats: ['lcov','html'],
reportDir: 'coverage', print: 'both'
all: true
}, },
all: { cmd: false, args: ['grunt', 'simplemocha:all'] }, all: { src: ["test/_spec.js","test/red/**/*_spec.js","test/nodes/**/*_spec.js"] },
core: { options: { exclude:['packages/node_modules/@node-red/editor-client/**', 'packages/node_modules/@node-red/nodes/**']},cmd: false, args: ['grunt', 'simplemocha:core'] }, core: { src: ["test/_spec.js","test/red/**/*_spec.js"]},
nodes: { cmd: false, args: ['grunt', 'simplemocha:nodes'] } nodes: { src: ["test/nodes/**/*_spec.js"]}
}, },
jshint: { jshint: {
options: { options: {
@@ -90,20 +73,22 @@ module.exports = function(grunt) {
//"loopfunc": true, // allow functions to be defined in loops //"loopfunc": true, // allow functions to be defined in loops
//"sub": true // don't warn that foo['bar'] should be written as foo.bar //"sub": true // don't warn that foo['bar'] should be written as foo.bar
}, },
// all: [ all: [
// 'Gruntfile.js', 'Gruntfile.js',
// 'red.js', 'red.js',
// 'packages/**/*.js' 'red/**/*.js',
// ], 'nodes/core/*/*.js',
// core: { 'editor/js/**/*.js'
// files: { ],
// src: [ core: {
// 'Gruntfile.js', files: {
// 'red.js', src: [
// 'packages/**/*.js', 'Gruntfile.js',
// ] 'red.js',
// } 'red/**/*.js'
// }, ]
}
},
nodes: { nodes: {
files: { files: {
src: [ 'nodes/core/*/*.js' ] src: [ 'nodes/core/*/*.js' ]
@@ -111,7 +96,7 @@ module.exports = function(grunt) {
}, },
editor: { editor: {
files: { files: {
src: [ 'packages/node_modules/@node-red/editor-client/src/js/**/*.js' ] src: [ 'editor/js/**/*.js' ]
} }
}, },
tests: { tests: {
@@ -131,95 +116,79 @@ module.exports = function(grunt) {
src: [ src: [
// Ensure editor source files are concatenated in // Ensure editor source files are concatenated in
// the right order // the right order
"packages/node_modules/@node-red/editor-client/src/js/polyfills.js", "editor/js/red.js",
"packages/node_modules/@node-red/editor-client/src/js/jquery-addons.js", "editor/js/events.js",
"packages/node_modules/@node-red/editor-client/src/js/red.js", "editor/js/i18n.js",
"packages/node_modules/@node-red/editor-client/src/js/events.js", "editor/js/settings.js",
"packages/node_modules/@node-red/editor-client/src/js/i18n.js", "editor/js/user.js",
"packages/node_modules/@node-red/editor-client/src/js/settings.js", "editor/js/comms.js",
"packages/node_modules/@node-red/editor-client/src/js/user.js", "editor/js/text/bidi.js",
"packages/node_modules/@node-red/editor-client/src/js/comms.js", "editor/js/text/format.js",
"packages/node_modules/@node-red/editor-client/src/js/text/bidi.js", "editor/js/ui/state.js",
"packages/node_modules/@node-red/editor-client/src/js/text/format.js", "editor/js/nodes.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/state.js", "editor/js/history.js",
"packages/node_modules/@node-red/editor-client/src/js/nodes.js", "editor/js/validators.js",
"packages/node_modules/@node-red/editor-client/src/js/font-awesome.js", "editor/js/ui/utils.js",
"packages/node_modules/@node-red/editor-client/src/js/history.js", "editor/js/ui/common/editableList.js",
"packages/node_modules/@node-red/editor-client/src/js/validators.js", "editor/js/ui/common/checkboxSet.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/utils.js", "editor/js/ui/common/menu.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/editableList.js", "editor/js/ui/common/panels.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js", "editor/js/ui/common/popover.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/checkboxSet.js", "editor/js/ui/common/searchBox.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js", "editor/js/ui/common/tabs.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/panels.js", "editor/js/ui/common/stack.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/popover.js", "editor/js/ui/common/typedInput.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/searchBox.js", "editor/js/ui/actions.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js", "editor/js/ui/deploy.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/stack.js", "editor/js/ui/diff.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/typedInput.js", "editor/js/ui/keyboard.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/toggleButton.js", "editor/js/ui/workspaces.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/common/colorPicker.js", "editor/js/ui/view.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/actions.js", "editor/js/ui/view-navigator.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js", "editor/js/ui/sidebar.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/diff.js", "editor/js/ui/palette.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js", "editor/js/ui/tab-info.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js", "editor/js/ui/tab-config.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js", "editor/js/ui/palette-editor.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/view.js", "editor/js/ui/editor.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js", "editor/js/ui/tray.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js", "editor/js/ui/clipboard.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js", "editor/js/ui/library.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/palette.js", "editor/js/ui/notifications.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js", "editor/js/ui/search.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js", "editor/js/ui/typeSearch.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-help.js", "editor/js/ui/subflow.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js", "editor/js/ui/userSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/tab-context.js", "editor/js/ui/projects/projects.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js", "editor/js/ui/projects/projectSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/editor.js", "editor/js/ui/projects/projectUserSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/editors/*.js", "editor/js/ui/projects/tab-versionControl.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/event-log.js", "editor/js/ui/touch/radialMenu.js"
"packages/node_modules/@node-red/editor-client/src/js/ui/tray.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/clipboard.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/library.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/search.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/typeSearch.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/group.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projects.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectUserSettings.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/projects/tab-versionControl.js",
"packages/node_modules/@node-red/editor-client/src/js/ui/touch/radialMenu.js"
], ],
dest: "packages/node_modules/@node-red/editor-client/public/red/red.js" dest: "public/red/red.js"
}, },
vendor: { vendor: {
files: { files: {
"packages/node_modules/@node-red/editor-client/public/vendor/vendor.js": [ "public/vendor/vendor.js": [
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-3.5.1.min.js", "editor/vendor/jquery/js/jquery-1.11.3.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-migrate-3.3.0.min.js", "editor/vendor/bootstrap/js/bootstrap.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery-ui.min.js", "editor/vendor/jquery/js/jquery-ui-1.10.3.custom.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/jquery/js/jquery.ui.touch-punch.min.js", "editor/vendor/jquery/js/jquery.ui.touch-punch.min.js",
"node_modules/marked/marked.min.js", "editor/vendor/marked/marked.min.js",
"node_modules/dompurify/dist/purify.min.js", "editor/vendor/d3/d3.v3.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/d3/d3.v3.min.js", "editor/vendor/i18next/i18next.min.js"
"packages/node_modules/@node-red/editor-client/src/vendor/i18next/i18next.min.js",
"node_modules/jsonata/jsonata-es5.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/formatter.js",
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ace.js",
"packages/node_modules/@node-red/editor-client/src/vendor/ace/ext-language_tools.js",
], ],
// "packages/node_modules/@node-red/editor-client/public/vendor/vendor.css": [ "public/vendor/vendor.css": [
// // TODO: resolve relative resource paths in // TODO: resolve relative resource paths in
// // bootstrap/FA/jquery // bootstrap/FA/jquery
// ], ],
"packages/node_modules/@node-red/editor-client/public/vendor/ace/worker-jsonata.js": [ "public/vendor/jsonata/jsonata.min.js": [
"node_modules/jsonata/jsonata-es5.min.js", "node_modules/jsonata/jsonata-es5.min.js",
"packages/node_modules/@node-red/editor-client/src/vendor/jsonata/worker-jsonata.js" "editor/vendor/jsonata/formatter.js"
],
"public/vendor/ace/worker-jsonata.js": [
"node_modules/jsonata/jsonata-es5.min.js",
"editor/vendor/jsonata/worker-jsonata.js"
] ]
} }
} }
@@ -227,60 +196,63 @@ module.exports = function(grunt) {
uglify: { uglify: {
build: { build: {
files: { files: {
'packages/node_modules/@node-red/editor-client/public/red/red.min.js': 'packages/node_modules/@node-red/editor-client/public/red/red.js', 'public/red/red.min.js': 'public/red/red.js',
'packages/node_modules/@node-red/editor-client/public/red/main.min.js': 'packages/node_modules/@node-red/editor-client/public/red/main.js', 'public/red/main.min.js': 'public/red/main.js',
'packages/node_modules/@node-red/editor-client/public/vendor/ace/mode-jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/mode-jsonata.js', 'public/vendor/ace/mode-jsonata.js': 'editor/vendor/jsonata/mode-jsonata.js',
'packages/node_modules/@node-red/editor-client/public/vendor/ace/snippets/jsonata.js': 'packages/node_modules/@node-red/editor-client/src/vendor/jsonata/snippets-jsonata.js' 'public/vendor/ace/snippets/jsonata.js': 'editor/vendor/jsonata/snippets-jsonata.js'
} }
} }
}, },
sass: { sass: {
build: { build: {
options: { options: {
implementation: sass,
outputStyle: 'compressed' outputStyle: 'compressed'
}, },
files: [{ files: [{
dest: 'packages/node_modules/@node-red/editor-client/public/red/style.min.css', dest: 'public/red/style.min.css',
src: 'packages/node_modules/@node-red/editor-client/src/sass/style.scss' src: 'editor/sass/style.scss'
},
{
dest: 'public/vendor/bootstrap/css/bootstrap.min.css',
src: 'editor/vendor/bootstrap/css/bootstrap.css'
}] }]
} }
}, },
jsonlint: { jsonlint: {
messages: { messages: {
src: [ src: [
'packages/node_modules/@node-red/nodes/locales/**/*.json', 'nodes/core/locales/en-US/messages.json',
'packages/node_modules/@node-red/editor-client/locales/**/*.json', 'red/api/locales/en-US/editor.json',
'packages/node_modules/@node-red/runtime/locales/**/*.json' 'red/runtime/locales/en-US/runtime.json'
] ]
}, },
keymaps: { keymaps: {
src: [ src: [
'packages/node_modules/@node-red/editor-client/src/js/keymap.json' 'editor/js/keymap.json'
] ]
} }
}, },
attachCopyright: { attachCopyright: {
js: { js: {
src: [ src: [
'packages/node_modules/@node-red/editor-client/public/red/red.min.js', 'public/red/red.min.js',
'packages/node_modules/@node-red/editor-client/public/red/main.min.js' 'public/red/main.min.js'
] ]
}, },
css: { css: {
src: [ src: [
'packages/node_modules/@node-red/editor-client/public/red/style.min.css' 'public/red/style.min.css'
] ]
} }
}, },
clean: { clean: {
build: { build: {
src: [ src: [
"packages/node_modules/@node-red/editor-client/public/red", "public/red",
"packages/node_modules/@node-red/editor-client/public/index.html", "public/index.html",
"packages/node_modules/@node-red/editor-client/public/favicon.ico", "public/favicon.ico",
"packages/node_modules/@node-red/editor-client/public/icons", "public/icons",
"packages/node_modules/@node-red/editor-client/public/vendor" "public/vendor"
] ]
}, },
release: { release: {
@@ -292,27 +264,27 @@ module.exports = function(grunt) {
watch: { watch: {
js: { js: {
files: [ files: [
'packages/node_modules/@node-red/editor-client/src/js/**/*.js' 'editor/js/**/*.js'
], ],
tasks: ['copy:build','concat',/*'uglify',*/ 'attachCopyright:js'] tasks: ['copy:build','concat','uglify','attachCopyright:js']
}, },
sass: { sass: {
files: [ files: [
'packages/node_modules/@node-red/editor-client/src/sass/**/*.scss' 'editor/sass/**/*.scss'
], ],
tasks: ['sass','attachCopyright:css'] tasks: ['sass','attachCopyright:css']
}, },
json: { json: {
files: [ files: [
'packages/node_modules/@node-red/nodes/locales/**/*.json', 'nodes/core/locales/en-US/messages.json',
'packages/node_modules/@node-red/editor-client/locales/**/*.json', 'red/api/locales/en-US/editor.json',
'packages/node_modules/@node-red/runtime/locales/**/*.json' 'red/runtime/locales/en-US/runtime.json'
], ],
tasks: ['jsonlint:messages'] tasks: ['jsonlint:messages']
}, },
keymaps: { keymaps: {
files: [ files: [
'packages/node_modules/@node-red/editor-client/src/js/keymap.json' 'editor/js/keymap.json'
], ],
tasks: ['jsonlint:keymaps','copy:build'] tasks: ['jsonlint:keymaps','copy:build']
}, },
@@ -327,13 +299,12 @@ module.exports = function(grunt) {
nodemon: { nodemon: {
/* uses .nodemonignore */ /* uses .nodemonignore */
dev: { dev: {
script: 'packages/node_modules/node-red/red.js', script: 'red.js',
options: { options: {
args: nodemonArgs, args: nodemonArgs,
ext: 'js,html,json', ext: 'js,html,json',
watch: [ watch: [
'packages/node_modules', 'red','nodes'
'!packages/node_modules/@node-red/editor-client'
] ]
} }
} }
@@ -352,56 +323,69 @@ module.exports = function(grunt) {
build: { build: {
files:[ files:[
{ {
src: 'packages/node_modules/@node-red/editor-client/src/js/main.js', src: 'editor/js/main.js',
dest: 'packages/node_modules/@node-red/editor-client/public/red/main.js' dest: 'public/red/main.js'
}, },
{ {
src: 'packages/node_modules/@node-red/editor-client/src/js/keymap.json', src: 'editor/js/keymap.json',
dest: 'packages/node_modules/@node-red/editor-client/public/red/keymap.json' dest: 'public/red/keymap.json'
}, },
{ {
cwd: 'packages/node_modules/@node-red/editor-client/src/images', cwd: 'editor/images',
src: '**', src: '**',
expand: true, expand: true,
dest: 'packages/node_modules/@node-red/editor-client/public/red/images/' dest: 'public/red/images/'
}, },
{ {
cwd: 'packages/node_modules/@node-red/editor-client/src/vendor', cwd: 'editor/vendor',
src: [ src: [
'ace/**', 'ace/**',
'jquery/css/base/**', //'bootstrap/css/**',
'bootstrap/img/**',
'jquery/css/**',
'font-awesome/**' 'font-awesome/**'
], ],
expand: true, expand: true,
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/' dest: 'public/vendor/'
}, },
{ {
cwd: 'packages/node_modules/@node-red/editor-client/src/icons', cwd: 'editor/icons',
src: '**', src: '**',
expand: true, expand: true,
dest: 'packages/node_modules/@node-red/editor-client/public/icons/' dest: 'public/icons/'
}, },
{ {
expand: true, expand: true,
src: ['packages/node_modules/@node-red/editor-client/src/index.html','packages/node_modules/@node-red/editor-client/src/favicon.ico'], src: ['editor/index.html','editor/favicon.ico'],
dest: 'packages/node_modules/@node-red/editor-client/public/', dest: 'public/',
flatten: true flatten: true
}, },
{ {
src: 'CHANGELOG.md', src: 'CHANGELOG.md',
dest: 'packages/node_modules/@node-red/editor-client/public/red/about' dest: 'public/red/about'
},
{
src: 'CHANGELOG.md',
dest: 'packages/node_modules/node-red/'
},
{
cwd: 'packages/node_modules/@node-red/editor-client/src/ace/bin/',
src: '**',
expand: true,
dest: 'packages/node_modules/@node-red/editor-client/public/vendor/ace/'
} }
] ]
},
release: {
files: [{
mode: true,
expand: true,
src: [
'*.md',
'LICENSE',
'package.json',
'settings.js',
'red.js',
'lib/.gitignore',
'nodes/*.demo',
'nodes/core/**',
'red/**',
'public/**',
'editor/templates/**',
'bin/**'
],
dest: path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>')
}]
} }
}, },
chmod: { chmod: {
@@ -410,93 +394,19 @@ module.exports = function(grunt) {
}, },
release: { release: {
src: [ src: [
"packages/node_modules/@node-red/nodes/core/hardware/nrgpio", path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/nodes/core/hardware/nrgpio*'),
"packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/git/node-red-*sh" path.resolve('<%= paths.dist %>/node-red-<%= pkg.version %>/red/runtime/storage/localfilesystem/projects/git/node-red-*sh')
] ]
} }
}, },
'npm-command': {
options: {
cmd: "pack",
cwd: "<%= paths.dist %>/modules"
},
'node-red': { options: { args: [__dirname+'/packages/node_modules/node-red'] } },
'@node-red/editor-api': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-api'] } },
'@node-red/editor-client': { options: { args: [__dirname+'/packages/node_modules/@node-red/editor-client'] } },
'@node-red/nodes': { options: { args: [__dirname+'/packages/node_modules/@node-red/nodes'] } },
'@node-red/registry': { options: { args: [__dirname+'/packages/node_modules/@node-red/registry'] } },
'@node-red/runtime': { options: { args: [__dirname+'/packages/node_modules/@node-red/runtime'] } },
'@node-red/util': { options: { args: [__dirname+'/packages/node_modules/@node-red/util'] } }
},
mkdir: {
release: {
options: {
create: ['<%= paths.dist %>/modules']
},
},
},
compress: { compress: {
release: { release: {
options: { options: {
archive: '<%= paths.dist %>/node-red-<%= pkg.version %>.zip' archive: '<%= paths.dist %>/node-red-<%= pkg.version %>.zip'
}, },
expand: true, expand: true,
cwd: 'packages/node_modules/', cwd: '<%= paths.dist %>/',
src: [ src: ['node-red-<%= pkg.version %>/**']
'**',
'!@node-red/editor-client/src/**'
]
}
},
jsdoc : {
modules: {
src: [
'API.md',
'packages/node_modules/node-red/lib/red.js',
'packages/node_modules/@node-red/runtime/lib/index.js',
'packages/node_modules/@node-red/runtime/lib/api/*.js',
'packages/node_modules/@node-red/runtime/lib/events.js',
'packages/node_modules/@node-red/runtime/lib/hooks.js',
'packages/node_modules/@node-red/util/**/*.js',
'packages/node_modules/@node-red/editor-api/lib/index.js',
'packages/node_modules/@node-red/editor-api/lib/auth/index.js'
],
options: {
destination: 'docs',
configure: './jsdoc.json'
}
},
_editor: {
src: [
'packages/node_modules/@node-red/editor-client/src/js'
],
options: {
destination: 'packages/node_modules/@node-red/editor-client/docs',
configure: './jsdoc.json'
}
}
},
jsdoc2md: {
runtimeAPI: {
options: {
separators: true
},
src: [
'packages/node_modules/@node-red/runtime/lib/index.js',
'packages/node_modules/@node-red/runtime/lib/api/*.js',
'packages/node_modules/@node-red/runtime/lib/events.js'
],
dest: 'packages/node_modules/@node-red/runtime/docs/api.md'
},
nodeREDUtil: {
options: {
separators: true
},
src: 'packages/node_modules/@node-red/util/**/*.js',
dest: 'packages/node_modules/@node-red/util/docs/api.md'
} }
} }
}); });
@@ -509,37 +419,13 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-concurrent');
grunt.loadNpmTasks('grunt-sass'); grunt.loadNpmTasks('grunt-sass');
grunt.loadNpmTasks('grunt-nodemon');
grunt.loadNpmTasks('grunt-contrib-compress'); grunt.loadNpmTasks('grunt-contrib-compress');
grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-chmod'); grunt.loadNpmTasks('grunt-chmod');
grunt.loadNpmTasks('grunt-jsonlint'); grunt.loadNpmTasks('grunt-jsonlint');
if (fs.existsSync(path.join("node_modules", "grunt-webdriver"))) { grunt.loadNpmTasks('grunt-mocha-istanbul');
grunt.loadNpmTasks('grunt-webdriver'); grunt.loadNpmTasks('grunt-webdriver');
}
grunt.loadNpmTasks('grunt-jsdoc');
grunt.loadNpmTasks('grunt-jsdoc-to-markdown');
grunt.loadNpmTasks('grunt-npm-command');
grunt.loadNpmTasks('grunt-mkdir');
grunt.loadNpmTasks('grunt-simple-nyc');
grunt.registerMultiTask('nodemon', 'Runs a nodemon monitor of your node.js server.', function () {
const nodemon = require('nodemon');
this.async();
const options = this.options();
options.script = this.data.script;
let callback;
if (options.callback) {
callback = options.callback;
delete options.callback;
} else {
callback = function(nodemonApp) {
nodemonApp.on('log', function (event) {
console.log(event.colour);
});
};
}
callback(nodemon(options));
});
grunt.registerMultiTask('attachCopyright', function() { grunt.registerMultiTask('attachCopyright', function() {
var files = this.data.src; var files = this.data.src;
@@ -581,38 +467,6 @@ module.exports = function(grunt) {
} }
}); });
grunt.registerTask('verifyPackageDependencies', function() {
var done = this.async();
var verifyDependencies = require("./scripts/verify-package-dependencies.js");
verifyDependencies().then(function(failures) {
if (failures.length > 0) {
failures.forEach(f => grunt.log.error(f));
grunt.fail.fatal("Failed to verify package dependencies");
}
done();
});
});
grunt.registerTask('verifyUiTestDependencies', function() {
if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
grunt.fail.fatal('You need to install the UI test dependencies first.\nUse the script in "scripts/install-ui-test-dependencies.sh"');
return false;
}
});
grunt.registerTask('generatePublishScript',
'Generates a script to publish build output to npm',
function () {
const done = this.async();
const generatePublishScript = require("./scripts/generate-publish-script.js");
generatePublishScript().then(function(output) {
grunt.log.writeln(output);
const filePath = path.join(grunt.config.get('paths.dist'),"modules","publish.sh");
grunt.file.write(filePath,output);
done();
});
});
grunt.registerTask('setDevEnv', grunt.registerTask('setDevEnv',
'Sets NODE_ENV=development so non-minified assets are used', 'Sets NODE_ENV=development so non-minified assets are used',
function () { function () {
@@ -621,61 +475,37 @@ module.exports = function(grunt) {
grunt.registerTask('default', grunt.registerTask('default',
'Builds editor content then runs code style checks and unit tests on all components', 'Builds editor content then runs code style checks and unit tests on all components',
['build','verifyPackageDependencies','jshint:editor','nyc:all']); ['build','jshint:editor','mocha_istanbul:all']);
grunt.registerTask('no-coverage',
'Builds editor content then runs code style checks and unit tests on all components without code coverage',
['build','verifyPackageDependencies','jshint:editor','simplemocha:all']);
grunt.registerTask('test-core', grunt.registerTask('test-core',
'Runs code style check and unit tests on core runtime code', 'Runs code style check and unit tests on core runtime code',
['build','nyc:core']); ['build','mocha_istanbul:core']);
grunt.registerTask('test-editor', grunt.registerTask('test-editor',
'Runs code style check on editor code', 'Runs code style check on editor code',
['jshint:editor']); ['jshint:editor']);
if (!fs.existsSync(path.join("node_modules", "grunt-webdriver"))) {
grunt.registerTask('test-ui', grunt.registerTask('test-ui',
'Builds editor content then runs unit tests on editor ui', 'Builds editor content then runs unit tests on editor ui',
['verifyUiTestDependencies']); ['build','jshint:editor','webdriver:all']);
} else {
grunt.registerTask('test-ui',
'Builds editor content then runs unit tests on editor ui',
['verifyUiTestDependencies','build','jshint:editor','webdriver:all']);
}
grunt.registerTask('test-nodes', grunt.registerTask('test-nodes',
'Runs unit tests on core nodes', 'Runs unit tests on core nodes',
['build','nyc:nodes']); ['build','mocha_istanbul:nodes']);
grunt.registerTask('build', grunt.registerTask('build',
'Builds editor content', 'Builds editor content',
['clean:build','jsonlint','concat:build','concat:vendor','copy:build','uglify:build','sass:build','attachCopyright']); ['clean:build','jsonlint','concat:build','concat:vendor','copy:build','uglify:build','sass:build','attachCopyright']);
grunt.registerTask('build-dev',
'Developer mode: build dev version',
['clean:build','concat:build','concat:vendor','copy:build','sass:build','setDevEnv']);
grunt.registerTask('dev', grunt.registerTask('dev',
'Developer mode: run node-red, watch for source changes and build/restart', 'Developer mode: run node-red, watch for source changes and build/restart',
['build','setDevEnv','concurrent:dev']); ['build','setDevEnv','concurrent:dev']);
grunt.registerTask('release', grunt.registerTask('release',
'Create distribution zip file', 'Create distribution zip file',
['build','verifyPackageDependencies','clean:release','mkdir:release','chmod:release','compress:release','pack-modules','generatePublishScript']); ['build','clean:release','copy:release','chmod:release','compress:release']);
grunt.registerTask('pack-modules',
'Create module pack files for release',
['mkdir:release','npm-command']);
grunt.registerTask('coverage', grunt.registerTask('coverage',
'Run Istanbul code test coverage task', 'Run Istanbul code test coverage task',
['build','nyc:all']); ['build','mocha_istanbul:all']);
grunt.registerTask('docs',
'Generates API documentation',
['jsdoc']);
}; };

View File

@@ -1,4 +1,4 @@
Copyright OpenJS Foundation and other contributors, https://openjsf.org/ Copyright JS Foundation and other contributors, http://js.foundation
Apache License Apache License
Version 2.0, January 2004 Version 2.0, January 2004

View File

@@ -2,12 +2,12 @@
http://nodered.org http://nodered.org
[![Build Status](https://travis-ci.org/node-red/node-red.svg?branch=master)](https://travis-ci.org/node-red/node-red) [![Build Status](https://travis-ci.org/node-red/node-red.svg)](https://travis-ci.org/node-red/node-red)
[![Coverage Status](https://coveralls.io/repos/node-red/node-red/badge.svg?branch=master)](https://coveralls.io/r/node-red/node-red?branch=master) [![Coverage Status](https://coveralls.io/repos/node-red/node-red/badge.svg?branch=master)](https://coveralls.io/r/node-red/node-red?branch=master)
Low-code programming for event-driven applications. A visual tool for wiring the Internet of Things.
![Node-RED: Low-code programming for event-driven applications](http://nodered.org/images/node-red-screenshot.png) ![Node-RED: A visual tool for wiring the Internet of Things](http://nodered.org/images/node-red-screenshot.png)
## Quick Start ## Quick Start
@@ -44,6 +44,9 @@ If you want to run the latest code from git, here's how to get started:
4. Run 4. Run
npm start npm start
or
node red.js
## Contributing ## Contributing
@@ -56,7 +59,7 @@ This project adheres to the [Contributor Covenant 1.4](http://contributor-covena
## Authors ## Authors
Node-RED is a project of the [OpenJS Foundation](https://openjsf.org). Node-RED is a project of the [JS Foundation](http://js.foundation).
It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/). It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-technology/).
@@ -67,4 +70,4 @@ It was created by [IBM Emerging Technology](https://www.ibm.com/blogs/emerging-t
## Copyright and license ## Copyright and license
Copyright OpenJS Foundation and other contributors, https://openjsf.org under [the Apache 2.0 license](LICENSE). Copyright JS Foundation and other contributors, http://js.foundation under [the Apache 2.0 license](LICENSE).

View File

@@ -1,5 +0,0 @@
# Security Policy
## Reporting a Vulnerability
Please report any potential security issues to `team@nodered.org`. This will notify the core project team who will respond accordingly.

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

BIN
editor/icons/alert.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

View File

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 603 B

View File

Before

Width:  |  Height:  |  Size: 393 B

After

Width:  |  Height:  |  Size: 393 B

BIN
editor/icons/batch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 B

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 508 B

BIN
editor/icons/bridge.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

BIN
editor/icons/cog.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

BIN
editor/icons/comment.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

BIN
editor/icons/db.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

BIN
editor/icons/debug.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 218 B

BIN
editor/icons/envelope.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 B

BIN
editor/icons/feed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 378 B

BIN
editor/icons/file.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

BIN
editor/icons/function.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

BIN
editor/icons/hash.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

BIN
editor/icons/inject.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 449 B

BIN
editor/icons/join.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
editor/icons/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 B

BIN
editor/icons/link-out.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

View File

Before

Width:  |  Height:  |  Size: 414 B

After

Width:  |  Height:  |  Size: 414 B

View File

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 671 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

BIN
editor/icons/node-error.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

BIN
editor/icons/parser-csv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 B

BIN
editor/icons/parser-xml.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

BIN
editor/icons/range.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

View File

Before

Width:  |  Height:  |  Size: 736 B

After

Width:  |  Height:  |  Size: 736 B

BIN
editor/icons/rpi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 B

BIN
editor/icons/serial.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

BIN
editor/icons/sort.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

BIN
editor/icons/split.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 B

BIN
editor/icons/subflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

BIN
editor/icons/swap.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 592 B

BIN
editor/icons/switch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

BIN
editor/icons/template.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 488 B

BIN
editor/icons/timer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

BIN
editor/icons/trigger.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 B

BIN
editor/icons/twitter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 B

BIN
editor/icons/watch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

View File

Before

Width:  |  Height:  |  Size: 192 B

After

Width:  |  Height:  |  Size: 192 B

View File

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
editor/images/node-red.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 646 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 B

View File

@@ -28,15 +28,6 @@ RED.comms = (function() {
function connectWS() { function connectWS() {
active = true; active = true;
var wspath;
if (RED.settings.apiRootUrl) {
var m = /^(https?):\/\/(.*)$/.exec(RED.settings.apiRootUrl);
if (m) {
console.log(m);
wspath = "ws"+(m[1]==="https"?"s":"")+"://"+m[2]+"comms";
}
} else {
var path = location.hostname; var path = location.hostname;
var port = location.port; var port = location.port;
if (port.length !== 0) { if (port.length !== 0) {
@@ -44,8 +35,7 @@ RED.comms = (function() {
} }
path = path+document.location.pathname; path = path+document.location.pathname;
path = path+(path.slice(-1) == "/"?"":"/")+"comms"; path = path+(path.slice(-1) == "/"?"":"/")+"comms";
wspath = "ws"+(document.location.protocol=="https:"?"s":"")+"://"+path; path = "ws"+(document.location.protocol=="https:"?"s":"")+"://"+path;
}
var auth_tokens = RED.settings.get("auth-tokens"); var auth_tokens = RED.settings.get("auth-tokens");
pendingAuth = (auth_tokens!=null); pendingAuth = (auth_tokens!=null);
@@ -58,7 +48,7 @@ RED.comms = (function() {
} }
} }
ws = new WebSocket(wspath); ws = new WebSocket(path);
ws.onopen = function() { ws.onopen = function() {
reconnectAttempts = 0; reconnectAttempts = 0;
if (errornotification) { if (errornotification) {
@@ -75,30 +65,21 @@ RED.comms = (function() {
} }
ws.onmessage = function(event) { ws.onmessage = function(event) {
var message = JSON.parse(event.data); var message = JSON.parse(event.data);
if (message.auth) { for (var m = 0; m < message.length; m++) {
if (pendingAuth) { var msg = message[m];
if (message.auth === "ok") { if (pendingAuth && msg.auth) {
if (msg.auth === "ok") {
pendingAuth = false; pendingAuth = false;
completeConnection(); completeConnection();
} else if (message.auth === "fail") { } else if (msg.auth === "fail") {
// anything else is an error... // anything else is an error...
active = false; active = false;
RED.user.login({updateMenu:true},function() { RED.user.login({updateMenu:true},function() {
connectWS(); connectWS();
}) })
} }
} else if (message.auth === "fail") {
// Our current session has expired
active = false;
RED.user.login({updateMenu:true},function() {
connectWS();
})
} }
} else { else if (msg.topic) {
// Otherwise, 'message' is an array of actual comms messages
for (var m = 0; m < message.length; m++) {
var msg = message[m];
if (msg.topic) {
for (var t in subscriptions) { for (var t in subscriptions) {
if (subscriptions.hasOwnProperty(t)) { if (subscriptions.hasOwnProperty(t)) {
var re = new RegExp("^"+t.replace(/([\[\]\?\(\)\\\\$\^\*\.|])/g,"\\$1").replace(/\+/g,"[^/]+").replace(/\/#$/,"(\/.*)?")+"$"); var re = new RegExp("^"+t.replace(/([\[\]\?\(\)\\\\$\^\*\.|])/g,"\\$1").replace(/\+/g,"[^/]+").replace(/\/#$/,"(\/.*)?")+"$");
@@ -114,7 +95,6 @@ RED.comms = (function() {
} }
} }
} }
}
}; };
ws.onclose = function() { ws.onclose = function() {
if (!active) { if (!active) {
@@ -142,10 +122,10 @@ RED.comms = (function() {
connectWS(); connectWS();
} else { } else {
var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' <a href="#">'+ RED._("notification.errors.lostConnectionTry")+'</a>'; var msg = RED._("notification.errors.lostConnectionReconnect",{time: connectCountdown})+' <a href="#">'+ RED._("notification.errors.lostConnectionTry")+'</a>';
errornotification.update(msg,{silent:true}); errornotification.update(msg);
$(errornotification).find("a").on("click", function(e) { $(errornotification).find("a").click(function(e) {
e.preventDefault(); e.preventDefault();
errornotification.update(RED._("notification.errors.lostConnection"),{silent:true}); errornotification.update(RED._("notification.errors.lostConnection"));
clearInterval(connectCountdownTimer); clearInterval(connectCountdownTimer);
connectWS(); connectWS();
}) })

View File

@@ -32,19 +32,14 @@
} }
} }
} }
function emit() { function emit(evt,arg) {
var evt = arguments[0]
var args = Array.prototype.slice.call(arguments,1);
if (RED.events.DEBUG) {
console.warn(evt,args);
}
if (handlers[evt]) { if (handlers[evt]) {
for (var i=0;i<handlers[evt].length;i++) { for (var i=0;i<handlers[evt].length;i++) {
try { try {
handlers[evt][i].apply(null, args); handlers[evt][i](arg);
} catch(err) { } catch(err) {
console.warn("RED.events.emit error: ["+evt+"] "+(err.toString())); console.log("RED.events.emit error: ["+evt+"] "+(err.toString()));
console.warn(err); console.log(err);
} }
} }

332
editor/js/history.js Normal file
View File

@@ -0,0 +1,332 @@
/**
* 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.
**/
RED.history = (function() {
var undo_history = [];
function undoEvent(ev) {
var i;
var len;
var node;
var subflow;
var modifiedTabs = {};
if (ev) {
if (ev.t == 'multi') {
len = ev.events.length;
for (i=len-1;i>=0;i--) {
undoEvent(ev.events[i]);
}
} else if (ev.t == 'replace') {
RED.nodes.clear();
var imported = RED.nodes.import(ev.config);
imported[0].forEach(function(n) {
if (ev.changed[n.id]) {
n.changed = true;
}
})
RED.nodes.version(ev.rev);
} else if (ev.t == 'add') {
if (ev.nodes) {
for (i=0;i<ev.nodes.length;i++) {
node = RED.nodes.node(ev.nodes[i]);
if (node.z) {
modifiedTabs[node.z] = true;
}
RED.nodes.remove(ev.nodes[i]);
}
}
if (ev.links) {
for (i=0;i<ev.links.length;i++) {
RED.nodes.removeLink(ev.links[i]);
}
}
if (ev.workspaces) {
for (i=0;i<ev.workspaces.length;i++) {
RED.nodes.removeWorkspace(ev.workspaces[i].id);
RED.workspaces.remove(ev.workspaces[i]);
}
}
if (ev.subflows) {
for (i=0;i<ev.subflows.length;i++) {
RED.nodes.removeSubflow(ev.subflows[i]);
RED.workspaces.remove(ev.subflows[i]);
}
}
if (ev.subflow) {
if (ev.subflow.instances) {
ev.subflow.instances.forEach(function(n) {
var node = RED.nodes.node(n.id);
if (node) {
node.changed = n.changed;
node.dirty = true;
}
});
}
if (ev.subflow.hasOwnProperty('changed')) {
subflow = RED.nodes.subflow(ev.subflow.id);
if (subflow) {
subflow.changed = ev.subflow.changed;
}
}
}
if (ev.removedLinks) {
for (i=0;i<ev.removedLinks.length;i++) {
RED.nodes.addLink(ev.removedLinks[i]);
}
}
} else if (ev.t == "delete") {
if (ev.workspaces) {
for (i=0;i<ev.workspaces.length;i++) {
RED.nodes.addWorkspace(ev.workspaces[i]);
RED.workspaces.add(ev.workspaces[i]);
}
}
if (ev.subflow && ev.subflow.subflow) {
RED.nodes.addSubflow(ev.subflow.subflow);
}
if (ev.subflowInputs && ev.subflowInputs.length > 0) {
subflow = RED.nodes.subflow(ev.subflowInputs[0].z);
subflow.in.push(ev.subflowInputs[0]);
subflow.in[0].dirty = true;
}
if (ev.subflowOutputs && ev.subflowOutputs.length > 0) {
subflow = RED.nodes.subflow(ev.subflowOutputs[0].z);
ev.subflowOutputs.sort(function(a,b) { return a.i-b.i});
for (i=0;i<ev.subflowOutputs.length;i++) {
var output = ev.subflowOutputs[i];
subflow.out.splice(output.i,0,output);
for (var j=output.i+1;j<subflow.out.length;j++) {
subflow.out[j].i++;
subflow.out[j].dirty = true;
}
RED.nodes.eachLink(function(l) {
if (l.source.type == "subflow:"+subflow.id) {
if (l.sourcePort >= output.i) {
l.sourcePort++;
}
}
});
}
}
if (ev.subflow && ev.subflow.hasOwnProperty('instances')) {
ev.subflow.instances.forEach(function(n) {
var node = RED.nodes.node(n.id);
if (node) {
node.changed = n.changed;
node.dirty = true;
}
});
}
if (subflow) {
RED.nodes.filterNodes({type:"subflow:"+subflow.id}).forEach(function(n) {
n.inputs = subflow.in.length;
n.outputs = subflow.out.length;
while (n.outputs > n.ports.length) {
n.ports.push(n.ports.length);
}
n.resize = true;
n.dirty = true;
});
}
if (ev.nodes) {
for (i=0;i<ev.nodes.length;i++) {
RED.nodes.add(ev.nodes[i]);
modifiedTabs[ev.nodes[i].z] = true;
}
}
if (ev.links) {
for (i=0;i<ev.links.length;i++) {
RED.nodes.addLink(ev.links[i]);
}
}
if (ev.changes) {
for (i in ev.changes) {
if (ev.changes.hasOwnProperty(i)) {
node = RED.nodes.node(i);
if (node) {
for (var d in ev.changes[i]) {
if (ev.changes[i].hasOwnProperty(d)) {
node[d] = ev.changes[i][d];
}
}
node.dirty = true;
}
}
}
}
} else if (ev.t == "move") {
for (i=0;i<ev.nodes.length;i++) {
var n = ev.nodes[i];
n.n.x = n.ox;
n.n.y = n.oy;
n.n.dirty = true;
n.n.moved = n.moved;
}
// A move could have caused a link splice
if (ev.links) {
for (i=0;i<ev.links.length;i++) {
RED.nodes.removeLink(ev.links[i]);
}
}
if (ev.removedLinks) {
for (i=0;i<ev.removedLinks.length;i++) {
RED.nodes.addLink(ev.removedLinks[i]);
}
}
} else if (ev.t == "edit") {
for (i in ev.changes) {
if (ev.changes.hasOwnProperty(i)) {
if (ev.node._def.defaults && ev.node._def.defaults[i] && ev.node._def.defaults[i].type) {
// This is a config node property
var currentConfigNode = RED.nodes.node(ev.node[i]);
if (currentConfigNode) {
currentConfigNode.users.splice(currentConfigNode.users.indexOf(ev.node),1);
}
var newConfigNode = RED.nodes.node(ev.changes[i]);
if (newConfigNode) {
newConfigNode.users.push(ev.node);
}
}
ev.node[i] = ev.changes[i];
}
}
if (ev.subflow) {
if (ev.subflow.hasOwnProperty('inputCount')) {
if (ev.node.in.length > ev.subflow.inputCount) {
ev.node.in.splice(ev.subflow.inputCount);
} else if (ev.subflow.inputs.length > 0) {
ev.node.in = ev.node.in.concat(ev.subflow.inputs);
}
}
if (ev.subflow.hasOwnProperty('outputCount')) {
if (ev.node.out.length > ev.subflow.outputCount) {
ev.node.out.splice(ev.subflow.outputCount);
} else if (ev.subflow.outputs.length > 0) {
ev.node.out = ev.node.out.concat(ev.subflow.outputs);
}
}
if (ev.subflow.hasOwnProperty('instances')) {
ev.subflow.instances.forEach(function(n) {
var node = RED.nodes.node(n.id);
if (node) {
node.changed = n.changed;
node.dirty = true;
}
});
}
RED.editor.validateNode(ev.node);
RED.nodes.filterNodes({type:"subflow:"+ev.node.id}).forEach(function(n) {
n.inputs = ev.node.in.length;
n.outputs = ev.node.out.length;
RED.editor.updateNodeProperties(n);
RED.editor.validateNode(n);
});
} else {
var outputMap;
if (ev.outputMap) {
outputMap = {};
for (var port in ev.outputMap) {
if (ev.outputMap.hasOwnProperty(port) && ev.outputMap[port] !== "-1") {
outputMap[ev.outputMap[port]] = port;
}
}
}
RED.editor.updateNodeProperties(ev.node,outputMap);
RED.editor.validateNode(ev.node);
}
if (ev.links) {
for (i=0;i<ev.links.length;i++) {
RED.nodes.addLink(ev.links[i]);
}
}
ev.node.dirty = true;
ev.node.changed = ev.changed;
} else if (ev.t == "createSubflow") {
if (ev.nodes) {
RED.nodes.filterNodes({z:ev.subflow.subflow.id}).forEach(function(n) {
n.z = ev.activeWorkspace;
n.dirty = true;
});
for (i=0;i<ev.nodes.length;i++) {
RED.nodes.remove(ev.nodes[i]);
}
}
if (ev.links) {
for (i=0;i<ev.links.length;i++) {
RED.nodes.removeLink(ev.links[i]);
}
}
RED.nodes.removeSubflow(ev.subflow.subflow);
RED.workspaces.remove(ev.subflow.subflow);
if (ev.removedLinks) {
for (i=0;i<ev.removedLinks.length;i++) {
RED.nodes.addLink(ev.removedLinks[i]);
}
}
} else if (ev.t == "reorder") {
if (ev.order) {
RED.workspaces.order(ev.order);
}
}
Object.keys(modifiedTabs).forEach(function(id) {
var subflow = RED.nodes.subflow(id);
if (subflow) {
RED.editor.validateNode(subflow);
}
});
RED.nodes.dirty(ev.dirty);
RED.view.redraw(true);
RED.palette.refresh();
RED.workspaces.refresh();
RED.sidebar.config.refresh();
}
}
return {
//TODO: this function is a placeholder until there is a 'save' event that can be listened to
markAllDirty: function() {
for (var i=0;i<undo_history.length;i++) {
undo_history[i].dirty = true;
}
},
list: function() {
return undo_history
},
depth: function() {
return undo_history.length;
},
push: function(ev) {
undo_history.push(ev);
},
pop: function() {
var ev = undo_history.pop();
undoEvent(ev);
},
peek: function() {
return undo_history[undo_history.length-1];
},
clear: function() {
undo_history = [];
}
}
})();

View File

@@ -16,14 +16,10 @@
RED.i18n = (function() { RED.i18n = (function() {
var apiRootUrl;
return { return {
init: function(options, done) { init: function(done) {
apiRootUrl = options.apiRootUrl||""; i18n.init({
var preferredLanguage = localStorage.getItem("editor-language"); resGetPath: 'locales/__ns__?lng=__lng__',
var opts = {
resGetPath: apiRootUrl+'locales/__ns__?lng=__lng__',
dynamicLoad: false, dynamicLoad: false,
load:'current', load:'current',
ns: { ns: {
@@ -31,40 +27,17 @@ RED.i18n = (function() {
defaultNs: "editor" defaultNs: "editor"
}, },
fallbackLng: ['en-US'], fallbackLng: ['en-US'],
useCookie: false, useCookie: false
returnObjectTrees: true },function() {
};
if (preferredLanguage) {
opts.lng = preferredLanguage;
}
i18n.init(opts,function() {
done(); done();
}); });
RED["_"] = function() { RED["_"] = function() {
var v = i18n.t.apply(null,arguments); return i18n.t.apply(null,arguments);
if (typeof v === 'string') {
return v;
} else {
return arguments[0];
}
} }
}, },
lang: function() { loadCatalog: function(namespace,done) {
// Gets the active message catalog language. This is based on what var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
// locale the editor is using and what languages are available.
//
var preferredLangs = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
var knownLangs = RED.settings.theme("languages")||["en-US"];
for (var i=0;i<preferredLangs.length;i++) {
if (knownLangs.indexOf(preferredLangs[i]) > -1) {
return preferredLangs[i]
}
}
return 'end-US'
},
loadNodeCatalog: function(namespace,done) {
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage());
var toLoad = languageList.length; var toLoad = languageList.length;
languageList.forEach(function(lang) { languageList.forEach(function(lang) {
$.ajax({ $.ajax({
@@ -72,7 +45,7 @@ RED.i18n = (function() {
"Accept":"application/json" "Accept":"application/json"
}, },
cache: false, cache: false,
url: apiRootUrl+'nodes/'+namespace+'/messages?lng='+lang, url: 'locales/'+namespace+'?lng='+lang,
success: function(data) { success: function(data) {
i18n.addResourceBundle(lang,namespace,data); i18n.addResourceBundle(lang,namespace,data);
toLoad--; toLoad--;
@@ -86,7 +59,7 @@ RED.i18n = (function() {
}, },
loadNodeCatalogs: function(done) { loadNodeCatalogs: function(done) {
var languageList = i18n.functions.toLanguages(localStorage.getItem("editor-language")||i18n.detectLanguage()); var languageList = i18n.functions.toLanguages(i18n.detectLanguage());
var toLoad = languageList.length; var toLoad = languageList.length;
languageList.forEach(function(lang) { languageList.forEach(function(lang) {
@@ -95,7 +68,7 @@ RED.i18n = (function() {
"Accept":"application/json" "Accept":"application/json"
}, },
cache: false, cache: false,
url: apiRootUrl+'nodes/messages?lng='+lang, url: 'locales/nodes?lng='+lang,
success: function(data) { success: function(data) {
var namespaces = Object.keys(data); var namespaces = Object.keys(data);
namespaces.forEach(function(ns) { namespaces.forEach(function(ns) {

View File

@@ -1,40 +1,25 @@
{ {
"*": { "*": {
"alt-shift-p":"core:manage-palette", "ctrl-shift-p":"core:manage-palette",
"ctrl-f": "core:search", "ctrl-f": "core:search",
"ctrl-shift-f": "core:list-flows",
"ctrl-=": "core:zoom-in", "ctrl-=": "core:zoom-in",
"ctrl--": "core:zoom-out", "ctrl--": "core:zoom-out",
"ctrl-0": "core:zoom-reset", "ctrl-0": "core:zoom-reset",
"ctrl-enter": "core:confirm-edit-tray", "ctrl-enter": "core:confirm-edit-tray",
"ctrl-escape": "core:cancel-edit-tray", "ctrl-escape": "core:cancel-edit-tray",
"ctrl-d": "core:deploy-flows",
"ctrl-g i": "core:show-info-tab", "ctrl-g i": "core:show-info-tab",
"ctrl-g h": "core:show-help-tab",
"ctrl-g d": "core:show-debug-tab", "ctrl-g d": "core:show-debug-tab",
"ctrl-g c": "core:show-config-tab", "ctrl-g c": "core:show-config-tab",
"ctrl-g x": "core:show-context-tab",
"ctrl-e": "core:show-export-dialog", "ctrl-e": "core:show-export-dialog",
"ctrl-i": "core:show-import-dialog", "ctrl-i": "core:show-import-dialog",
"ctrl-space": "core:toggle-sidebar", "ctrl-space": "core:toggle-sidebar",
"ctrl-p": "core:toggle-palette",
"ctrl-,": "core:show-user-settings", "ctrl-,": "core:show-user-settings",
"ctrl-alt-l": "core:clear-debug-messages",
"ctrl-alt-r": "core:show-remote-diff", "ctrl-alt-r": "core:show-remote-diff",
"ctrl-alt-n": "core:new-project", "ctrl-alt-n": "core:new-project",
"ctrl-alt-o": "core:open-project", "ctrl-alt-o": "core:open-project",
"ctrl-g v": "core:show-version-control-tab", "ctrl-g v": "core:show-version-control-tab"
"ctrl-shift-l": "core:show-event-log",
"ctrl-shift-p":"core:show-action-list"
}, },
"red-ui-sidebar-node-config": { "workspace": {
"backspace": "core:delete-config-selection",
"delete": "core:delete-config-selection",
"ctrl-a": "core:select-all-config-nodes",
"ctrl-z": "core:undo",
"ctrl-y": "core:redo"
},
"red-ui-workspace": {
"backspace": "core:delete-selection", "backspace": "core:delete-selection",
"delete": "core:delete-selection", "delete": "core:delete-selection",
"enter": "core:edit-selected-node", "enter": "core:edit-selected-node",
@@ -42,17 +27,8 @@
"ctrl-x": "core:cut-selection-to-internal-clipboard", "ctrl-x": "core:cut-selection-to-internal-clipboard",
"ctrl-v": "core:paste-from-internal-clipboard", "ctrl-v": "core:paste-from-internal-clipboard",
"ctrl-z": "core:undo", "ctrl-z": "core:undo",
"ctrl-y": "core:redo",
"ctrl-a": "core:select-all-nodes", "ctrl-a": "core:select-all-nodes",
"shift-?": "core:show-help", "shift-?": "core:show-help",
"w": "core:scroll-view-up",
"d": "core:scroll-view-right",
"s": "core:scroll-view-down",
"a": "core:scroll-view-left",
"shift-w": "core:step-view-up",
"shift-d": "core:step-view-right",
"shift-s": "core:step-view-down",
"shift-a": "core:step-view-left",
"up": "core:move-selection-up", "up": "core:move-selection-up",
"right": "core:move-selection-right", "right": "core:move-selection-right",
"down": "core:move-selection-down", "down": "core:move-selection-down",
@@ -62,10 +38,6 @@
"shift-down": "core:step-selection-down", "shift-down": "core:step-selection-down",
"shift-left": "core:step-selection-left", "shift-left": "core:step-selection-left",
"ctrl-shift-j": "core:show-previous-tab", "ctrl-shift-j": "core:show-previous-tab",
"ctrl-shift-k": "core:show-next-tab", "ctrl-shift-k": "core:show-next-tab"
"ctrl-shift-g": "core:group-selection",
"ctrl-shift-u": "core:ungroup-selection",
"ctrl-shift-c": "core:copy-group-style",
"ctrl-shift-v": "core:paste-group-style"
} }
} }

View File

@@ -13,10 +13,9 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
**/ **/
var RED = (function() { (function() {
function appendNodeConfig(nodeConfig,done) { function appendNodeConfig(nodeConfig) {
done = done || function(){};
var m = /<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim()); var m = /<!-- --- \[red-module:(\S+)\] --- -->/.exec(nodeConfig.trim());
var moduleId; var moduleId;
if (m) { if (m) {
@@ -25,57 +24,17 @@ var RED = (function() {
moduleId = "unknown"; moduleId = "unknown";
} }
try { try {
var hasDeferred = false; $("body").append(nodeConfig);
var nodeConfigEls = $("<div>"+nodeConfig+"</div>");
var scripts = nodeConfigEls.find("script");
var scriptCount = scripts.length;
scripts.each(function(i,el) {
var srcUrl = $(el).attr('src');
if (srcUrl && !/^\s*(https?:|\/|\.)/.test(srcUrl)) {
$(el).remove();
var newScript = document.createElement("script");
newScript.onload = function() {
scriptCount--;
if (scriptCount === 0) {
$("#red-ui-editor-node-configs").append(nodeConfigEls);
done()
}
}
if ($(el).attr('type') === "module") {
newScript.type = "module";
}
$("#red-ui-editor-node-configs").append(newScript);
newScript.src = RED.settings.apiRootUrl+srcUrl;
hasDeferred = true;
} else {
if (/\/ace.js$/.test(srcUrl) || /\/ext-language_tools.js$/.test(srcUrl)) {
// Block any attempts to load ace.js from a CDN - this will
// break the version of ace included in the editor.
// At the time of commit, the contrib-python nodes did this.
// This is a crude fix until the python nodes are fixed.
console.warn("Blocked attempt to load",srcUrl,"by",moduleId)
$(el).remove();
}
scriptCount--;
}
})
if (!hasDeferred) {
$("#red-ui-editor-node-configs").append(nodeConfigEls);
done();
}
} catch(err) { } catch(err) {
RED.notify(RED._("notification.errors.failedToAppendNode",{module:moduleId, error:err.toString()}),{ RED.notify(RED._("notification.errors.failedToAppendNode",{module:moduleId, error:err.toString()}),{
type: "error", type: "error",
timeout: 10000 timeout: 10000
}); });
console.log("["+moduleId+"] "+err.toString()); console.log("["+moduleId+"] "+err.toString());
done();
} }
} }
function loadNodeList() { function loadNodeList() {
loader.reportProgress(RED._("event.loadPalette"), 20)
$.ajax({ $.ajax({
headers: { headers: {
"Accept":"application/json" "Accept":"application/json"
@@ -84,7 +43,6 @@ var RED = (function() {
url: 'nodes', url: 'nodes',
success: function(data) { success: function(data) {
RED.nodes.setNodeList(data); RED.nodes.setNodeList(data);
loader.reportProgress(RED._("event.loadNodeCatalogs"), 25)
RED.i18n.loadNodeCatalogs(function() { RED.i18n.loadNodeCatalogs(function() {
loadIconList(loadNodes); loadIconList(loadNodes);
}); });
@@ -109,31 +67,25 @@ var RED = (function() {
} }
function loadNodes() { function loadNodes() {
loader.reportProgress(RED._("event.loadNodes",{count:""}), 30)
var lang = localStorage.getItem("editor-language")||i18n.detectLanguage();
$.ajax({ $.ajax({
headers: { headers: {
"Accept":"text/html", "Accept":"text/html"
"Accept-Language": lang
}, },
cache: false, cache: false,
url: 'nodes', url: 'nodes',
success: function(data) { success: function(data) {
var configs = data.trim().split(/(?=<!-- --- \[red-module:\S+\] --- -->)/); var configs = data.trim().split(/(?=<!-- --- \[red-module:\S+\] --- -->)/);
var totalCount = configs.length; configs.forEach(function(data) {
appendNodeConfig(data);
});
var stepConfig = function() { $("body").i18n();
loader.reportProgress(RED._("event.loadNodes",{count:(totalCount-configs.length)+"/"+totalCount}), 30 + ((totalCount-configs.length)/totalCount)*40 ) $("#palette > .palette-spinner").hide();
$(".palette-scroll").removeClass("hide");
if (configs.length === 0) { $("#palette-search").removeClass("hide");
$("#red-ui-editor").i18n(); loadFlows(function() {
$("#red-ui-palette > .red-ui-palette-spinner").hide();
$(".red-ui-palette-scroll").removeClass("hide");
$("#red-ui-palette-search").removeClass("hide");
if (RED.settings.theme("projects.enabled",false)) { if (RED.settings.theme("projects.enabled",false)) {
RED.projects.refresh(function(activeProject) { RED.projects.refresh(function(activeProject) {
loadFlows(function() {
RED.sidebar.info.refresh() RED.sidebar.info.refresh()
if (!activeProject) { if (!activeProject) {
// Projects enabled but no active project // Projects enabled but no active project
@@ -147,26 +99,17 @@ var RED = (function() {
} }
completeLoad(); completeLoad();
}); });
});
} else { } else {
loadFlows(function() {
// Projects disabled by the user // Projects disabled by the user
RED.sidebar.info.refresh() RED.sidebar.info.refresh()
completeLoad(); completeLoad();
}
}); });
} }
} else {
var config = configs.shift();
appendNodeConfig(config,stepConfig);
}
}
stepConfig();
}
}); });
} }
function loadFlows(done) { function loadFlows(done) {
loader.reportProgress(RED._("event.loadFlows"),80 )
$.ajax({ $.ajax({
headers: { headers: {
"Accept":"application/json", "Accept":"application/json",
@@ -177,23 +120,12 @@ var RED = (function() {
if (nodes) { if (nodes) {
var currentHash = window.location.hash; var currentHash = window.location.hash;
RED.nodes.version(nodes.rev); RED.nodes.version(nodes.rev);
loader.reportProgress(RED._("event.importFlows"),90 )
try {
RED.nodes.import(nodes.flows); RED.nodes.import(nodes.flows);
RED.nodes.dirty(false); RED.nodes.dirty(false);
RED.view.redraw(true); RED.view.redraw(true);
if (/^#flow\/.+$/.test(currentHash)) { if (/^#flow\/.+$/.test(currentHash)) {
RED.workspaces.show(currentHash.substring(6)); RED.workspaces.show(currentHash.substring(6));
} }
} catch(err) {
RED.notify(
RED._("event.importError", {message: err.message}),
{
fixed: true,
type: 'error'
}
);
}
} }
done(); done();
} }
@@ -214,7 +146,6 @@ var RED = (function() {
return; return;
} }
if (notificationId === "project-update") { if (notificationId === "project-update") {
loader.start("Loading project",0)
RED.nodes.clear(); RED.nodes.clear();
RED.history.clear(); RED.history.clear();
RED.view.redraw(true); RED.view.redraw(true);
@@ -230,8 +161,7 @@ var RED = (function() {
"revert": RED._("notification.project.revert", {project: msg.project}), "revert": RED._("notification.project.revert", {project: msg.project}),
"merge-complete": RED._("notification.project.merge-complete") "merge-complete": RED._("notification.project.merge-complete")
}[msg.action]; }[msg.action];
loader.end() RED.notify("<p>"+message+"</p>");
RED.notify($("<p>").text(message));
RED.sidebar.info.refresh() RED.sidebar.info.refresh()
}); });
}); });
@@ -248,17 +178,8 @@ var RED = (function() {
id: notificationId id: notificationId
} }
if (notificationId === "runtime-state") { if (notificationId === "runtime-state") {
if (msg.error === "safe-mode") { if (msg.error === "missing-types") {
options.buttons = [ text+="<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
{
text: RED._("common.label.close"),
click: function() {
persistentNotifications[notificationId].hideNotification();
}
}
]
} else if (msg.error === "missing-types") {
text+="<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>";
if (!!RED.projects.getActiveProject()) { if (!!RED.projects.getActiveProject()) {
options.buttons = [ options.buttons = [
{ {
@@ -286,7 +207,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) { if (RED.user.hasPermission("projects.write")) {
options.buttons = [ options.buttons = [
{ {
text: RED._("notification.project.setupCredentials"), text: RED._("notification.label.setup-cred"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
RED.projects.showCredentialsPrompt(); RED.projects.showCredentialsPrompt();
@@ -308,7 +229,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) { if (RED.user.hasPermission("projects.write")) {
options.buttons = [ options.buttons = [
{ {
text: RED._("notification.project.setupProjectFiles"), text: RED._("notification.label.setup-project"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
RED.projects.showFilesPrompt(); RED.projects.showFilesPrompt();
@@ -320,10 +241,10 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) { if (RED.user.hasPermission("projects.write")) {
options.buttons = [ options.buttons = [
{ {
text: RED._("notification.project.setupProjectFiles"), text: RED._("notification.label.create-default-package"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
RED.projects.showFilesPrompt(); RED.projects.createDefaultPackageFile();
} }
} }
] ]
@@ -332,13 +253,13 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) { if (RED.user.hasPermission("projects.write")) {
options.buttons = [ options.buttons = [
{ {
text: RED._("notification.project.no"), text: RED._("notification.label.no-thanks"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
} }
}, },
{ {
text: RED._("notification.project.createDefault"), text: RED._("notification.label.create-default-project"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
RED.projects.createDefaultFileSet(); RED.projects.createDefaultFileSet();
@@ -352,7 +273,7 @@ var RED = (function() {
if (RED.user.hasPermission("projects.write")) { if (RED.user.hasPermission("projects.write")) {
options.buttons = [ options.buttons = [
{ {
text: RED._("notification.project.mergeConflict"), text: RED._("notification.label.show-merge-conflicts"),
click: function() { click: function() {
persistentNotifications[notificationId].hideNotification(); persistentNotifications[notificationId].hideNotification();
RED.sidebar.versionControl.showLocalChanges(); RED.sidebar.versionControl.showLocalChanges();
@@ -376,13 +297,14 @@ var RED = (function() {
var parts = topic.split("/"); var parts = topic.split("/");
var node = RED.nodes.node(parts[1]); var node = RED.nodes.node(parts[1]);
if (node) { if (node) {
if (msg.hasOwnProperty("text") && msg.text !== null && /^[a-zA-Z]/.test(msg.text)) { if (msg.hasOwnProperty("text")) {
if (msg.text[0] !== ".") {
msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()}); msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()});
} }
}
node.status = msg; node.status = msg;
node.dirtyStatus = true;
node.dirty = true; node.dirty = true;
RED.view.redrawStatus(node); RED.view.redraw();
} }
}); });
RED.comms.subscribe("notification/node/#",function(topic,msg) { RED.comms.subscribe("notification/node/#",function(topic,msg) {
@@ -395,14 +317,14 @@ var RED = (function() {
var id = m.id; var id = m.id;
RED.nodes.addNodeSet(m); RED.nodes.addNodeSet(m);
addedTypes = addedTypes.concat(m.types); addedTypes = addedTypes.concat(m.types);
RED.i18n.loadNodeCatalog(id, function() { RED.i18n.loadCatalog(id, function() {
$.get('nodes/'+id, function(data) { $.get('nodes/'+id, function(data) {
appendNodeConfig(data); appendNodeConfig(data);
}); });
}); });
}); });
if (addedTypes.length) { if (addedTypes.length) {
typeList = "<ul><li>"+addedTypes.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>"; typeList = "<ul><li>"+addedTypes.join("</li><li>")+"</li></ul>";
RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success"); RED.notify(RED._("palette.event.nodeAdded", {count:addedTypes.length})+typeList,"success");
} }
loadIconList(); loadIconList();
@@ -411,7 +333,7 @@ var RED = (function() {
m = msg[i]; m = msg[i];
info = RED.nodes.removeNodeSet(m.id); info = RED.nodes.removeNodeSet(m.id);
if (info.added) { if (info.added) {
typeList = "<ul><li>"+m.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>"; typeList = "<ul><li>"+m.types.join("</li><li>")+"</li></ul>";
RED.notify(RED._("palette.event.nodeRemoved", {count:m.types.length})+typeList,"success"); RED.notify(RED._("palette.event.nodeRemoved", {count:m.types.length})+typeList,"success");
} }
} }
@@ -421,12 +343,12 @@ var RED = (function() {
info = RED.nodes.getNodeSet(msg.id); info = RED.nodes.getNodeSet(msg.id);
if (info.added) { if (info.added) {
RED.nodes.enableNodeSet(msg.id); RED.nodes.enableNodeSet(msg.id);
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>"; typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success"); RED.notify(RED._("palette.event.nodeEnabled", {count:msg.types.length})+typeList,"success");
} else { } else {
$.get('nodes/'+msg.id, function(data) { $.get('nodes/'+msg.id, function(data) {
appendNodeConfig(data); appendNodeConfig(data);
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>"; typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success"); RED.notify(RED._("palette.event.nodeAdded", {count:msg.types.length})+typeList,"success");
}); });
} }
@@ -434,24 +356,16 @@ var RED = (function() {
} else if (topic == "notification/node/disabled") { } else if (topic == "notification/node/disabled") {
if (msg.types) { if (msg.types) {
RED.nodes.disableNodeSet(msg.id); RED.nodes.disableNodeSet(msg.id);
typeList = "<ul><li>"+msg.types.map(RED.utils.sanitize).join("</li><li>")+"</li></ul>"; typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
RED.notify(RED._("palette.event.nodeDisabled", {count:msg.types.length})+typeList,"success"); RED.notify(RED._("palette.event.nodeDisabled", {count:msg.types.length})+typeList,"success");
} }
} else if (topic == "notification/node/upgraded") { } else if (topic == "node/upgraded") {
RED.notify(RED._("palette.event.nodeUpgraded", {module:msg.module,version:msg.version}),"success"); RED.notify(RED._("palette.event.nodeUpgraded", {module:msg.module,version:msg.version}),"success");
RED.nodes.registry.setModulePendingUpdated(msg.module,msg.version); RED.nodes.registry.setModulePendingUpdated(msg.module,msg.version);
} }
// Refresh flow library to ensure any examples are updated
RED.library.loadFlowLibrary();
}); });
RED.comms.subscribe("event-log/#", function(topic,payload) {
var id = topic.substring(9);
RED.eventLog.log(id,payload);
});
$(".red-ui-header-toolbar").show();
setTimeout(function() {
loader.end();
},100);
} }
function showAbout() { function showAbout() {
@@ -460,11 +374,12 @@ var RED = (function() {
'<img width="50px" src="red/images/node-red-icon.svg" />'+ '<img width="50px" src="red/images/node-red-icon.svg" />'+
'</div>'; '</div>';
RED.sidebar.help.set(aboutHeader+RED.utils.renderMarkdown(data)); RED.sidebar.info.set(aboutHeader+marked(data));
RED.sidebar.info.show();
}); });
} }
function buildMainMenu() { function loadEditor() {
var menuOptions = []; var menuOptions = [];
if (RED.settings.theme("projects.enabled",false)) { if (RED.settings.theme("projects.enabled",false)) {
menuOptions.push({id:"menu-item-projects-menu",label:RED._("menu.label.projects"),options:[ menuOptions.push({id:"menu-item-projects-menu",label:RED._("menu.label.projects"),options:[
@@ -473,20 +388,32 @@ var RED = (function() {
{id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"} {id:"menu-item-projects-settings",label:RED._("menu.label.projects-settings"),disabled:false,onselect:"core:show-project-settings"}
]}); ]});
} }
menuOptions.push({id:"menu-item-view-menu",label:RED._("menu.label.view.view"),options:[ menuOptions.push({id:"menu-item-view-menu",label:RED._("menu.label.view.view"),options:[
{id:"menu-item-palette",label:RED._("menu.label.palette.show"),toggle:true,onselect:"core:toggle-palette", selected: true}, // {id:"menu-item-view-show-grid",setting:"view-show-grid",label:RED._("menu.label.view.showGrid"),toggle:true,onselect:"core:toggle-show-grid"},
// {id:"menu-item-view-snap-grid",setting:"view-snap-grid",label:RED._("menu.label.view.snapGrid"),toggle:true,onselect:"core:toggle-snap-grid"},
// {id:"menu-item-status",setting:"node-show-status",label:RED._("menu.label.displayStatus"),toggle:true,onselect:"core:toggle-status", selected: true},
//null,
// {id:"menu-item-bidi",label:RED._("menu.label.view.textDir"),options:[
// {id:"menu-item-bidi-default",toggle:"text-direction",label:RED._("menu.label.view.defaultDir"),selected: true, onselect:function(s) { if(s){RED.text.bidi.setTextDirection("")}}},
// {id:"menu-item-bidi-ltr",toggle:"text-direction",label:RED._("menu.label.view.ltr"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("ltr")}}},
// {id:"menu-item-bidi-rtl",toggle:"text-direction",label:RED._("menu.label.view.rtl"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("rtl")}}},
// {id:"menu-item-bidi-auto",toggle:"text-direction",label:RED._("menu.label.view.auto"), onselect:function(s) { if(s){RED.text.bidi.setTextDirection("auto")}}}
// ]},
// null,
{id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true}, {id:"menu-item-sidebar",label:RED._("menu.label.sidebar.show"),toggle:true,onselect:"core:toggle-sidebar", selected: true},
{id:"menu-item-event-log",label:RED._("eventLog.title"),onselect:"core:show-event-log"},
{id:"menu-item-action-list",label:RED._("keyboard.actionList"),onselect:"core:show-action-list"},
null null
]}); ]});
menuOptions.push(null); menuOptions.push(null);
if (RED.settings.theme("menu.menu-item-import-library", true)) { menuOptions.push({id:"menu-item-import",label:RED._("menu.label.import"),options:[
menuOptions.push({id: "menu-item-import", label: RED._("menu.label.import"), onselect: "core:show-import-dialog"}); {id:"menu-item-import-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-import-dialog"},
} {id:"menu-item-import-library",label:RED._("menu.label.library"),options:[]}
if (RED.settings.theme("menu.menu-item-export-library", true)) { ]});
menuOptions.push({id: "menu-item-export", label: RED._("menu.label.export"), onselect: "core:show-export-dialog"}); menuOptions.push({id:"menu-item-export",label:RED._("menu.label.export"),options:[
} {id:"menu-item-export-clipboard",label:RED._("menu.label.clipboard"),onselect:"core:show-export-dialog"},
{id:"menu-item-export-library",label:RED._("menu.label.library"),disabled:true,onselect:"core:library-export"}
]});
menuOptions.push(null); menuOptions.push(null);
menuOptions.push({id:"menu-item-search",label:RED._("menu.label.search"),onselect:"core:search"}); menuOptions.push({id:"menu-item-search",label:RED._("menu.label.search"),onselect:"core:search"});
menuOptions.push(null); menuOptions.push(null);
@@ -500,14 +427,6 @@ var RED = (function() {
{id:"menu-item-subflow-create",label:RED._("menu.label.createSubflow"),onselect:"core:create-subflow"}, {id:"menu-item-subflow-create",label:RED._("menu.label.createSubflow"),onselect:"core:create-subflow"},
{id:"menu-item-subflow-convert",label:RED._("menu.label.selectionToSubflow"),disabled:true,onselect:"core:convert-to-subflow"}, {id:"menu-item-subflow-convert",label:RED._("menu.label.selectionToSubflow"),disabled:true,onselect:"core:convert-to-subflow"},
]}); ]});
menuOptions.push({id:"menu-item-group",label:RED._("menu.label.groups"), options: [
{id:"menu-item-group-group",label:RED._("menu.label.groupSelection"),disabled:true,onselect:"core:group-selection"},
{id:"menu-item-group-ungroup",label:RED._("menu.label.ungroupSelection"),disabled:true,onselect:"core:ungroup-selection"},
null,
{id:"menu-item-group-merge",label:RED._("menu.label.groupMergeSelection"),disabled:true,onselect:"core:merge-selection-to-group"},
{id:"menu-item-group-remove",label:RED._("menu.label.groupRemoveSelection"),disabled:true,onselect:"core:remove-selection-from-group"}
]});
menuOptions.push(null); menuOptions.push(null);
if (RED.settings.theme('palette.editable') !== false) { if (RED.settings.theme('palette.editable') !== false) {
menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"}); menuOptions.push({id:"menu-item-edit-palette",label:RED._("menu.label.editPalette"),onselect:"core:manage-palette"});
@@ -517,9 +436,7 @@ var RED = (function() {
menuOptions.push({id:"menu-item-user-settings",label:RED._("menu.label.settings"),onselect:"core:show-user-settings"}); menuOptions.push({id:"menu-item-user-settings",label:RED._("menu.label.settings"),onselect:"core:show-user-settings"});
menuOptions.push(null); menuOptions.push(null);
if (RED.settings.theme("menu.menu-item-keyboard-shortcuts", true)) { menuOptions.push({id:"menu-item-keyboard-shortcuts",label:RED._("menu.label.keyboardShortcuts"),onselect:"core:show-help"});
menuOptions.push({id: "menu-item-keyboard-shortcuts", label: RED._("menu.label.keyboardShortcuts"), onselect: "core:show-help"});
}
menuOptions.push({id:"menu-item-help", menuOptions.push({id:"menu-item-help",
label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")), label: RED.settings.theme("menu.menu-item-help.label",RED._("menu.label.help")),
href: RED.settings.theme("menu.menu-item-help.url","http://nodered.org/docs") href: RED.settings.theme("menu.menu-item-help.url","http://nodered.org/docs")
@@ -527,23 +444,12 @@ var RED = (function() {
menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" }); menuOptions.push({id:"menu-item-node-red-version", label:"v"+RED.settings.version, onselect: "core:show-about" });
$('<li><a id="red-ui-header-button-sidemenu" class="button" href="#"><i class="fa fa-bars"></i></a></li>').appendTo(".red-ui-header-toolbar")
RED.menu.init({id:"red-ui-header-button-sidemenu",options: menuOptions});
}
function loadEditor() {
RED.workspaces.init();
RED.statusBar.init();
RED.view.init(); RED.view.init();
RED.userSettings.init(); RED.userSettings.init();
RED.user.init(); RED.user.init();
RED.notifications.init();
RED.library.init(); RED.library.init();
RED.keyboard.init(); RED.keyboard.init();
RED.palette.init(); RED.palette.init();
RED.eventLog.init();
if (RED.settings.theme('palette.editable') !== false) { if (RED.settings.theme('palette.editable') !== false) {
RED.palette.editor.init(); RED.palette.editor.init();
} else { } else {
@@ -559,113 +465,37 @@ var RED = (function() {
} }
RED.subflow.init(); RED.subflow.init();
RED.group.init(); RED.workspaces.init();
RED.clipboard.init(); RED.clipboard.init();
RED.search.init(); RED.search.init();
RED.actionList.init();
RED.editor.init(); RED.editor.init();
RED.diff.init(); RED.diff.init();
RED.menu.init({id:"btn-sidemenu",options: menuOptions});
RED.deploy.init(RED.settings.theme("deployButton",null)); RED.deploy.init(RED.settings.theme("deployButton",null));
RED.notifications.init();
buildMainMenu(); RED.actions.add("core:show-about", showAbout);
RED.nodes.init(); RED.nodes.init();
RED.comms.connect(); RED.comms.connect();
$("#red-ui-main-container").show(); $("#main-container").show();
$(".header-toolbar").show();
RED.actions.add("core:show-about", showAbout);
loadNodeList(); loadNodeList();
} }
$(function() {
function buildEditor(options) { if ((window.location.hostname !== "localhost") && (window.location.hostname !== "127.0.0.1")) {
var header = $('<div id="red-ui-header"></div>').appendTo(options.target); document.title = document.title+" : "+window.location.hostname;
var logo = $('<span class="red-ui-header-logo"></span>').appendTo(header);
$('<ul class="red-ui-header-toolbar hide"></ul>').appendTo(header);
$('<div id="red-ui-header-shade" class="hide"></div>').appendTo(header);
$('<div id="red-ui-main-container" class="red-ui-sidebar-closed hide">'+
'<div id="red-ui-workspace"></div>'+
'<div id="red-ui-editor-stack"></div>'+
'<div id="red-ui-palette"></div>'+
'<div id="red-ui-sidebar"></div>'+
'<div id="red-ui-sidebar-separator"></div>'+
'</div>').appendTo(options.target);
$('<div id="red-ui-editor-node-configs"></div>').appendTo(options.target);
$('<div id="red-ui-full-shade" class="hide"></div>').appendTo(options.target);
loader.init().appendTo("#red-ui-main-container");
loader.start("...",0);
$.getJSON(options.apiRootUrl+"theme", function(theme) {
if (theme.header) {
if (theme.header.url) {
logo = $("<a>",{href:theme.header.url}).appendTo(logo);
}
if (theme.header.image) {
$('<img>',{src:theme.header.image}).appendTo(logo);
}
if (theme.header.title) {
$('<span>').html(theme.header.title).appendTo(logo);
}
}
});
} }
var initialised = false;
function init(options) {
if (initialised) {
throw new Error("RED already initialised");
}
initialised = true;
ace.require("ace/ext/language_tools"); ace.require("ace/ext/language_tools");
options = options || {};
options.apiRootUrl = options.apiRootUrl || "";
if (options.apiRootUrl && !/\/$/.test(options.apiRootUrl)) {
options.apiRootUrl = options.apiRootUrl+"/";
}
options.target = $("#red-ui-editor");
options.target.addClass("red-ui-editor");
buildEditor(options); RED.i18n.init(function() {
RED.settings.init(loadEditor);
RED.i18n.init(options, function() {
RED.settings.init(options, loadEditor);
}) })
} });
var loader = {
init: function() {
var wrapper = $('<div id="red-ui-loading-progress"></div>').hide();
var container = $('<div>').appendTo(wrapper);
var label = $('<div>',{class:"red-ui-loading-bar-label"}).appendTo(container);
var bar = $('<div>',{class:"red-ui-loading-bar"}).appendTo(container);
var fill =$('<span>').appendTo(bar);
return wrapper;
},
start: function(text, prcnt) {
if (text) {
loader.reportProgress(text,prcnt)
}
$("#red-ui-loading-progress").show();
},
reportProgress: function(text, prcnt) {
$(".red-ui-loading-bar-label").text(text);
$(".red-ui-loading-bar span").width(prcnt+"%")
},
end: function() {
$("#red-ui-loading-progress").hide();
loader.reportProgress("",0);
}
}
return {
init: init,
loader: loader
}
})(); })();

View File

@@ -13,5 +13,4 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
**/ **/
var RED = {};
module.exports = false

View File

@@ -37,7 +37,7 @@ RED.settings = (function () {
if (key === "auth-tokens") { if (key === "auth-tokens") {
localStorage.setItem(key, JSON.stringify(value)); localStorage.setItem(key, JSON.stringify(value));
} else { } else {
RED.utils.setMessageProperty(userSettings,key,value); userSettings[key] = value;
saveUserSettings(); saveUserSettings();
} }
}; };
@@ -46,26 +46,16 @@ RED.settings = (function () {
* If the key is not set in the localStorage it returns <i>undefined</i> * If the key is not set in the localStorage it returns <i>undefined</i>
* Else return the JSON parsed value * Else return the JSON parsed value
* @param key * @param key
* @param defaultIfUndefined
* @returns {*} * @returns {*}
*/ */
var get = function (key,defaultIfUndefined) { var get = function (key) {
if (!hasLocalStorage()) { if (!hasLocalStorage()) {
return undefined; return undefined;
} }
if (key === "auth-tokens") { if (key === "auth-tokens") {
return JSON.parse(localStorage.getItem(key)); return JSON.parse(localStorage.getItem(key));
} else { } else {
var v; return userSettings[key];
try {
v = RED.utils.getMessageProperty(userSettings,key);
if (v === undefined) {
v = defaultIfUndefined;
}
} catch(err) {
v = defaultIfUndefined;
}
return v;
} }
}; };
@@ -99,22 +89,18 @@ RED.settings = (function () {
userSettings = data; userSettings = data;
} }
var init = function (options, done) { var init = function (done) {
var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search); var accessTokenMatch = /[?&]access_token=(.*?)(?:$|&)/.exec(window.location.search);
if (accessTokenMatch) { if (accessTokenMatch) {
var accessToken = accessTokenMatch[1]; var accessToken = accessTokenMatch[1];
RED.settings.set("auth-tokens",{access_token: accessToken}); RED.settings.set("auth-tokens",{access_token: accessToken});
window.location.search = ""; window.location.search = "";
} }
RED.settings.apiRootUrl = options.apiRootUrl;
$.ajaxSetup({ $.ajaxSetup({
beforeSend: function(jqXHR,settings) { beforeSend: function(jqXHR,settings) {
// Only attach auth header for requests to relative paths // Only attach auth header for requests to relative paths
if (!/^\s*(https?:|\/|\.)/.test(settings.url)) { if (!/^\s*(https?:|\/|\.)/.test(settings.url)) {
if (options.apiRootUrl) {
settings.url = options.apiRootUrl+settings.url;
}
var auth_tokens = RED.settings.get("auth-tokens"); var auth_tokens = RED.settings.get("auth-tokens");
if (auth_tokens) { if (auth_tokens) {
jqXHR.setRequestHeader("Authorization","Bearer "+auth_tokens.access_token); jqXHR.setRequestHeader("Authorization","Bearer "+auth_tokens.access_token);
@@ -141,12 +127,6 @@ RED.settings = (function () {
RED.settings.remove("auth-tokens"); RED.settings.remove("auth-tokens");
} }
console.log("Node-RED: " + data.version); console.log("Node-RED: " + data.version);
console.groupCollapsed("Versions");
console.log("jQuery",$().jquery)
console.log("jQuery UI",$.ui.version);
console.log("ACE",ace.version);
console.log("D3",d3.version);
console.groupEnd();
loadUserSettings(done); loadUserSettings(done);
}, },
error: function(jqXHR,textStatus,errorThrown) { error: function(jqXHR,textStatus,errorThrown) {

View File

@@ -97,14 +97,14 @@ RED.text.bidi = (function() {
} }
/** /**
* Enforces the text direction for all the spans with style red-ui-text-bidi-aware under * Enforces the text direction for all the spans with style bidiAware under
* workspace or sidebar div * workspace or sidebar div
*/ */
function enforceTextDirectionOnPage() { function enforceTextDirectionOnPage() {
$("#red-ui-workspace").find('span.red-ui-text-bidi-aware').each(function() { $("#workspace").find('span.bidiAware').each(function() {
$(this).attr("dir", resolveBaseTextDir($(this).html())); $(this).attr("dir", resolveBaseTextDir($(this).html()));
}); });
$("#red-ui-sidebar").find('span.red-ui-text-bidi-aware').each(function() { $("#sidebar").find('span.bidiAware').each(function() {
$(this).attr("dir", resolveBaseTextDir($(this).text())); $(this).attr("dir", resolveBaseTextDir($(this).text()));
}); });
} }

View File

@@ -1304,7 +1304,7 @@ RED.text.format = (function() {
} }
return { return {
/*! /**
* Returns the HTML representation of a given structured text * Returns the HTML representation of a given structured text
* @param text - the structured text * @param text - the structured text
* @param type - could be one of filepath, url, email * @param type - could be one of filepath, url, email
@@ -1315,7 +1315,7 @@ RED.text.format = (function() {
getHtml: function (text, type, args, isRtl, locale) { getHtml: function (text, type, args, isRtl, locale) {
return getHandler(type).format(text, args, isRtl, true, locale); return getHandler(type).format(text, args, isRtl, true, locale);
}, },
/*! /**
* Handle Structured text correct display for a given HTML element. * Handle Structured text correct display for a given HTML element.
* @param element - the element : should be of type div contenteditable=true * @param element - the element : should be of type div contenteditable=true
* @param type - could be one of filepath, url, email * @param type - could be one of filepath, url, email

View File

@@ -12,27 +12,16 @@ RED.actions = (function() {
function getAction(name) { function getAction(name) {
return actions[name]; return actions[name];
} }
function invokeAction(name,args) { function invokeAction(name) {
if (actions.hasOwnProperty(name)) { if (actions.hasOwnProperty(name)) {
actions[name](args); actions[name]();
} }
} }
function listActions() { function listActions() {
var result = []; var result = [];
Object.keys(actions).forEach(function(action) { Object.keys(actions).forEach(function(action) {
var shortcut = RED.keyboard.getShortcut(action); var shortcut = RED.keyboard.getShortcut(action);
var isUser = false; result.push({id:action,scope:shortcut?shortcut.scope:undefined,key:shortcut?shortcut.key:undefined,user:shortcut?shortcut.user:undefined})
if (shortcut) {
isUser = shortcut.user;
} else {
isUser = !!RED.keyboard.getUserShortcut(action);
}
result.push({
id:action,
scope:shortcut?shortcut.scope:undefined,
key:shortcut?shortcut.key:undefined,
user:isUser
})
}) })
return result; return result;
} }

Some files were not shown because too many files have changed in this diff Show More