summaryrefslogtreecommitdiff
path: root/cli/js2/40_repl.js
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js2/40_repl.js')
-rw-r--r--cli/js2/40_repl.js186
1 files changed, 0 insertions, 186 deletions
diff --git a/cli/js2/40_repl.js b/cli/js2/40_repl.js
deleted file mode 100644
index 4966c45be..000000000
--- a/cli/js2/40_repl.js
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
-
-((window) => {
- const core = window.Deno.core;
- const exit = window.__bootstrap.os.exit;
- const version = window.__bootstrap.version.version;
- const dispatchJson = window.__bootstrap.dispatchJson;
- const close = window.__bootstrap.resources.close;
- const inspectArgs = window.__bootstrap.console.inspectArgs;
-
- function opStartRepl(historyFile) {
- return dispatchJson.sendSync("op_repl_start", { historyFile });
- }
-
- function opReadline(rid, prompt) {
- return dispatchJson.sendAsync("op_repl_readline", { rid, prompt });
- }
-
- function replLog(...args) {
- core.print(inspectArgs(args) + "\n");
- }
-
- function replError(...args) {
- core.print(inspectArgs(args) + "\n", true);
- }
-
- // Error messages that allow users to continue input
- // instead of throwing an error to REPL
- // ref: https://github.com/v8/v8/blob/master/src/message-template.h
- // TODO(kevinkassimo): this list might not be comprehensive
- const recoverableErrorMessages = [
- "Unexpected end of input", // { or [ or (
- "Missing initializer in const declaration", // const a
- "Missing catch or finally after try", // try {}
- "missing ) after argument list", // console.log(1
- "Unterminated template literal", // `template
- // TODO(kevinkassimo): need a parser to handling errors such as:
- // "Missing } in template expression" // `${ or `${ a 123 }`
- ];
-
- function isRecoverableError(e) {
- return recoverableErrorMessages.includes(e.message);
- }
-
- // Returns `true` if `close()` is called in REPL.
- // We should quit the REPL when this function returns `true`.
- function isCloseCalled() {
- return globalThis.closed;
- }
-
- let lastEvalResult = undefined;
- let lastThrownError = undefined;
-
- // Evaluate code.
- // Returns true if code is consumed (no error/irrecoverable error).
- // Returns false if error is recoverable
- function evaluate(code) {
- // each evalContext is a separate function body, and we want strict mode to
- // work, so we should ensure that the code starts with "use strict"
- const [result, errInfo] = core.evalContext(`"use strict";\n\n${code}`);
- if (!errInfo) {
- // when a function is eval'ed with just "use strict" sometimes the result
- // is "use strict" which should be discarded
- lastEvalResult = typeof result === "string" && result === "use strict"
- ? undefined
- : result;
- if (!isCloseCalled()) {
- replLog(lastEvalResult);
- }
- } else if (errInfo.isCompileError && isRecoverableError(errInfo.thrown)) {
- // Recoverable compiler error
- return false; // don't consume code.
- } else {
- lastThrownError = errInfo.thrown;
- if (errInfo.isNativeError) {
- const formattedError = core.formatError(errInfo.thrown);
- replError(formattedError);
- } else {
- replError("Thrown:", errInfo.thrown);
- }
- }
- return true;
- }
-
- async function replLoop() {
- const { console } = globalThis;
-
- const historyFile = "deno_history.txt";
- const rid = opStartRepl(historyFile);
-
- const quitRepl = (exitCode) => {
- // Special handling in case user calls deno.close(3).
- try {
- close(rid); // close signals Drop on REPL and saves history.
- } catch {}
- exit(exitCode);
- };
-
- // Configure globalThis._ to give the last evaluation result.
- Object.defineProperty(globalThis, "_", {
- configurable: true,
- get: () => lastEvalResult,
- set: (value) => {
- Object.defineProperty(globalThis, "_", {
- value: value,
- writable: true,
- enumerable: true,
- configurable: true,
- });
- console.log("Last evaluation result is no longer saved to _.");
- },
- });
-
- // Configure globalThis._error to give the last thrown error.
- Object.defineProperty(globalThis, "_error", {
- configurable: true,
- get: () => lastThrownError,
- set: (value) => {
- Object.defineProperty(globalThis, "_error", {
- value: value,
- writable: true,
- enumerable: true,
- configurable: true,
- });
- console.log("Last thrown error is no longer saved to _error.");
- },
- });
-
- replLog(`Deno ${version.deno}`);
- replLog("exit using ctrl+d or close()");
-
- while (true) {
- if (isCloseCalled()) {
- quitRepl(0);
- }
-
- let code = "";
- // Top level read
- try {
- code = await opReadline(rid, "> ");
- if (code.trim() === "") {
- continue;
- }
- } catch (err) {
- if (err.message === "EOF") {
- quitRepl(0);
- } else {
- // If interrupted, don't print error.
- if (err.message !== "Interrupted") {
- // e.g. this happens when we have deno.close(3).
- // We want to display the problem.
- const formattedError = core.formatError(err);
- replError(formattedError);
- }
- // Quit REPL anyways.
- quitRepl(1);
- }
- }
- // Start continued read
- while (!evaluate(code)) {
- code += "\n";
- try {
- code += await opReadline(rid, " ");
- } catch (err) {
- // If interrupted on continued read,
- // abort this read instead of quitting.
- if (err.message === "Interrupted") {
- break;
- } else if (err.message === "EOF") {
- quitRepl(0);
- } else {
- // e.g. this happens when we have deno.close(3).
- // We want to display the problem.
- const formattedError = core.formatError(err);
- replError(formattedError);
- quitRepl(1);
- }
- }
- }
- }
- }
-
- window.__bootstrap.repl = {
- replLoop,
- };
-})(this);