diff --git a/package-lock.json b/package-lock.json index d0859fab72..3eabe81a6c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.3.13", "license": "ISC", "dependencies": { + "@types/node": "^20.11.3", "@types/semver": "^7.5.6", "@types/tar": "^6.1.10", "@xmldom/xmldom": "^0.8.10", @@ -1596,9 +1597,9 @@ } }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "20.11.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.3.tgz", + "integrity": "sha512-nrlmbvGPNGaj84IJZXMPhQuCMEVTT/hXZMJJG/aIqVL9fKxqk814sGGtJA4GI6hpJSLQjpi6cn0Qx9eOf9SDVg==", "dependencies": { "undici-types": "~5.26.4" } diff --git a/src/cli/repl/core.ts b/src/cli/repl/core.ts index 0cbaf159d9..6183793ac3 100644 --- a/src/cli/repl/core.ts +++ b/src/cli/repl/core.ts @@ -4,11 +4,10 @@ * @module */ import { RShell } from '../../r-bridge' -import readline from 'readline/promises' import { bold } from '../../statistics' import { prompt } from './prompt' import { commandNames, getCommand, ReplOutput, standardReplOutput } from './commands' -import { ReadLineOptions } from 'node:readline' +import * as readline from 'node:readline' import { splitAtEscapeSensitive } from '../../util/args' import { executeRShellCommand } from './commands/execute' @@ -21,7 +20,7 @@ export function replCompleter(line: string): [string[], string] { return [replCompleterKeywords.filter(k => k.startsWith(line)), line] } -export const DEFAULT_REPL_READLINE_CONFIGURATION: ReadLineOptions = { +export const DEFAULT_REPL_READLINE_CONFIGURATION: readline.ReadLineOptions = { input: process.stdin, output: process.stdout, tabSize: 4, @@ -81,8 +80,14 @@ export async function repl(shell = new RShell({ revive: 'always' }), rl = readli // the incredible repl :D, we kill it with ':quit' // eslint-disable-next-line no-constant-condition,@typescript-eslint/no-unnecessary-condition while(true) { - const answer: string = await rl.question(prompt()) - - await replProcessAnswer(output, answer, shell) + await new Promise((resolve, reject) => { + rl.question(prompt(), answer => { + rl.pause() + replProcessAnswer(output, answer, shell).then(() => { + rl.resume() + resolve() + }).catch(reject) + }) + }) } } diff --git a/src/cli/repl/server/messages/analysis.ts b/src/cli/repl/server/messages/analysis.ts index d20ea64486..98059f1080 100644 --- a/src/cli/repl/server/messages/analysis.ts +++ b/src/cli/repl/server/messages/analysis.ts @@ -1,6 +1,6 @@ import { IdMessageBase, MessageDefinition } from './messages' import { LAST_PER_FILE_STEP, StepResults } from '../../../../core' -import Joi from 'joi' +import * as Joi from 'joi' import { ControlFlowInformation } from '../../../../util/cfg' /** diff --git a/src/cli/repl/server/messages/messages.ts b/src/cli/repl/server/messages/messages.ts index d60899101a..a992554429 100644 --- a/src/cli/repl/server/messages/messages.ts +++ b/src/cli/repl/server/messages/messages.ts @@ -3,7 +3,7 @@ * * @module */ -import Joi from 'joi' +import * as Joi from 'joi' import { FlowrHelloResponseMessage } from './hello' import { FileAnalysisRequestMessage, FileAnalysisResponseMessageJson } from './analysis' import { ExecuteEndMessage, ExecuteIntermediateResponseMessage, ExecuteRequestMessage } from './repl' diff --git a/src/cli/repl/server/messages/repl.ts b/src/cli/repl/server/messages/repl.ts index 48c5e2cafd..4f5473fb79 100644 --- a/src/cli/repl/server/messages/repl.ts +++ b/src/cli/repl/server/messages/repl.ts @@ -1,5 +1,5 @@ import { IdMessageBase, MessageDefinition } from './messages' -import Joi from 'joi' +import * as Joi from 'joi' /** * Request the execution of the given expression as a REPL statement. diff --git a/src/cli/repl/server/messages/slice.ts b/src/cli/repl/server/messages/slice.ts index 89b596b163..eaf296fa77 100644 --- a/src/cli/repl/server/messages/slice.ts +++ b/src/cli/repl/server/messages/slice.ts @@ -1,7 +1,7 @@ import { SlicingCriteria } from '../../../../slicing' import { LAST_PER_FILE_STEP, LAST_STEP, StepResults } from '../../../../core' import { IdMessageBase, MessageDefinition } from './messages' -import Joi from 'joi' +import * as Joi from 'joi' /** * Can only be sent after you have sent the {@link FileAnalysisRequestMessage}. diff --git a/src/cli/repl/server/validate.ts b/src/cli/repl/server/validate.ts index 5babee8b39..acc36bbbef 100644 --- a/src/cli/repl/server/validate.ts +++ b/src/cli/repl/server/validate.ts @@ -1,4 +1,4 @@ -import Joi from 'joi' +import * as Joi from 'joi' import { sendMessage } from './send' import { baseMessage, FlowrMessage, IdMessageBase, MessageDefinition } from './messages/messages' import { FlowrErrorMessage } from './messages/error'