mirror of
https://github.com/Azure/cosmos-explorer.git
synced 2024-11-26 23:46:47 +00:00
Add CellOutputViewer for SandboxOutputs (#686)
* Initial commit * Optimizations * Optimize notebookOutputViewer bundle size by lazy loading transforms * Update package-lock.json * More optimizations * Updates * Fix unit test and other updates * Address feedback * Update package-lock.json * Update test snapshots * Fix build * Reduce cellOutputViewer bundle size * Renaming
This commit is contained in:
parent
c6766dd69e
commit
448566146f
10
externals/iframeResizer.contentWindow.min.js
vendored
Normal file
10
externals/iframeResizer.contentWindow.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
592
package-lock.json
generated
592
package-lock.json
generated
@ -5157,6 +5157,12 @@
|
|||||||
"hoist-non-react-statics": "^3.3.0"
|
"hoist-non-react-statics": "^3.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/html-minifier-terser": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/invariant": {
|
"@types/invariant": {
|
||||||
"version": "2.2.34",
|
"version": "2.2.34",
|
||||||
"resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz",
|
"resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.34.tgz",
|
||||||
@ -5382,6 +5388,12 @@
|
|||||||
"integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
|
"integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/post-robot": {
|
||||||
|
"version": "10.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/post-robot/-/post-robot-10.0.1.tgz",
|
||||||
|
"integrity": "sha512-1k27bJ7MfTScedBeK8m4hYFLaiBkB6PbMHiux0gW1gJDGaqU89YICxl5kHX3KT/Dz6k04RfncfR1XDfD3Kou2Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/prettier": {
|
"@types/prettier": {
|
||||||
"version": "1.19.1",
|
"version": "1.19.1",
|
||||||
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz",
|
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz",
|
||||||
@ -6433,6 +6445,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"address": {
|
||||||
|
"version": "1.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
|
||||||
|
"integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"agent-base": {
|
"agent-base": {
|
||||||
"version": "6.0.2",
|
"version": "6.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
|
||||||
@ -7195,6 +7213,16 @@
|
|||||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz",
|
||||||
"integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A=="
|
"integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A=="
|
||||||
},
|
},
|
||||||
|
"belter": {
|
||||||
|
"version": "1.0.164",
|
||||||
|
"resolved": "https://registry.npmjs.org/belter/-/belter-1.0.164.tgz",
|
||||||
|
"integrity": "sha512-aDRwk/yvRmesbEXixhbJ0kGeFmJth2kXZtqB8Dpk5xpfU79VPu+AX5DkE3b4Q6wCINNIetYhSZdSE255IKao2g==",
|
||||||
|
"requires": {
|
||||||
|
"cross-domain-safe-weakmap": "^1",
|
||||||
|
"cross-domain-utils": "^2",
|
||||||
|
"zalgo-promise": "^1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"bfj": {
|
"bfj": {
|
||||||
"version": "6.1.2",
|
"version": "6.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz",
|
||||||
@ -8576,6 +8604,22 @@
|
|||||||
"warning": "^4.0.3"
|
"warning": "^4.0.3"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"cross-domain-safe-weakmap": {
|
||||||
|
"version": "1.0.28",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-domain-safe-weakmap/-/cross-domain-safe-weakmap-1.0.28.tgz",
|
||||||
|
"integrity": "sha512-gfQiQYSdWr9cYFVpmzp+b6MyTnefefDHr+fvm+JVv20hQxetV5J6chZOAusrpM/kFpTTbVDnHCziBFaREvgc0Q==",
|
||||||
|
"requires": {
|
||||||
|
"cross-domain-utils": "^2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cross-domain-utils": {
|
||||||
|
"version": "2.0.34",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-domain-utils/-/cross-domain-utils-2.0.34.tgz",
|
||||||
|
"integrity": "sha512-ke4PirGRXwEElEmE/7k5aCvCW+EqbgseT7AOObzFfaVnOLuEVN9SjVWoOfS/qAT0rDPn3ggmNDW6mguMBy4HgA==",
|
||||||
|
"requires": {
|
||||||
|
"zalgo-promise": "^1.0.11"
|
||||||
|
}
|
||||||
|
},
|
||||||
"cross-spawn": {
|
"cross-spawn": {
|
||||||
"version": "6.0.5",
|
"version": "6.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
|
||||||
@ -9596,6 +9640,33 @@
|
|||||||
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
|
"integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"detect-port-alt": {
|
||||||
|
"version": "1.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
|
||||||
|
"integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"address": "^1.0.1",
|
||||||
|
"debug": "^2.6.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"debug": {
|
||||||
|
"version": "2.6.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
|
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ms": "2.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ms": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"diagnostic-channel": {
|
"diagnostic-channel": {
|
||||||
"version": "0.3.1",
|
"version": "0.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.3.1.tgz",
|
||||||
@ -9797,6 +9868,43 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"dot-case": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
|
||||||
|
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"no-case": "^3.0.4",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"lower-case": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"no-case": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
|
||||||
|
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lower-case": "^2.0.2",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tslib": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"dotenv": {
|
"dotenv": {
|
||||||
"version": "8.2.0",
|
"version": "8.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
|
||||||
@ -11571,6 +11679,21 @@
|
|||||||
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
|
||||||
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
|
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
|
||||||
},
|
},
|
||||||
|
"fork-ts-checker-webpack-plugin": {
|
||||||
|
"version": "4.1.6",
|
||||||
|
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz",
|
||||||
|
"integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/code-frame": "^7.5.5",
|
||||||
|
"chalk": "^2.4.1",
|
||||||
|
"micromatch": "^3.1.10",
|
||||||
|
"minimatch": "^3.0.4",
|
||||||
|
"semver": "^5.6.0",
|
||||||
|
"tapable": "^1.0.0",
|
||||||
|
"worker-rpc": "^0.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"form-data": {
|
"form-data": {
|
||||||
"version": "2.5.1",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
|
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
|
||||||
@ -12373,6 +12496,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
|
||||||
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
|
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
|
||||||
},
|
},
|
||||||
|
"html-inline-css-webpack-plugin": {
|
||||||
|
"version": "1.11.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/html-inline-css-webpack-plugin/-/html-inline-css-webpack-plugin-1.11.0.tgz",
|
||||||
|
"integrity": "sha512-VOBX7DOSKTZGwJnToWYhfzq9tt3mbTV0VncCy3APA4ljME20NbkQYiixJMZu782Crpp/kEcml1HbZbYtlXQzgQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lodash": "^4.17.15"
|
||||||
|
}
|
||||||
|
},
|
||||||
"html-loader": {
|
"html-loader": {
|
||||||
"version": "0.5.5",
|
"version": "0.5.5",
|
||||||
"resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
|
"resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz",
|
||||||
@ -12418,6 +12550,55 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"html-minifier-terser": {
|
||||||
|
"version": "5.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
|
||||||
|
"integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"camel-case": "^4.1.1",
|
||||||
|
"clean-css": "^4.2.3",
|
||||||
|
"commander": "^4.1.1",
|
||||||
|
"he": "^1.2.0",
|
||||||
|
"param-case": "^3.0.3",
|
||||||
|
"relateurl": "^0.2.7",
|
||||||
|
"terser": "^4.6.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"camel-case": {
|
||||||
|
"version": "4.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
|
||||||
|
"integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"pascal-case": "^3.1.2",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"commander": {
|
||||||
|
"version": "4.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
|
||||||
|
"integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"param-case": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
|
||||||
|
"integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"dot-case": "^3.0.4",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tslib": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"html-parse-stringify2": {
|
"html-parse-stringify2": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/html-parse-stringify2/-/html-parse-stringify2-2.0.1.tgz",
|
||||||
@ -12451,50 +12632,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"html-webpack-plugin": {
|
"html-webpack-plugin": {
|
||||||
"version": "3.2.0",
|
"version": "4.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz",
|
||||||
"integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=",
|
"integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"html-minifier": "^3.2.3",
|
"@types/html-minifier-terser": "^5.0.0",
|
||||||
"loader-utils": "^0.2.16",
|
"@types/tapable": "^1.0.5",
|
||||||
"lodash": "^4.17.3",
|
"@types/webpack": "^4.41.8",
|
||||||
"pretty-error": "^2.0.2",
|
"html-minifier-terser": "^5.0.1",
|
||||||
"tapable": "^1.0.0",
|
"loader-utils": "^1.2.3",
|
||||||
"toposort": "^1.0.0",
|
"lodash": "^4.17.20",
|
||||||
|
"pretty-error": "^2.1.1",
|
||||||
|
"tapable": "^1.1.3",
|
||||||
"util.promisify": "1.0.0"
|
"util.promisify": "1.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"big.js": {
|
|
||||||
"version": "3.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz",
|
|
||||||
"integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"emojis-list": {
|
|
||||||
"version": "2.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
|
|
||||||
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"json5": {
|
|
||||||
"version": "0.5.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
|
|
||||||
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"loader-utils": {
|
|
||||||
"version": "0.2.17",
|
|
||||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz",
|
|
||||||
"integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"big.js": "^3.1.3",
|
|
||||||
"emojis-list": "^2.0.0",
|
|
||||||
"json5": "^0.5.0",
|
|
||||||
"object-assign": "^4.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"util.promisify": {
|
"util.promisify": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz",
|
||||||
@ -12711,6 +12864,20 @@
|
|||||||
"integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
|
"integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"iframe-resizer": {
|
||||||
|
"version": "4.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/iframe-resizer/-/iframe-resizer-4.3.1.tgz",
|
||||||
|
"integrity": "sha512-PkoTPNF6EYhTbDjogdKu7JVgKqRwwNBXMeywZaQyzEYM3BNltA8O9fIIrtUkmj+8VZGckXpwtXsWsaQ5lrhd0w=="
|
||||||
|
},
|
||||||
|
"iframe-resizer-react": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/iframe-resizer-react/-/iframe-resizer-react-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-FrytSq91AIJaDgE+6uK/Vdd6IR8CrwLoZ6eGmL2qQMPTzF0xlSV2jaSzRRUh5V2fttD7vzl21jvBl97bV40eBw==",
|
||||||
|
"requires": {
|
||||||
|
"iframe-resizer": "^4.3.0",
|
||||||
|
"warning": "^4.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"ignore": {
|
"ignore": {
|
||||||
"version": "5.1.8",
|
"version": "5.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
|
||||||
@ -12723,6 +12890,12 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"optional": true
|
"optional": true
|
||||||
},
|
},
|
||||||
|
"immer": {
|
||||||
|
"version": "8.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz",
|
||||||
|
"integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"immutable": {
|
"immutable": {
|
||||||
"version": "4.0.0-rc.12",
|
"version": "4.0.0-rc.12",
|
||||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz",
|
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0-rc.12.tgz",
|
||||||
@ -13128,6 +13301,12 @@
|
|||||||
"is-unc-path": "^1.0.0"
|
"is-unc-path": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"is-root": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"is-stream": {
|
"is-stream": {
|
||||||
"version": "1.1.0",
|
"version": "1.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
|
||||||
@ -18761,6 +18940,12 @@
|
|||||||
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
|
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"microevent.ts": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"micromatch": {
|
"micromatch": {
|
||||||
"version": "3.1.10",
|
"version": "3.1.10",
|
||||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
|
||||||
@ -20364,6 +20549,43 @@
|
|||||||
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"pascal-case": {
|
||||||
|
"version": "3.1.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
|
||||||
|
"integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"no-case": "^3.0.4",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"lower-case": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"no-case": {
|
||||||
|
"version": "3.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
|
||||||
|
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"lower-case": "^2.0.2",
|
||||||
|
"tslib": "^2.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tslib": {
|
||||||
|
"version": "2.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz",
|
||||||
|
"integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==",
|
||||||
|
"dev": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"pascalcase": {
|
"pascalcase": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
|
||||||
@ -20517,6 +20739,15 @@
|
|||||||
"find-up": "^3.0.0"
|
"find-up": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"pkg-up": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"find-up": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"playwright": {
|
"playwright": {
|
||||||
"version": "1.10.0",
|
"version": "1.10.0",
|
||||||
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.10.0.tgz",
|
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.10.0.tgz",
|
||||||
@ -20640,6 +20871,18 @@
|
|||||||
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
|
||||||
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
|
"integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
|
||||||
},
|
},
|
||||||
|
"post-robot": {
|
||||||
|
"version": "10.0.42",
|
||||||
|
"resolved": "https://registry.npmjs.org/post-robot/-/post-robot-10.0.42.tgz",
|
||||||
|
"integrity": "sha512-fuIuJblIbiAUJVKvttYZ1ZABhvrtAJgxZZ/TsWzzAdQGzkXOaewwgvFiGOSZRr0DywRaQs0Wvgxa7bFCYh8pfg==",
|
||||||
|
"requires": {
|
||||||
|
"belter": "^1.0.41",
|
||||||
|
"cross-domain-safe-weakmap": "^1.0.1",
|
||||||
|
"cross-domain-utils": "^2.0.0",
|
||||||
|
"universal-serialize": "^1.0.4",
|
||||||
|
"zalgo-promise": "^1.0.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"postcss": {
|
"postcss": {
|
||||||
"version": "8.2.10",
|
"version": "8.2.10",
|
||||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz",
|
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.10.tgz",
|
||||||
@ -21210,6 +21453,225 @@
|
|||||||
"tinycolor2": "^1.4.1"
|
"tinycolor2": "^1.4.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"react-dev-utils": {
|
||||||
|
"version": "11.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz",
|
||||||
|
"integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/code-frame": "7.10.4",
|
||||||
|
"address": "1.1.2",
|
||||||
|
"browserslist": "4.14.2",
|
||||||
|
"chalk": "2.4.2",
|
||||||
|
"cross-spawn": "7.0.3",
|
||||||
|
"detect-port-alt": "1.1.6",
|
||||||
|
"escape-string-regexp": "2.0.0",
|
||||||
|
"filesize": "6.1.0",
|
||||||
|
"find-up": "4.1.0",
|
||||||
|
"fork-ts-checker-webpack-plugin": "4.1.6",
|
||||||
|
"global-modules": "2.0.0",
|
||||||
|
"globby": "11.0.1",
|
||||||
|
"gzip-size": "5.1.1",
|
||||||
|
"immer": "8.0.1",
|
||||||
|
"is-root": "2.1.0",
|
||||||
|
"loader-utils": "2.0.0",
|
||||||
|
"open": "^7.0.2",
|
||||||
|
"pkg-up": "3.1.0",
|
||||||
|
"prompts": "2.4.0",
|
||||||
|
"react-error-overlay": "^6.0.9",
|
||||||
|
"recursive-readdir": "2.2.2",
|
||||||
|
"shell-quote": "1.7.2",
|
||||||
|
"strip-ansi": "6.0.0",
|
||||||
|
"text-table": "0.2.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babel/code-frame": {
|
||||||
|
"version": "7.10.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
|
||||||
|
"integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"@babel/highlight": "^7.10.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ansi-regex": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"browserslist": {
|
||||||
|
"version": "4.14.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz",
|
||||||
|
"integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"caniuse-lite": "^1.0.30001125",
|
||||||
|
"electron-to-chromium": "^1.3.564",
|
||||||
|
"escalade": "^3.0.2",
|
||||||
|
"node-releases": "^1.1.61"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"cross-spawn": {
|
||||||
|
"version": "7.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||||
|
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"path-key": "^3.1.0",
|
||||||
|
"shebang-command": "^2.0.0",
|
||||||
|
"which": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"escape-string-regexp": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"filesize": {
|
||||||
|
"version": "6.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz",
|
||||||
|
"integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"find-up": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"locate-path": "^5.0.0",
|
||||||
|
"path-exists": "^4.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"global-modules": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"global-prefix": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"global-prefix": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ini": "^1.3.5",
|
||||||
|
"kind-of": "^6.0.2",
|
||||||
|
"which": "^1.3.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"which": {
|
||||||
|
"version": "1.3.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
|
||||||
|
"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"isexe": "^2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"globby": {
|
||||||
|
"version": "11.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
|
||||||
|
"integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"array-union": "^2.1.0",
|
||||||
|
"dir-glob": "^3.0.1",
|
||||||
|
"fast-glob": "^3.1.1",
|
||||||
|
"ignore": "^5.1.4",
|
||||||
|
"merge2": "^1.3.0",
|
||||||
|
"slash": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"loader-utils": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"big.js": "^5.2.2",
|
||||||
|
"emojis-list": "^3.0.0",
|
||||||
|
"json5": "^2.1.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"locate-path": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"p-locate": "^4.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"p-locate": {
|
||||||
|
"version": "4.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
|
||||||
|
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"p-limit": "^2.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"path-exists": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"path-key": {
|
||||||
|
"version": "3.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
|
||||||
|
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"shebang-command": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"shebang-regex": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shebang-regex": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"slash": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
|
"strip-ansi": {
|
||||||
|
"version": "6.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
|
||||||
|
"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"ansi-regex": "^5.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"which": {
|
||||||
|
"version": "2.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||||
|
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"isexe": "^2.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"react-dnd": {
|
"react-dnd": {
|
||||||
"version": "9.4.0",
|
"version": "9.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-9.4.0.tgz",
|
||||||
@ -21252,6 +21714,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"react-error-overlay": {
|
||||||
|
"version": "6.0.9",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
|
||||||
|
"integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"react-hot-loader": {
|
"react-hot-loader": {
|
||||||
"version": "4.13.0",
|
"version": "4.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.13.0.tgz",
|
||||||
@ -21536,6 +22004,15 @@
|
|||||||
"resolve": "^1.1.6"
|
"resolve": "^1.1.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"recursive-readdir": {
|
||||||
|
"version": "2.2.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
|
||||||
|
"integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"minimatch": "3.0.4"
|
||||||
|
}
|
||||||
|
},
|
||||||
"redent": {
|
"redent": {
|
||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
|
||||||
@ -21782,9 +22259,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"domelementtype": {
|
"domelementtype": {
|
||||||
"version": "2.1.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
||||||
"integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
|
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -22549,6 +23026,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
|
||||||
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
|
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
|
||||||
},
|
},
|
||||||
|
"shell-quote": {
|
||||||
|
"version": "1.7.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
|
||||||
|
"integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"shellwords": {
|
"shellwords": {
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
|
||||||
@ -23727,12 +24210,6 @@
|
|||||||
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
|
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"toposort": {
|
|
||||||
"version": "1.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz",
|
|
||||||
"integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"tough-cookie": {
|
"tough-cookie": {
|
||||||
"version": "3.0.1",
|
"version": "3.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz",
|
||||||
@ -24201,6 +24678,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz",
|
||||||
"integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
|
"integrity": "sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q=="
|
||||||
},
|
},
|
||||||
|
"universal-serialize": {
|
||||||
|
"version": "1.0.8",
|
||||||
|
"resolved": "https://registry.npmjs.org/universal-serialize/-/universal-serialize-1.0.8.tgz",
|
||||||
|
"integrity": "sha512-AhC3D26asmMkxAadYjCUJh98AUV/Fpp9uStVz4OuigpaGqIwY+i95EWE392P+4ObOPFHw8TUk/GazyiSGDtxhA=="
|
||||||
|
},
|
||||||
"universal-user-agent": {
|
"universal-user-agent": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz",
|
||||||
@ -25471,6 +25953,15 @@
|
|||||||
"errno": "~0.1.7"
|
"errno": "~0.1.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"worker-rpc": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"microevent.ts": "~0.1.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"wrap-ansi": {
|
"wrap-ansi": {
|
||||||
"version": "5.1.0",
|
"version": "5.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
||||||
@ -25694,6 +26185,11 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
|
||||||
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
|
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
|
||||||
|
},
|
||||||
|
"zalgo-promise": {
|
||||||
|
"version": "1.0.46",
|
||||||
|
"resolved": "https://registry.npmjs.org/zalgo-promise/-/zalgo-promise-1.0.46.tgz",
|
||||||
|
"integrity": "sha512-tzPpQRqaQQavxl17TY98nznvmr+judUg3My7ugsUcRDbdqisYOE2z79HNNDgXnyX3eA0mf2bMOJrqHptt00npg=="
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
"i18next": "19.8.4",
|
"i18next": "19.8.4",
|
||||||
"i18next-browser-languagedetector": "6.0.1",
|
"i18next-browser-languagedetector": "6.0.1",
|
||||||
"i18next-http-backend": "1.0.23",
|
"i18next-http-backend": "1.0.23",
|
||||||
|
"iframe-resizer-react": "1.1.0",
|
||||||
"immutable": "4.0.0-rc.12",
|
"immutable": "4.0.0-rc.12",
|
||||||
"is-ci": "2.0.0",
|
"is-ci": "2.0.0",
|
||||||
"jquery": "3.5.1",
|
"jquery": "3.5.1",
|
||||||
@ -78,6 +79,7 @@
|
|||||||
"office-ui-fabric-react": "7.164.2",
|
"office-ui-fabric-react": "7.164.2",
|
||||||
"p-retry": "4.2.0",
|
"p-retry": "4.2.0",
|
||||||
"plotly.js-cartesian-dist-min": "1.52.3",
|
"plotly.js-cartesian-dist-min": "1.52.3",
|
||||||
|
"post-robot": "10.0.42",
|
||||||
"q": "1.5.1",
|
"q": "1.5.1",
|
||||||
"react": "16.13.1",
|
"react": "16.13.1",
|
||||||
"react-animate-height": "2.0.8",
|
"react-animate-height": "2.0.8",
|
||||||
@ -115,6 +117,7 @@
|
|||||||
"@types/jest": "26.0.20",
|
"@types/jest": "26.0.20",
|
||||||
"@types/memoize-one": "4.1.1",
|
"@types/memoize-one": "4.1.1",
|
||||||
"@types/node": "12.11.1",
|
"@types/node": "12.11.1",
|
||||||
|
"@types/post-robot": "10.0.1",
|
||||||
"@types/promise.prototype.finally": "2.0.3",
|
"@types/promise.prototype.finally": "2.0.3",
|
||||||
"@types/q": "1.5.1",
|
"@types/q": "1.5.1",
|
||||||
"@types/react": "17.0.3",
|
"@types/react": "17.0.3",
|
||||||
@ -146,9 +149,10 @@
|
|||||||
"fast-glob": "3.2.5",
|
"fast-glob": "3.2.5",
|
||||||
"file-loader": "2.0.0",
|
"file-loader": "2.0.0",
|
||||||
"fs-extra": "7.0.0",
|
"fs-extra": "7.0.0",
|
||||||
|
"html-inline-css-webpack-plugin": "1.11.0",
|
||||||
"html-loader": "0.5.5",
|
"html-loader": "0.5.5",
|
||||||
"html-loader-jest": "0.2.1",
|
"html-loader-jest": "0.2.1",
|
||||||
"html-webpack-plugin": "3.2.0",
|
"html-webpack-plugin": "4.5.2",
|
||||||
"jest": "25.5.4",
|
"jest": "25.5.4",
|
||||||
"jest-canvas-mock": "2.1.0",
|
"jest-canvas-mock": "2.1.0",
|
||||||
"jest-playwright-preset": "1.5.1",
|
"jest-playwright-preset": "1.5.1",
|
||||||
@ -162,6 +166,7 @@
|
|||||||
"playwright": "1.10.0",
|
"playwright": "1.10.0",
|
||||||
"prettier": "2.2.1",
|
"prettier": "2.2.1",
|
||||||
"raw-loader": "0.5.1",
|
"raw-loader": "0.5.1",
|
||||||
|
"react-dev-utils": "11.0.4",
|
||||||
"rimraf": "3.0.0",
|
"rimraf": "3.0.0",
|
||||||
"sinon": "3.2.1",
|
"sinon": "3.2.1",
|
||||||
"style-loader": "0.23.0",
|
"style-loader": "0.23.0",
|
||||||
|
68
src/CellOutputViewer/CellOutputViewer.tsx
Normal file
68
src/CellOutputViewer/CellOutputViewer.tsx
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import { createImmutableOutput, JSONObject, OnDiskOutput } from "@nteract/commutable";
|
||||||
|
// import outputs individually to avoid increasing the bundle size
|
||||||
|
import { KernelOutputError } from "@nteract/outputs/lib/components/kernel-output-error";
|
||||||
|
import { Output } from "@nteract/outputs/lib/components/output";
|
||||||
|
import { StreamText } from "@nteract/outputs/lib/components/stream-text";
|
||||||
|
import { ContentRef } from "@nteract/types";
|
||||||
|
import "bootstrap/dist/css/bootstrap.css";
|
||||||
|
import postRobot from "post-robot";
|
||||||
|
import * as React from "react";
|
||||||
|
import * as ReactDOM from "react-dom";
|
||||||
|
import "../../externals/iframeResizer.contentWindow.min.js"; // Required for iFrameResizer to work
|
||||||
|
import "../Explorer/Notebook/NotebookRenderer/base.css";
|
||||||
|
import "../Explorer/Notebook/NotebookRenderer/default.css";
|
||||||
|
import { TransformMedia } from "./TransformMedia";
|
||||||
|
|
||||||
|
export interface CellOutputViewerProps {
|
||||||
|
id: string;
|
||||||
|
contentRef: ContentRef;
|
||||||
|
hidden: boolean;
|
||||||
|
expanded: boolean;
|
||||||
|
outputs: OnDiskOutput[];
|
||||||
|
onMetadataChange: (metadata: JSONObject, mediaType: string, index?: number) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onInit = async () => {
|
||||||
|
postRobot.on(
|
||||||
|
"props",
|
||||||
|
{
|
||||||
|
window: window.parent,
|
||||||
|
domain: window.location.origin,
|
||||||
|
},
|
||||||
|
(event) => {
|
||||||
|
// Typescript definition for event is wrong. So read props by casting to <any>
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const props = (event as any).data as CellOutputViewerProps;
|
||||||
|
const outputs = (
|
||||||
|
<div
|
||||||
|
data-iframe-height
|
||||||
|
className={`nteract-cell-outputs ${props.hidden ? "hidden" : ""} ${props.expanded ? "expanded" : ""}`}
|
||||||
|
>
|
||||||
|
{props.outputs?.map((output, index) => (
|
||||||
|
<Output output={createImmutableOutput(output)} key={index}>
|
||||||
|
<TransformMedia
|
||||||
|
output_type={"display_data"}
|
||||||
|
id={props.id}
|
||||||
|
contentRef={props.contentRef}
|
||||||
|
onMetadataChange={(metadata, mediaType) => props.onMetadataChange(metadata, mediaType, index)}
|
||||||
|
/>
|
||||||
|
<TransformMedia
|
||||||
|
output_type={"execute_result"}
|
||||||
|
id={props.id}
|
||||||
|
contentRef={props.contentRef}
|
||||||
|
onMetadataChange={(metadata, mediaType) => props.onMetadataChange(metadata, mediaType, index)}
|
||||||
|
/>
|
||||||
|
<KernelOutputError />
|
||||||
|
<StreamText />
|
||||||
|
</Output>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
ReactDOM.render(outputs, document.getElementById("cellOutput"));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Entry point
|
||||||
|
window.addEventListener("load", onInit);
|
138
src/CellOutputViewer/TransformMedia.tsx
Normal file
138
src/CellOutputViewer/TransformMedia.tsx
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
import { ImmutableDisplayData, ImmutableExecuteResult, JSONObject } from "@nteract/commutable";
|
||||||
|
// import outputs individually to avoid increasing the bundle size
|
||||||
|
import { HTML } from "@nteract/outputs/lib/components/media/html";
|
||||||
|
import { Image } from "@nteract/outputs/lib/components/media/image";
|
||||||
|
import { JavaScript } from "@nteract/outputs/lib/components/media/javascript";
|
||||||
|
import { Json } from "@nteract/outputs/lib/components/media/json";
|
||||||
|
import { LaTeX } from "@nteract/outputs/lib/components/media/latex";
|
||||||
|
import { Plain } from "@nteract/outputs/lib/components/media/plain";
|
||||||
|
import { SVG } from "@nteract/outputs/lib/components/media/svg";
|
||||||
|
import { ContentRef } from "@nteract/types";
|
||||||
|
import React, { Suspense } from "react";
|
||||||
|
|
||||||
|
const EmptyTransform = (): JSX.Element => <></>;
|
||||||
|
|
||||||
|
const displayOrder = [
|
||||||
|
"application/vnd.jupyter.widget-view+json",
|
||||||
|
"application/vnd.vega.v5+json",
|
||||||
|
"application/vnd.vega.v4+json",
|
||||||
|
"application/vnd.vega.v3+json",
|
||||||
|
"application/vnd.vega.v2+json",
|
||||||
|
"application/vnd.vegalite.v4+json",
|
||||||
|
"application/vnd.vegalite.v3+json",
|
||||||
|
"application/vnd.vegalite.v2+json",
|
||||||
|
"application/vnd.vegalite.v1+json",
|
||||||
|
"application/geo+json",
|
||||||
|
"application/vnd.plotly.v1+json",
|
||||||
|
"text/vnd.plotly.v1+html",
|
||||||
|
"application/x-nteract-model-debug+json",
|
||||||
|
"application/vnd.dataresource+json",
|
||||||
|
"application/vdom.v1+json",
|
||||||
|
"application/json",
|
||||||
|
"application/javascript",
|
||||||
|
"text/html",
|
||||||
|
"text/markdown",
|
||||||
|
"text/latex",
|
||||||
|
"image/svg+xml",
|
||||||
|
"image/gif",
|
||||||
|
"image/png",
|
||||||
|
"image/jpeg",
|
||||||
|
"text/plain",
|
||||||
|
];
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
const transformsById = new Map<string, React.ComponentType<any>>([
|
||||||
|
["text/vnd.plotly.v1+html", React.lazy(() => import("@nteract/transform-plotly"))],
|
||||||
|
["application/vnd.plotly.v1+json", React.lazy(() => import("@nteract/transform-plotly"))],
|
||||||
|
["application/geo+json", EmptyTransform], // TODO: The geojson transform will likely need some work because of the basemap URL(s)
|
||||||
|
["application/x-nteract-model-debug+json", React.lazy(() => import("@nteract/transform-model-debug"))],
|
||||||
|
["application/vnd.dataresource+json", React.lazy(() => import("@nteract/data-explorer"))],
|
||||||
|
["application/vnd.jupyter.widget-view+json", React.lazy(() => import("./transforms/WidgetDisplay"))],
|
||||||
|
["application/vnd.vegalite.v1+json", React.lazy(() => import("./transforms/VegaLite1"))],
|
||||||
|
["application/vnd.vegalite.v2+json", React.lazy(() => import("./transforms/VegaLite2"))],
|
||||||
|
["application/vnd.vegalite.v3+json", React.lazy(() => import("./transforms/VegaLite3"))],
|
||||||
|
["application/vnd.vegalite.v4+json", React.lazy(() => import("./transforms/VegaLite4"))],
|
||||||
|
["application/vnd.vega.v2+json", React.lazy(() => import("./transforms/Vega2"))],
|
||||||
|
["application/vnd.vega.v3+json", React.lazy(() => import("./transforms/Vega3"))],
|
||||||
|
["application/vnd.vega.v4+json", React.lazy(() => import("./transforms/Vega4"))],
|
||||||
|
["application/vnd.vega.v5+json", React.lazy(() => import("./transforms/Vega5"))],
|
||||||
|
["application/vdom.v1+json", React.lazy(() => import("@nteract/transform-vdom"))],
|
||||||
|
["application/json", Json],
|
||||||
|
["application/javascript", JavaScript],
|
||||||
|
["text/html", HTML],
|
||||||
|
["text/markdown", React.lazy(() => import("@nteract/outputs/lib/components/media/markdown"))], // Markdown increases the bundle size so lazy load it
|
||||||
|
["text/latex", LaTeX],
|
||||||
|
["image/svg+xml", SVG],
|
||||||
|
["image/gif", Image],
|
||||||
|
["image/png", Image],
|
||||||
|
["image/jpeg", Image],
|
||||||
|
["text/plain", Plain],
|
||||||
|
]);
|
||||||
|
|
||||||
|
interface TransformMediaProps {
|
||||||
|
output_type: string;
|
||||||
|
id: string;
|
||||||
|
contentRef: ContentRef;
|
||||||
|
output?: ImmutableDisplayData | ImmutableExecuteResult;
|
||||||
|
onMetadataChange: (metadata: JSONObject, mediaType: string) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TransformMedia = (props: TransformMediaProps): JSX.Element => {
|
||||||
|
const { Media, mediaType, data, metadata } = getMediaInfo(props);
|
||||||
|
|
||||||
|
// If we had no valid result, return an empty output
|
||||||
|
if (!mediaType || !data) {
|
||||||
|
return <></>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Suspense fallback={<div>Loading...</div>}>
|
||||||
|
<Media
|
||||||
|
onMetadataChange={props.onMetadataChange}
|
||||||
|
data={data}
|
||||||
|
metadata={metadata}
|
||||||
|
contentRef={props.contentRef}
|
||||||
|
id={props.id}
|
||||||
|
/>
|
||||||
|
</Suspense>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const getMediaInfo = (props: TransformMediaProps) => {
|
||||||
|
const { output, output_type } = props;
|
||||||
|
// This component should only be used with display data and execute result
|
||||||
|
if (!output || !(output_type === "display_data" || output_type === "execute_result")) {
|
||||||
|
console.warn("connected transform media managed to get a non media bundle output");
|
||||||
|
return {
|
||||||
|
Media: EmptyTransform,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the first mediaType in the output data that we support with a handler
|
||||||
|
const mediaType = displayOrder.find(
|
||||||
|
(key) =>
|
||||||
|
Object.prototype.hasOwnProperty.call(output.data, key) &&
|
||||||
|
(Object.prototype.hasOwnProperty.call(transformsById, key) || transformsById.get(key))
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mediaType) {
|
||||||
|
const metadata = output.metadata.get(mediaType);
|
||||||
|
const data = output.data[mediaType];
|
||||||
|
|
||||||
|
const Media = transformsById.get(mediaType);
|
||||||
|
return {
|
||||||
|
Media,
|
||||||
|
mediaType,
|
||||||
|
data,
|
||||||
|
metadata,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
Media: EmptyTransform,
|
||||||
|
mediaType,
|
||||||
|
output,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default TransformMedia;
|
12
src/CellOutputViewer/cellOutputViewer.html
Normal file
12
src/CellOutputViewer/cellOutputViewer.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="height=device-height, width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Cell Output Viewer</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="cellOutput" id="cellOutput"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
src/CellOutputViewer/transforms/Vega2.ts
Normal file
1
src/CellOutputViewer/transforms/Vega2.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { Vega2 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/Vega3.ts
Normal file
1
src/CellOutputViewer/transforms/Vega3.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { Vega3 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/Vega4.ts
Normal file
1
src/CellOutputViewer/transforms/Vega4.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { Vega4 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/Vega5.ts
Normal file
1
src/CellOutputViewer/transforms/Vega5.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { Vega5 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/VegaLite1.ts
Normal file
1
src/CellOutputViewer/transforms/VegaLite1.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { VegaLite1 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/VegaLite2.ts
Normal file
1
src/CellOutputViewer/transforms/VegaLite2.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { VegaLite2 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/VegaLite3.ts
Normal file
1
src/CellOutputViewer/transforms/VegaLite3.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { VegaLite3 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/VegaLite4.ts
Normal file
1
src/CellOutputViewer/transforms/VegaLite4.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { VegaLite4 as default } from "@nteract/transform-vega";
|
1
src/CellOutputViewer/transforms/WidgetDisplay.ts
Normal file
1
src/CellOutputViewer/transforms/WidgetDisplay.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export { WidgetDisplay as default } from "@nteract/jupyter-widgets";
|
@ -34,8 +34,6 @@ import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
|
|||||||
import { userContext } from "../../UserContext";
|
import { userContext } from "../../UserContext";
|
||||||
import configureStore from "./NotebookComponent/store";
|
import configureStore from "./NotebookComponent/store";
|
||||||
import { CdbAppState, makeCdbRecord } from "./NotebookComponent/types";
|
import { CdbAppState, makeCdbRecord } from "./NotebookComponent/types";
|
||||||
import SandboxJavaScript from "./NotebookRenderer/outputs/SandboxJavaScript";
|
|
||||||
import SanitizedHTML from "./NotebookRenderer/outputs/SanitizedHTML";
|
|
||||||
|
|
||||||
export type KernelSpecsDisplay = { name: string; displayName: string };
|
export type KernelSpecsDisplay = { name: string; displayName: string };
|
||||||
|
|
||||||
@ -125,7 +123,9 @@ export class NotebookClientV2 {
|
|||||||
contents: makeContentsRecord({
|
contents: makeContentsRecord({
|
||||||
byRef: Immutable.Map<string, ContentRecord>(),
|
byRef: Immutable.Map<string, ContentRecord>(),
|
||||||
}),
|
}),
|
||||||
transforms: makeTransformsRecord({
|
transforms: userContext.features.sandboxNotebookOutputs
|
||||||
|
? undefined
|
||||||
|
: makeTransformsRecord({
|
||||||
displayOrder: Immutable.List([
|
displayOrder: Immutable.List([
|
||||||
"application/vnd.jupyter.widget-view+json",
|
"application/vnd.jupyter.widget-view+json",
|
||||||
"application/vnd.vega.v5+json",
|
"application/vnd.vega.v5+json",
|
||||||
@ -168,10 +168,8 @@ export class NotebookClientV2 {
|
|||||||
"application/vnd.vega.v5+json": NullTransform,
|
"application/vnd.vega.v5+json": NullTransform,
|
||||||
"application/vdom.v1+json": TransformVDOM,
|
"application/vdom.v1+json": TransformVDOM,
|
||||||
"application/json": Media.Json,
|
"application/json": Media.Json,
|
||||||
"application/javascript": userContext.features.sandboxNotebookOutputs
|
"application/javascript": Media.JavaScript,
|
||||||
? SandboxJavaScript
|
"text/html": Media.HTML,
|
||||||
: Media.JavaScript,
|
|
||||||
"text/html": userContext.features.sandboxNotebookOutputs ? SanitizedHTML : Media.HTML,
|
|
||||||
"text/markdown": Media.Markdown,
|
"text/markdown": Media.Markdown,
|
||||||
"text/latex": Media.LaTeX,
|
"text/latex": Media.LaTeX,
|
||||||
"image/svg+xml": Media.SVG,
|
"image/svg+xml": Media.SVG,
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
import { actions, ContentRef } from "@nteract/core";
|
import { actions, ContentRef } from "@nteract/core";
|
||||||
import { KernelOutputError, StreamText } from "@nteract/outputs";
|
|
||||||
import { Cells, CodeCell, MarkdownCell, RawCell } from "@nteract/stateful-components";
|
import { Cells, CodeCell, MarkdownCell, RawCell } from "@nteract/stateful-components";
|
||||||
import MonacoEditor from "@nteract/stateful-components/lib/inputs/connected-editors/monacoEditor";
|
import MonacoEditor from "@nteract/stateful-components/lib/inputs/connected-editors/monacoEditor";
|
||||||
import { PassedEditorProps } from "@nteract/stateful-components/lib/inputs/editor";
|
import { PassedEditorProps } from "@nteract/stateful-components/lib/inputs/editor";
|
||||||
import Prompt, { PassedPromptProps } from "@nteract/stateful-components/lib/inputs/prompt";
|
import Prompt, { PassedPromptProps } from "@nteract/stateful-components/lib/inputs/prompt";
|
||||||
import TransformMedia from "@nteract/stateful-components/lib/outputs/transform-media";
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { Dispatch } from "redux";
|
import { Dispatch } from "redux";
|
||||||
@ -14,7 +12,7 @@ import { AzureTheme } from "./AzureTheme";
|
|||||||
import "./base.css";
|
import "./base.css";
|
||||||
import "./default.css";
|
import "./default.css";
|
||||||
import "./NotebookReadOnlyRenderer.less";
|
import "./NotebookReadOnlyRenderer.less";
|
||||||
import IFrameOutputs from "./outputs/IFrameOutputs";
|
import SandboxOutputs from "./outputs/SandboxOutputs";
|
||||||
|
|
||||||
export interface NotebookRendererProps {
|
export interface NotebookRendererProps {
|
||||||
contentRef: any;
|
contentRef: any;
|
||||||
@ -27,8 +25,10 @@ export interface NotebookRendererProps {
|
|||||||
*/
|
*/
|
||||||
class NotebookReadOnlyRenderer extends React.Component<NotebookRendererProps> {
|
class NotebookReadOnlyRenderer extends React.Component<NotebookRendererProps> {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
if (!userContext.features.sandboxNotebookOutputs) {
|
||||||
loadTransform(this.props as any);
|
loadTransform(this.props as any);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private renderPrompt(id: string, contentRef: string): JSX.Element {
|
private renderPrompt(id: string, contentRef: string): JSX.Element {
|
||||||
if (this.props.hidePrompts) {
|
if (this.props.hidePrompts) {
|
||||||
@ -63,14 +63,7 @@ class NotebookReadOnlyRenderer extends React.Component<NotebookRendererProps> {
|
|||||||
{{
|
{{
|
||||||
prompt: (props: { id: string; contentRef: string }) => this.renderPrompt(props.id, props.contentRef),
|
prompt: (props: { id: string; contentRef: string }) => this.renderPrompt(props.id, props.contentRef),
|
||||||
outputs: userContext.features.sandboxNotebookOutputs
|
outputs: userContext.features.sandboxNotebookOutputs
|
||||||
? (props: any) => (
|
? () => <SandboxOutputs id={id} contentRef={contentRef} />
|
||||||
<IFrameOutputs id={id} contentRef={contentRef}>
|
|
||||||
<TransformMedia output_type={"display_data"} id={id} contentRef={contentRef} />
|
|
||||||
<TransformMedia output_type={"execute_result"} id={id} contentRef={contentRef} />
|
|
||||||
<KernelOutputError />
|
|
||||||
<StreamText />
|
|
||||||
</IFrameOutputs>
|
|
||||||
)
|
|
||||||
: undefined,
|
: undefined,
|
||||||
editor: {
|
editor: {
|
||||||
monaco: (props: PassedEditorProps) =>
|
monaco: (props: PassedEditorProps) =>
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import { CellId } from "@nteract/commutable";
|
import { CellId } from "@nteract/commutable";
|
||||||
import { CellType } from "@nteract/commutable/src";
|
import { CellType } from "@nteract/commutable/src";
|
||||||
import { actions, ContentRef } from "@nteract/core";
|
import { actions, ContentRef } from "@nteract/core";
|
||||||
import { KernelOutputError, StreamText } from "@nteract/outputs";
|
|
||||||
import { Cells, CodeCell, RawCell } from "@nteract/stateful-components";
|
import { Cells, CodeCell, RawCell } from "@nteract/stateful-components";
|
||||||
import MonacoEditor from "@nteract/stateful-components/lib/inputs/connected-editors/monacoEditor";
|
import MonacoEditor from "@nteract/stateful-components/lib/inputs/connected-editors/monacoEditor";
|
||||||
import { PassedEditorProps } from "@nteract/stateful-components/lib/inputs/editor";
|
import { PassedEditorProps } from "@nteract/stateful-components/lib/inputs/editor";
|
||||||
import TransformMedia from "@nteract/stateful-components/lib/outputs/transform-media";
|
|
||||||
import * as React from "react";
|
import * as React from "react";
|
||||||
import { DndProvider } from "react-dnd";
|
import { DndProvider } from "react-dnd";
|
||||||
import HTML5Backend from "react-dnd-html5-backend";
|
import HTML5Backend from "react-dnd-html5-backend";
|
||||||
@ -23,7 +21,7 @@ import KeyboardShortcuts from "./decorators/kbd-shortcuts";
|
|||||||
import "./default.css";
|
import "./default.css";
|
||||||
import MarkdownCell from "./markdown-cell";
|
import MarkdownCell from "./markdown-cell";
|
||||||
import "./NotebookRenderer.less";
|
import "./NotebookRenderer.less";
|
||||||
import IFrameOutputs from "./outputs/IFrameOutputs";
|
import SandboxOutputs from "./outputs/SandboxOutputs";
|
||||||
import Prompt from "./Prompt";
|
import Prompt from "./Prompt";
|
||||||
import { promptContent } from "./PromptContent";
|
import { promptContent } from "./PromptContent";
|
||||||
import StatusBar from "./StatusBar";
|
import StatusBar from "./StatusBar";
|
||||||
@ -71,7 +69,9 @@ class BaseNotebookRenderer extends React.Component<NotebookRendererProps> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
|
if (!userContext.features.sandboxNotebookOutputs) {
|
||||||
loadTransform(this.props as any);
|
loadTransform(this.props as any);
|
||||||
|
}
|
||||||
this.props.updateNotebookParentDomElt(this.props.contentRef, this.notebookRendererRef.current);
|
this.props.updateNotebookParentDomElt(this.props.contentRef, this.notebookRendererRef.current);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -109,14 +109,7 @@ class BaseNotebookRenderer extends React.Component<NotebookRendererProps> {
|
|||||||
),
|
),
|
||||||
toolbar: () => <CellToolbar id={id} contentRef={contentRef} />,
|
toolbar: () => <CellToolbar id={id} contentRef={contentRef} />,
|
||||||
outputs: userContext.features.sandboxNotebookOutputs
|
outputs: userContext.features.sandboxNotebookOutputs
|
||||||
? (props: any) => (
|
? () => <SandboxOutputs id={id} contentRef={contentRef} />
|
||||||
<IFrameOutputs id={id} contentRef={contentRef}>
|
|
||||||
<TransformMedia output_type={"display_data"} id={id} contentRef={contentRef} />
|
|
||||||
<TransformMedia output_type={"execute_result"} id={id} contentRef={contentRef} />
|
|
||||||
<KernelOutputError />
|
|
||||||
<StreamText />
|
|
||||||
</IFrameOutputs>
|
|
||||||
)
|
|
||||||
: undefined,
|
: undefined,
|
||||||
}}
|
}}
|
||||||
</CodeCell>
|
</CodeCell>
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
import { AppState, ContentRef, selectors } from "@nteract/core";
|
|
||||||
import { Output } from "@nteract/outputs";
|
|
||||||
import Immutable from "immutable";
|
|
||||||
import React from "react";
|
|
||||||
import { connect } from "react-redux";
|
|
||||||
import { SandboxFrame } from "./SandboxFrame";
|
|
||||||
|
|
||||||
// Adapted from https://github.com/nteract/nteract/blob/main/packages/stateful-components/src/outputs/index.tsx
|
|
||||||
// to add support for sandboxing using <iframe>
|
|
||||||
|
|
||||||
interface ComponentProps {
|
|
||||||
id: string;
|
|
||||||
contentRef: ContentRef;
|
|
||||||
children: React.ReactNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface StateProps {
|
|
||||||
hidden: boolean;
|
|
||||||
expanded: boolean;
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
||||||
outputs: Immutable.List<any>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class IFrameOutputs extends React.PureComponent<ComponentProps & StateProps> {
|
|
||||||
render(): JSX.Element {
|
|
||||||
const { outputs, children, hidden, expanded } = this.props;
|
|
||||||
return (
|
|
||||||
<SandboxFrame
|
|
||||||
style={{ border: "none", width: "100%" }}
|
|
||||||
sandbox="allow-downloads allow-forms allow-pointer-lock allow-same-origin allow-scripts"
|
|
||||||
>
|
|
||||||
<div className={`nteract-cell-outputs ${hidden ? "hidden" : ""} ${expanded ? "expanded" : ""}`}>
|
|
||||||
{outputs.map((output, index) => (
|
|
||||||
<Output output={output} key={index}>
|
|
||||||
{children}
|
|
||||||
</Output>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</SandboxFrame>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export const makeMapStateToProps = (
|
|
||||||
initialState: AppState,
|
|
||||||
ownProps: ComponentProps
|
|
||||||
): ((state: AppState) => StateProps) => {
|
|
||||||
const mapStateToProps = (state: AppState): StateProps => {
|
|
||||||
let outputs = Immutable.List();
|
|
||||||
let hidden = false;
|
|
||||||
let expanded = false;
|
|
||||||
|
|
||||||
const { contentRef, id } = ownProps;
|
|
||||||
const model = selectors.model(state, { contentRef });
|
|
||||||
|
|
||||||
if (model && model.type === "notebook") {
|
|
||||||
const cell = selectors.notebook.cellById(model, { id });
|
|
||||||
if (cell) {
|
|
||||||
outputs = cell.get("outputs", Immutable.List());
|
|
||||||
hidden = cell.cell_type === "code" && cell.getIn(["metadata", "jupyter", "outputs_hidden"]);
|
|
||||||
expanded = cell.cell_type === "code" && cell.getIn(["metadata", "collapsed"]) === false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return { outputs, hidden, expanded };
|
|
||||||
};
|
|
||||||
return mapStateToProps;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default connect<StateProps, void, ComponentProps, AppState>(makeMapStateToProps)(IFrameOutputs);
|
|
@ -1,69 +0,0 @@
|
|||||||
import React from "react";
|
|
||||||
import ReactDOM from "react-dom";
|
|
||||||
import { copyStyles } from "../../../../Utils/StyleUtils";
|
|
||||||
|
|
||||||
interface SandboxFrameProps {
|
|
||||||
style: React.CSSProperties;
|
|
||||||
sandbox: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface SandboxFrameState {
|
|
||||||
frame: HTMLIFrameElement;
|
|
||||||
frameBody: HTMLElement;
|
|
||||||
frameHeight: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SandboxFrame extends React.PureComponent<SandboxFrameProps, SandboxFrameState> {
|
|
||||||
private resizeObserver: ResizeObserver;
|
|
||||||
private mutationObserver: MutationObserver;
|
|
||||||
|
|
||||||
constructor(props: SandboxFrameProps) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.state = {
|
|
||||||
frame: undefined,
|
|
||||||
frameBody: undefined,
|
|
||||||
frameHeight: 0,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
render(): JSX.Element {
|
|
||||||
return (
|
|
||||||
<iframe
|
|
||||||
ref={(ele) => this.setState({ frame: ele })}
|
|
||||||
srcDoc={`<!DOCTYPE html>`}
|
|
||||||
onLoad={(event) => this.onFrameLoad(event)}
|
|
||||||
style={this.props.style}
|
|
||||||
sandbox={this.props.sandbox}
|
|
||||||
height={this.state.frameHeight}
|
|
||||||
>
|
|
||||||
{this.state.frameBody && ReactDOM.createPortal(this.props.children, this.state.frameBody)}
|
|
||||||
</iframe>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
componentWillUnmount(): void {
|
|
||||||
this.resizeObserver?.disconnect();
|
|
||||||
this.mutationObserver?.disconnect();
|
|
||||||
}
|
|
||||||
|
|
||||||
onFrameLoad(event: React.SyntheticEvent<HTMLIFrameElement, Event>): void {
|
|
||||||
const doc = (event.target as HTMLIFrameElement).contentDocument;
|
|
||||||
copyStyles(document, doc);
|
|
||||||
|
|
||||||
this.setState({ frameBody: doc.body });
|
|
||||||
|
|
||||||
this.mutationObserver = new MutationObserver(() => {
|
|
||||||
const bodyFirstElementChild = this.state.frameBody?.firstElementChild;
|
|
||||||
if (!this.resizeObserver && bodyFirstElementChild) {
|
|
||||||
this.resizeObserver = new ResizeObserver(() =>
|
|
||||||
this.setState({
|
|
||||||
frameHeight: this.state.frameBody?.firstElementChild.scrollHeight,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
this.resizeObserver.observe(bodyFirstElementChild);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.mutationObserver.observe(doc.body, { childList: true });
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
import { Media } from "@nteract/outputs";
|
|
||||||
import React from "react";
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
/**
|
|
||||||
* The JavaScript code that we would like to execute.
|
|
||||||
*/
|
|
||||||
data: string;
|
|
||||||
/**
|
|
||||||
* The media type associated with our component.
|
|
||||||
*/
|
|
||||||
mediaType: "text/javascript";
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SandboxJavaScript extends React.PureComponent<Props> {
|
|
||||||
static defaultProps = {
|
|
||||||
data: "",
|
|
||||||
mediaType: "application/javascript",
|
|
||||||
};
|
|
||||||
|
|
||||||
render(): JSX.Element {
|
|
||||||
return <Media.HTML data={`<script>${this.props.data}</script>`} />;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SandboxJavaScript;
|
|
@ -0,0 +1,132 @@
|
|||||||
|
import { JSONObject } from "@nteract/commutable";
|
||||||
|
import { outputToJS } from "@nteract/commutable/lib/v4";
|
||||||
|
import { actions, AppState, ContentRef, selectors } from "@nteract/core";
|
||||||
|
import IframeResizer from "iframe-resizer-react";
|
||||||
|
import Immutable from "immutable";
|
||||||
|
import postRobot from "post-robot";
|
||||||
|
import React from "react";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { Dispatch } from "redux";
|
||||||
|
import { CellOutputViewerProps } from "../../../../CellOutputViewer/CellOutputViewer";
|
||||||
|
|
||||||
|
// Adapted from https://github.com/nteract/nteract/blob/main/packages/stateful-components/src/outputs/index.tsx
|
||||||
|
// to add support for sandboxing using <iframe>
|
||||||
|
|
||||||
|
interface ComponentProps {
|
||||||
|
id: string;
|
||||||
|
contentRef: ContentRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface StateProps {
|
||||||
|
hidden: boolean;
|
||||||
|
expanded: boolean;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
outputs: Immutable.List<any>;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DispatchProps {
|
||||||
|
onMetadataChange?: (metadata: JSONObject, mediaType: string, index?: number) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SandboxOutputs extends React.PureComponent<ComponentProps & StateProps & DispatchProps> {
|
||||||
|
private childWindow: Window;
|
||||||
|
|
||||||
|
render(): JSX.Element {
|
||||||
|
// Using min-width to set the width of the iFrame, works around an issue in iOS that can prevent the iFrame from sizing correctly.
|
||||||
|
return (
|
||||||
|
<IframeResizer
|
||||||
|
checkOrigin={false}
|
||||||
|
loading="lazy"
|
||||||
|
heightCalculationMethod="taggedElement"
|
||||||
|
onLoad={(event) => this.handleFrameLoad(event)}
|
||||||
|
src="./cellOutputViewer.html"
|
||||||
|
style={{ height: "1px", width: "1px", minWidth: "100%", border: "none" }}
|
||||||
|
sandbox="allow-downloads allow-popups allow-forms allow-pointer-lock allow-scripts allow-popups-to-escape-sandbox"
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
handleFrameLoad(event: React.SyntheticEvent<HTMLIFrameElement, Event>): void {
|
||||||
|
this.childWindow = (event.target as HTMLIFrameElement).contentWindow;
|
||||||
|
this.sendPropsToFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPropsToFrame(): void {
|
||||||
|
if (!this.childWindow) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const props: CellOutputViewerProps = {
|
||||||
|
id: this.props.id,
|
||||||
|
contentRef: this.props.contentRef,
|
||||||
|
hidden: this.props.hidden,
|
||||||
|
expanded: this.props.expanded,
|
||||||
|
outputs: this.props.outputs.toArray().map((output) => outputToJS(output)),
|
||||||
|
onMetadataChange: this.props.onMetadataChange,
|
||||||
|
};
|
||||||
|
|
||||||
|
postRobot.send(this.childWindow, "props", props);
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidMount(): void {
|
||||||
|
this.sendPropsToFrame();
|
||||||
|
}
|
||||||
|
|
||||||
|
componentDidUpdate(): void {
|
||||||
|
this.sendPropsToFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const makeMapStateToProps = (
|
||||||
|
initialState: AppState,
|
||||||
|
ownProps: ComponentProps
|
||||||
|
): ((state: AppState) => StateProps) => {
|
||||||
|
const mapStateToProps = (state: AppState): StateProps => {
|
||||||
|
let outputs = Immutable.List();
|
||||||
|
let hidden = false;
|
||||||
|
let expanded = false;
|
||||||
|
|
||||||
|
const { contentRef, id } = ownProps;
|
||||||
|
const model = selectors.model(state, { contentRef });
|
||||||
|
|
||||||
|
if (model && model.type === "notebook") {
|
||||||
|
const cell = selectors.notebook.cellById(model, { id });
|
||||||
|
if (cell) {
|
||||||
|
outputs = cell.get("outputs", Immutable.List());
|
||||||
|
hidden = cell.cell_type === "code" && cell.getIn(["metadata", "jupyter", "outputs_hidden"]);
|
||||||
|
expanded = cell.cell_type === "code" && cell.getIn(["metadata", "collapsed"]) === false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { outputs, hidden, expanded };
|
||||||
|
};
|
||||||
|
return mapStateToProps;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const makeMapDispatchToProps = (
|
||||||
|
initialDispath: Dispatch,
|
||||||
|
ownProps: ComponentProps
|
||||||
|
): ((dispatch: Dispatch) => DispatchProps) => {
|
||||||
|
const { id, contentRef } = ownProps;
|
||||||
|
const mapDispatchToProps = (dispatch: Dispatch) => {
|
||||||
|
return {
|
||||||
|
onMetadataChange: (metadata: JSONObject, mediaType: string, index?: number) => {
|
||||||
|
dispatch(
|
||||||
|
actions.updateOutputMetadata({
|
||||||
|
id,
|
||||||
|
contentRef,
|
||||||
|
metadata,
|
||||||
|
index: index || 0,
|
||||||
|
mediaType,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return mapDispatchToProps;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect<StateProps, DispatchProps, ComponentProps, AppState>(
|
||||||
|
makeMapStateToProps,
|
||||||
|
makeMapDispatchToProps
|
||||||
|
)(SandboxOutputs);
|
@ -1,38 +0,0 @@
|
|||||||
import { Media } from "@nteract/outputs";
|
|
||||||
import React from "react";
|
|
||||||
import sanitizeHtml from "sanitize-html";
|
|
||||||
|
|
||||||
interface Props {
|
|
||||||
/**
|
|
||||||
* The HTML string that will be rendered.
|
|
||||||
*/
|
|
||||||
data: string;
|
|
||||||
/**
|
|
||||||
* The media type associated with the HTML
|
|
||||||
* string. This defaults to text/html.
|
|
||||||
*/
|
|
||||||
mediaType: "text/html";
|
|
||||||
}
|
|
||||||
|
|
||||||
export class SanitizedHTML extends React.PureComponent<Props> {
|
|
||||||
static defaultProps = {
|
|
||||||
data: "",
|
|
||||||
mediaType: "text/html",
|
|
||||||
};
|
|
||||||
|
|
||||||
render(): JSX.Element {
|
|
||||||
return <Media.HTML data={sanitize(this.props.data)} />;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function sanitize(html: string): string {
|
|
||||||
return sanitizeHtml(html, {
|
|
||||||
allowedTags: false, // allow all tags
|
|
||||||
allowedAttributes: false, // allow all attrs
|
|
||||||
transformTags: {
|
|
||||||
iframe: "iframe-disabled", // disable iframes
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export default SanitizedHTML;
|
|
@ -2,6 +2,8 @@ require("dotenv/config");
|
|||||||
const path = require("path");
|
const path = require("path");
|
||||||
const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
|
const MonacoWebpackPlugin = require("monaco-editor-webpack-plugin");
|
||||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||||
|
const InlineChunkHtmlPlugin = require("react-dev-utils/InlineChunkHtmlPlugin");
|
||||||
|
const HTMLInlineCSSWebpackPlugin = require("html-inline-css-webpack-plugin").default;
|
||||||
const { EnvironmentPlugin } = require("webpack");
|
const { EnvironmentPlugin } = require("webpack");
|
||||||
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
|
||||||
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
||||||
@ -149,6 +151,11 @@ module.exports = function (env = {}, argv = {}) {
|
|||||||
template: "src/Controls/Heatmap/Heatmap.html",
|
template: "src/Controls/Heatmap/Heatmap.html",
|
||||||
chunks: ["heatmap"],
|
chunks: ["heatmap"],
|
||||||
}),
|
}),
|
||||||
|
new HtmlWebpackPlugin({
|
||||||
|
filename: "cellOutputViewer.html",
|
||||||
|
template: "src/CellOutputViewer/cellOutputViewer.html",
|
||||||
|
chunks: ["cellOutputViewer"],
|
||||||
|
}),
|
||||||
new HtmlWebpackPlugin({
|
new HtmlWebpackPlugin({
|
||||||
filename: "notebookViewer.html",
|
filename: "notebookViewer.html",
|
||||||
template: "src/NotebookViewer/notebookViewer.html",
|
template: "src/NotebookViewer/notebookViewer.html",
|
||||||
@ -169,6 +176,10 @@ module.exports = function (env = {}, argv = {}) {
|
|||||||
template: "src/SelfServe/selfServe.html",
|
template: "src/SelfServe/selfServe.html",
|
||||||
chunks: ["selfServe"],
|
chunks: ["selfServe"],
|
||||||
}),
|
}),
|
||||||
|
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/cellOutputViewer/]),
|
||||||
|
new HTMLInlineCSSWebpackPlugin({
|
||||||
|
filter: (fileName) => fileName.includes("cellOutputViewer"),
|
||||||
|
}),
|
||||||
new MonacoWebpackPlugin(),
|
new MonacoWebpackPlugin(),
|
||||||
new CopyWebpackPlugin({
|
new CopyWebpackPlugin({
|
||||||
patterns: [{ from: "DataExplorer.nuspec" }, { from: "web.config" }, { from: "quickstart/*.zip" }],
|
patterns: [{ from: "DataExplorer.nuspec" }, { from: "web.config" }, { from: "quickstart/*.zip" }],
|
||||||
@ -190,6 +201,7 @@ module.exports = function (env = {}, argv = {}) {
|
|||||||
testExplorer: "./test/testExplorer/TestExplorer.ts",
|
testExplorer: "./test/testExplorer/TestExplorer.ts",
|
||||||
heatmap: "./src/Controls/Heatmap/Heatmap.ts",
|
heatmap: "./src/Controls/Heatmap/Heatmap.ts",
|
||||||
terminal: "./src/Terminal/index.ts",
|
terminal: "./src/Terminal/index.ts",
|
||||||
|
cellOutputViewer: "./src/CellOutputViewer/CellOutputViewer.tsx",
|
||||||
notebookViewer: "./src/NotebookViewer/NotebookViewer.tsx",
|
notebookViewer: "./src/NotebookViewer/NotebookViewer.tsx",
|
||||||
galleryViewer: "./src/GalleryViewer/GalleryViewer.tsx",
|
galleryViewer: "./src/GalleryViewer/GalleryViewer.tsx",
|
||||||
selfServe: "./src/SelfServe/SelfServe.tsx",
|
selfServe: "./src/SelfServe/SelfServe.tsx",
|
||||||
@ -233,6 +245,7 @@ module.exports = function (env = {}, argv = {}) {
|
|||||||
watchOptions: isCI ? { poll: 24 * 60 * 60 * 1000 } : {},
|
watchOptions: isCI ? { poll: 24 * 60 * 60 * 1000 } : {},
|
||||||
devServer: {
|
devServer: {
|
||||||
hot: false,
|
hot: false,
|
||||||
|
disableHostCheck: true,
|
||||||
inline: !isCI,
|
inline: !isCI,
|
||||||
liveReload: !isCI,
|
liveReload: !isCI,
|
||||||
https: true,
|
https: true,
|
||||||
|
Loading…
Reference in New Issue
Block a user