From e53679ff26a4cc1773717a7726ba3dce52483c85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Grzegorz=20Ku=C4=87mierz?= Date: Tue, 15 Nov 2022 11:44:04 +0100 Subject: [PATCH] add console.log automaticaly to 1-lvl expressions --- package-lock.json | 111 ++++++++++++++++++++++++++++++++++++++--- package.json | 1 + src/file.worker.js | 4 +- src/utils/utils.mjs | 37 ++++++++++++++ src/views/HomeView.vue | 3 ++ 5 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 src/utils/utils.mjs diff --git a/package-lock.json b/package-lock.json index c3a5a44..faec3c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,20 @@ { - "name": "instacode-app", + "name": "Instacode", "version": "0.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "instacode-app", + "name": "Instacode", "version": "0.0.0", "dependencies": { "@codemirror/lang-javascript": "^6.1.1", "@codemirror/theme-one-dark": "^6.1.0", "@gkucmierz/utils": "^1.12.1", + "abstract-syntax-tree": "^2.20.6", "codemirror": "^6.0.1", "javascript-stringify": "^2.1.0", + "meriyah": "^4.3.3", "normalize.css": "^8.0.1", "primevue": "^3.18.0", "vue": "^3.2.41", @@ -2269,6 +2271,30 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" }, + "node_modules/abstract-syntax-tree": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/abstract-syntax-tree/-/abstract-syntax-tree-2.20.6.tgz", + "integrity": "sha512-3ziZ1Z8XqERIBoe6gv1G1YOqMeEA9JkmUElVzMj4BscwpYJ82SwePXPK6RU//bDZaOzX+eTvHLm1rX+yzCJdSg==", + "dependencies": { + "ast-types": "0.14.2", + "astring": "^1.8.1", + "esquery": "^1.4.0", + "estraverse": "^5.3.0", + "meriyah": "^4.2.1", + "source-map": "0.7.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/abstract-syntax-tree/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, "node_modules/acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -2336,6 +2362,25 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/astring": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", + "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -3007,7 +3052,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -3031,7 +3075,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -3970,6 +4013,14 @@ "node": ">= 8" } }, + "node_modules/meriyah": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.3.tgz", + "integrity": "sha512-7+EKEzAp0Gvp739Dv9F6ci9FXqqAz4QDAPVaLt15s9UF9gwQLwspqQzmoGjbavnTiFXZ5hf+EDdu5MtlkMCZfA==", + "engines": { + "node": ">=10.4.0" + } + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -4864,6 +4915,11 @@ "punycode": "^2.1.0" } }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -7183,6 +7239,26 @@ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.41.tgz", "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==" }, + "abstract-syntax-tree": { + "version": "2.20.6", + "resolved": "https://registry.npmjs.org/abstract-syntax-tree/-/abstract-syntax-tree-2.20.6.tgz", + "integrity": "sha512-3ziZ1Z8XqERIBoe6gv1G1YOqMeEA9JkmUElVzMj4BscwpYJ82SwePXPK6RU//bDZaOzX+eTvHLm1rX+yzCJdSg==", + "requires": { + "ast-types": "0.14.2", + "astring": "^1.8.1", + "esquery": "^1.4.0", + "estraverse": "^5.3.0", + "meriyah": "^4.2.1", + "source-map": "0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, "acorn": { "version": "8.8.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", @@ -7229,6 +7305,19 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "ast-types": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.14.2.tgz", + "integrity": "sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==", + "requires": { + "tslib": "^2.0.1" + } + }, + "astring": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.3.tgz", + "integrity": "sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==" + }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -7718,7 +7807,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, "requires": { "estraverse": "^5.1.0" } @@ -7735,8 +7823,7 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" }, "estree-walker": { "version": "2.0.2", @@ -8433,6 +8520,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, + "meriyah": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.3.tgz", + "integrity": "sha512-7+EKEzAp0Gvp739Dv9F6ci9FXqqAz4QDAPVaLt15s9UF9gwQLwspqQzmoGjbavnTiFXZ5hf+EDdu5MtlkMCZfA==" + }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -9059,6 +9151,11 @@ "punycode": "^2.1.0" } }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 11d06d5..bbf5cd8 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@gkucmierz/utils": "^1.12.1", "codemirror": "^6.0.1", "javascript-stringify": "^2.1.0", + "meriyah": "^4.3.3", "normalize.css": "^8.0.1", "primevue": "^3.18.0", "vue": "^3.2.41", diff --git a/src/file.worker.js b/src/file.worker.js index 1320788..b24a1e5 100644 --- a/src/file.worker.js +++ b/src/file.worker.js @@ -3,6 +3,8 @@ import { stringify } from 'javascript-stringify'; import { MAX_DATA_SIZE } from './app.config'; import { getType } from '@gkucmierz/utils/src/get-type'; +import { addDefaultLog } from './utils/utils'; + const log = console.log; console.log = (...a) => l(a); console.error = a => e(a); @@ -61,7 +63,7 @@ const e = err => { addEventListener('message', ({ data }) => { try { - const code = new Function(data); + const code = new Function(addDefaultLog(data)); code(); } catch (e) { console.error(e); diff --git a/src/utils/utils.mjs b/src/utils/utils.mjs new file mode 100644 index 0000000..bc2654b --- /dev/null +++ b/src/utils/utils.mjs @@ -0,0 +1,37 @@ + +import { parseScript } from 'meriyah'; + +export const addDefaultLog = code => { + const lines = code.split('\n'); + const tree = parseScript(code, { loc: true }); + + const insert = ({ line, column }, str, trim = false) => { + const l = lines[line-1]; + lines[line-1] = [ + trim ? l.substr(0, column).replace(/;$/, '') : l.substr(0, column), + str, + l.substr(column) + ].join(''); + }; + + const exprs = (tree.body + .filter(node => node.type === 'ExpressionStatement') + .filter(node => { + const expr = node.expression; + if (expr.type !== 'CallExpression') return true; + const callee = expr.callee; + if (callee.type !== 'MemberExpression') return true; + if (callee.object.type !== 'Identifier') return true; + if (callee.object.name !== 'console') return true; + return false; + }) + ); + + exprs.map(expr => { + const { start, end } = expr.loc; + insert(end, ');', true); + insert(start, 'console.log('); + }); + + return lines.join('\n'); +}; diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 15cfc44..66aac17 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -20,6 +20,9 @@ export default defineComponent({ }, data() { const code = ` +'Hello World!'; + +2n ** 42n; for (let i = 0; i < 42; ++i) { console.log(i);