From e1d6df08d6c249450b9a5918525718f1a1be9eca Mon Sep 17 00:00:00 2001 From: Diogo Mafra Date: Thu, 27 May 2021 22:30:18 -0300 Subject: [PATCH 01/15] wip: running custom code --- package-lock.json | 65 +++++++++++++++++++++++++++ package.json | 4 ++ src/Playground.res | 86 +++++++++++++++++++++++++++++++++++- src/ffi/srcdoc.html | 61 +++++++++++++++++++++++++ src/ffi/transpile-to-eval.js | 37 ++++++++++++++++ 5 files changed, 251 insertions(+), 2 deletions(-) create mode 100644 src/ffi/srcdoc.html create mode 100644 src/ffi/transpile-to-eval.js diff --git a/package-lock.json b/package-lock.json index 60ae963dc..bf9814379 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,13 @@ "@mdx-js/loader": "^2.3.0", "@rescript/react": "^0.10.3", "@ryyppy/rescript-promise": "2.1.0", + "acorn": "^8.2.4", "codemirror": "^5.54.0", "docson": "^2.1.0", + "escodegen": "^2.0.0", "eslint-config-next": "^13.1.1", + "esm": "^3.2.25", + "estree-walker": "^3.0.0", "fuse.js": "^6.4.3", "gentype": "^3.44.0", "glob": "^7.1.4", @@ -2967,6 +2971,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.46.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", @@ -3374,6 +3407,14 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "peer": true }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "engines": { + "node": ">=6" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -12490,6 +12531,25 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "peer": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + } + } + }, "eslint": { "version": "8.46.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", @@ -12781,6 +12841,11 @@ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==" }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, "espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", diff --git a/package.json b/package.json index 4a279938e..7cb32b5b7 100644 --- a/package.json +++ b/package.json @@ -19,9 +19,13 @@ "@mdx-js/loader": "^2.3.0", "@rescript/react": "^0.10.3", "@ryyppy/rescript-promise": "2.1.0", + "acorn": "^8.2.4", "codemirror": "^5.54.0", "docson": "^2.1.0", + "escodegen": "^2.0.0", "eslint-config-next": "^13.1.1", + "esm": "^3.2.25", + "estree-walker": "^3.0.0", "fuse.js": "^6.4.3", "gentype": "^3.44.0", "glob": "^7.1.4", diff --git a/src/Playground.res b/src/Playground.res index 4ae260543..fab7b1bd1 100644 --- a/src/Playground.res +++ b/src/Playground.res @@ -22,7 +22,7 @@ open CompilerManagerHook module Api = RescriptCompilerApi type layout = Column | Row -type tab = JavaScript | Problems | Settings +type tab = JavaScript | Problems | Settings | Result let breakingPoint = 1024 module DropdownSelect = { @@ -1276,6 +1276,82 @@ module OutputPanel = { {HighlightJs.renderHLJS(~code, ~darkmode=true, ~lang="js", ())} + module Transpiler = { + @module("./ffi/transpile-to-eval") external transpile: string => string = "default" + + let srcdoc = ` + + + + + + + Document + + + +
+ + + + + + ` + type document + type contentWindow = { + @uncurry + postMessage: (. string, string) => unit, + } + type element = {contentWindow: option} + @send external getElementById: (document, string) => element = "getElementById" + @val external doc: document = "document" + } + + let runCode = () => { + let iframeWin = Transpiler.getElementById(Transpiler.doc, "iframe-eval").contentWindow + switch iframeWin { + | Some(win) => win.postMessage(. Transpiler.transpile(code), "*") + | None => () + } + } + + let outputPane: React.element = switch compilerState { + | Compiling(ready, _) + | Ready(ready) => + switch ready.result { + | Comp(Success(_)) + | Conv(Success(_)) => + + +