diff --git a/app-builder.js b/app-builder.js
index 3be78a84..135dd7de 100644
--- a/app-builder.js
+++ b/app-builder.js
@@ -25,6 +25,7 @@ const subscription = require('./routes/subscription');
const sandboxedMosaico = require('./routes/sandboxed-mosaico');
const sandboxedCKEditor = require('./routes/sandboxed-ckeditor');
const sandboxedGrapesJS = require('./routes/sandboxed-grapesjs');
+const sandboxedCodeEditor = require('./routes/sandboxed-codeeditor');
const files = require('./routes/files');
const links = require('./routes/links');
const archive = require('./routes/archive');
@@ -226,6 +227,7 @@ function createApp(appType) {
useWith404Fallback('/mosaico', sandboxedMosaico.getRouter(appType));
useWith404Fallback('/ckeditor', sandboxedCKEditor.getRouter(appType));
useWith404Fallback('/grapesjs', sandboxedGrapesJS.getRouter(appType));
+ useWith404Fallback('/codeeditor', sandboxedCodeEditor.getRouter(appType));
if (appType === AppType.TRUSTED || appType === AppType.SANDBOXED) {
if (config.reports && config.reports.enabled === true) {
diff --git a/client/package-lock.json b/client/package-lock.json
index 580edded..f7d532ad 100644
--- a/client/package-lock.json
+++ b/client/package-lock.json
@@ -2180,11 +2180,6 @@
"safe-buffer": "5.1.1"
}
},
- "ckeditor": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/ckeditor/-/ckeditor-4.11.1.tgz",
- "integrity": "sha512-UhHe02cc/wWJquDQZysEgh0ohLMEMU56zDx+s8prDdjylY/aBDY2xdIiIpbgCBTXdjhrEPIAPyiDS9g3RxYXig=="
- },
"ckeditor5": {
"version": "11.1.1",
"resolved": "https://registry.npmjs.org/ckeditor5/-/ckeditor5-11.1.1.tgz",
@@ -3413,9 +3408,9 @@
"dev": true
},
"deep-extend": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
- "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
},
"deep-is": {
"version": "0.1.3",
@@ -4624,6 +4619,16 @@
"mjml": "3.3.5"
},
"dependencies": {
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -4632,6 +4637,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -4748,6 +4758,27 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-divider": {
@@ -4914,17 +4945,48 @@
}
}
},
- "grapesjs-plugin-ckeditor": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/grapesjs-plugin-ckeditor/-/grapesjs-plugin-ckeditor-0.0.9.tgz",
- "integrity": "sha512-QXyAcSwgi09pzigGVS/NsHag5Skuw4zTkVGmEiBN/Qi8KU12/cQBG/OjAcjAB3/ZpToyPoglI33Ydjgj2nJuxQ=="
- },
"grapesjs-preset-newsletter": {
"version": "0.2.20",
"resolved": "https://registry.npmjs.org/grapesjs-preset-newsletter/-/grapesjs-preset-newsletter-0.2.20.tgz",
"integrity": "sha512-rffUeuznf9Saig+kIUddmGfhWwbLjxdaqAYf6Hoge4b0sfT8knOS4mQXJBdRsSROfzuRhFe6ybRHm4yC32lHxA==",
"requires": {
"juice": "4.3.2"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"har-validator": {
@@ -5819,14 +5881,14 @@
}
},
"juice": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
- "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-5.0.1.tgz",
+ "integrity": "sha512-3XJgQxfXo4uHGbCCI6hKwlVtovj0IM+2BVAUCUfWlIiOn1Mljsm4+pYLatOyzY6SF0ks7eT2MSUmOBvue/39sQ==",
"requires": {
"cheerio": "0.22.0",
"commander": "2.19.0",
- "cross-spawn": "5.1.0",
- "deep-extend": "0.5.1",
+ "cross-spawn": "6.0.5",
+ "deep-extend": "0.6.0",
"mensch": "0.3.3",
"slick": "1.12.2",
"web-resource-inliner": "4.2.1"
@@ -5838,11 +5900,13 @@
"integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
},
"cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
"requires": {
- "lru-cache": "4.1.1",
+ "nice-try": "1.0.5",
+ "path-key": "2.0.1",
+ "semver": "5.5.0",
"shebang-command": "1.2.0",
"which": "1.3.0"
}
@@ -6313,6 +6377,21 @@
"react": "15.6.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6321,6 +6400,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -6346,6 +6430,22 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-validator": {
@@ -6369,6 +6469,21 @@
"react": "15.6.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6377,6 +6492,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -6402,6 +6522,22 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-validator": {
@@ -6428,6 +6564,21 @@
"react": "15.6.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6436,6 +6587,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -6461,6 +6617,22 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-table": {
@@ -6493,6 +6665,21 @@
"react": "15.6.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6501,6 +6688,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -6526,6 +6718,22 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-validator": {
@@ -6551,6 +6759,21 @@
"react": "15.6.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -6559,6 +6782,11 @@
"ms": "2.0.0"
}
},
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
"hoist-non-react-statics": {
"version": "1.2.0",
"resolved": "http://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-1.2.0.tgz",
@@ -6584,6 +6812,22 @@
"react": "15.6.2",
"react-dom": "15.6.2",
"warning": "3.0.0"
+ },
+ "dependencies": {
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ }
}
},
"mjml-image": {
@@ -6631,6 +6875,40 @@
"warning": "4.0.2"
},
"dependencies": {
+ "commander": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
+ "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
+ },
+ "cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+ "requires": {
+ "lru-cache": "4.1.1",
+ "shebang-command": "1.2.0",
+ "which": "1.3.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
+ "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w=="
+ },
+ "juice": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/juice/-/juice-4.3.2.tgz",
+ "integrity": "sha512-3Qym/RnFoCGa9qrDz6xn4zRnohgI6G87xKWZV+/seF3dYpaVqNS1HijsDef+elGhytRY79RIboOzk0hucLtx6g==",
+ "requires": {
+ "cheerio": "0.22.0",
+ "commander": "2.19.0",
+ "cross-spawn": "5.1.0",
+ "deep-extend": "0.5.1",
+ "mensch": "0.3.3",
+ "slick": "1.12.2",
+ "web-resource-inliner": "4.2.1"
+ }
+ },
"warning": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.2.tgz",
@@ -6683,6 +6961,11 @@
"integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=",
"dev": true
},
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ },
"no-case": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
@@ -7111,6 +7394,11 @@
"integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
"dev": true
},
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
"path-parse": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
diff --git a/client/package.json b/client/package.json
index 43940f59..c06e3994 100644
--- a/client/package.json
+++ b/client/package.json
@@ -43,6 +43,7 @@
"i18next": "^8.4.3",
"i18next-xhr-backend": "^1.4.2",
"immutable": "^3.8.1",
+ "juice": "^5.0.1",
"mjml4-in-browser": "^1.0.1",
"moment": "^2.18.1",
"moment-timezone": "^0.5.13",
diff --git a/client/src/lib/sandbox-common.scss b/client/src/lib/sandbox-common.scss
new file mode 100644
index 00000000..d5bc6093
--- /dev/null
+++ b/client/src/lib/sandbox-common.scss
@@ -0,0 +1,71 @@
+$navbarHeight: 34px;
+$editorNormalHeight: 800px !default;
+
+.editor {
+ .host {
+ @if $editorNormalHeight {
+ height: $editorNormalHeight;
+ }
+ }
+}
+
+.editorFullscreen {
+ position: fixed;
+ top: 0px;
+ bottom: 0px;
+ left: 0px;
+ right: 0px;
+ z-index: 1000;
+ background: white;
+ margin-top: $navbarHeight;
+
+ .navbar {
+ margin-top: -$navbarHeight;
+ }
+
+ .host {
+ height: 100%;
+ }
+}
+
+.navbar {
+ background: #DE4320;
+ width: 100%;
+ height: $navbarHeight;
+}
+
+.logo {
+ float: left;
+ height: $navbarHeight;
+ padding: 5px 0 5px 10px;
+ filter: brightness(0) invert(1);
+}
+
+.title {
+ padding: 5px 0 5px 10px;
+ font-size: 18px;
+ font-family: sans-serif;
+ font-family: "Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;
+ font-weight: bold;
+ float: left;
+ color: white;
+ height: $navbarHeight;
+}
+
+.btn {
+ display: block;
+ float: right;
+ padding: 0px 15px;
+ line-height: $navbarHeight;
+ text-align: center;
+ color: white;
+ font-size: 14px;
+ font-weight: bold;
+ font-family: sans-serif;
+ cursor: pointer;
+}
+
+.btn:hover {
+ background-color: #b1381e;
+ color: white;
+}
diff --git a/client/src/lib/sandboxed-ckeditor.scss b/client/src/lib/sandboxed-ckeditor.scss
index 6b6f3b8d..2fba69c3 100644
--- a/client/src/lib/sandboxed-ckeditor.scss
+++ b/client/src/lib/sandboxed-ckeditor.scss
@@ -1,72 +1,7 @@
-$navbarHeight: 34px;
-
-.editor {
- .host {
- }
-}
+$editorNormalHeight: false;
+@import "sandbox-common";
.sandbox {
height: 100%;
overflow: hidden;
-}
-
-.editorFullscreen {
- position: fixed;
- top: 0px;
- bottom: 0px;
- left: 0px;
- right: 0px;
- z-index: 1000;
- background: white;
- margin-top: $navbarHeight;
-
- .navbar {
- margin-top: -$navbarHeight;
- }
-
- .host {
- height: 100%;
- }
-}
-
-.navbar {
- background: #DE4320;
- width: 100%;
- height: $navbarHeight;
-}
-
-.logo {
- float: left;
- height: $navbarHeight;
- padding: 5px 0 5px 10px;
- filter: brightness(0) invert(1);
-}
-
-.title {
- padding: 5px 0 5px 10px;
- font-size: 18px;
- font-family: sans-serif;
- font-family: "Ubuntu",Tahoma,"Helvetica Neue",Helvetica,Arial,sans-serif;
- font-weight: bold;
- float: left;
- color: white;
- height: $navbarHeight;
-}
-
-.btn {
- display: block;
- float: right;
- padding: 0px 15px;
- line-height: $navbarHeight;
- text-align: center;
- color: white;
- font-size: 14px;
- font-weight: bold;
- font-family: sans-serif;
- cursor: pointer;
-}
-
-.btn:hover {
- background-color: #b1381e;
- color: white;
-}
+}
\ No newline at end of file
diff --git a/client/src/lib/sandboxed-codeeditor-root.js b/client/src/lib/sandboxed-codeeditor-root.js
new file mode 100644
index 00000000..7a6c3b97
--- /dev/null
+++ b/client/src/lib/sandboxed-codeeditor-root.js
@@ -0,0 +1,166 @@
+'use strict';
+
+import './public-path';
+
+import React, {Component} from 'react';
+import ReactDOM
+ from 'react-dom';
+import {
+ I18nextProvider,
+ translate,
+} from 'react-i18next';
+import i18n
+ from './i18n';
+import {
+ parentRPC,
+ UntrustedContentRoot
+} from './untrusted';
+import PropTypes
+ from "prop-types";
+import styles
+ from "./sandboxed-codeeditor.scss";
+import {
+ getPublicUrl,
+ getSandboxUrl,
+ getTrustedUrl
+} from "./urls";
+import {
+ base,
+ unbase
+} from "../../../shared/templates";
+
+import brace from 'brace';
+import ACEEditorRaw from 'react-ace';
+import 'brace/theme/github';
+import 'brace/ext/searchbox';
+import 'brace/mode/html';
+import {CodeEditorSourceType} from "./sandboxed-codeeditor-shared";
+
+import mjml2html from "mjml4-in-browser";
+import juice from "juice";
+
+@translate(null, { withRef: true })
+class CodeEditorSandbox extends Component {
+ constructor(props) {
+ super(props);
+
+ let defaultSource;
+
+ if (props.sourceType === CodeEditorSourceType.MJML) {
+ defaultSource =
+ '