@eagleoutice/flowr 1.3.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +27 -0
- package/benchmark/benchmark-slicer.js +223 -0
- package/benchmark/index.d.ts +3 -0
- package/benchmark/index.js +20 -0
- package/benchmark/slicer.d.ts +100 -0
- package/benchmark/slicer.js +223 -0
- package/benchmark/stats/index.d.ts +10 -0
- package/benchmark/stats/index.js +27 -0
- package/benchmark/stats/print.d.ts +7 -0
- package/benchmark/stats/print.js +157 -0
- package/benchmark/stats/stats.d.ts +41 -0
- package/benchmark/stats/stats.js +6 -0
- package/benchmark/stopwatch.d.ts +35 -0
- package/benchmark/stopwatch.js +79 -0
- package/cli/benchmark-app.d.ts +9 -0
- package/cli/benchmark-app.js +52 -0
- package/cli/benchmark-helper-app.d.ts +7 -0
- package/cli/benchmark-helper-app.js +60 -0
- package/cli/common/features.d.ts +3 -0
- package/cli/common/features.js +30 -0
- package/cli/common/index.d.ts +2 -0
- package/cli/common/index.js +19 -0
- package/cli/common/options.d.ts +20 -0
- package/cli/common/options.js +82 -0
- package/cli/common/script.d.ts +21 -0
- package/cli/common/script.js +61 -0
- package/cli/common/scripts-info.d.ts +24 -0
- package/cli/common/scripts-info.js +69 -0
- package/cli/export-quads-app.d.ts +7 -0
- package/cli/export-quads-app.js +46 -0
- package/cli/repl/commands/cfg.d.ts +3 -0
- package/cli/repl/commands/cfg.js +37 -0
- package/cli/repl/commands/commands.d.ts +11 -0
- package/cli/repl/commands/commands.js +103 -0
- package/cli/repl/commands/dataflow.d.ts +3 -0
- package/cli/repl/commands/dataflow.js +34 -0
- package/cli/repl/commands/execute.d.ts +4 -0
- package/cli/repl/commands/execute.js +27 -0
- package/cli/repl/commands/index.d.ts +2 -0
- package/cli/repl/commands/index.js +19 -0
- package/cli/repl/commands/main.d.ts +39 -0
- package/cli/repl/commands/main.js +14 -0
- package/cli/repl/commands/normalize.d.ts +3 -0
- package/cli/repl/commands/normalize.js +34 -0
- package/cli/repl/commands/parse.d.ts +2 -0
- package/cli/repl/commands/parse.js +109 -0
- package/cli/repl/commands/quit.d.ts +2 -0
- package/cli/repl/commands/quit.js +12 -0
- package/cli/repl/commands/version.d.ts +16 -0
- package/cli/repl/commands/version.js +33 -0
- package/cli/repl/core.d.ts +41 -0
- package/cli/repl/core.js +89 -0
- package/cli/repl/execute.d.ts +28 -0
- package/cli/repl/execute.js +79 -0
- package/cli/repl/index.d.ts +5 -0
- package/cli/repl/index.js +22 -0
- package/cli/repl/prompt.d.ts +2 -0
- package/cli/repl/prompt.js +9 -0
- package/cli/repl/server/connection.d.ts +21 -0
- package/cli/repl/server/connection.js +217 -0
- package/cli/repl/server/messages/analysis.d.ts +71 -0
- package/cli/repl/server/messages/analysis.js +21 -0
- package/cli/repl/server/messages/error.d.ts +11 -0
- package/cli/repl/server/messages/error.js +3 -0
- package/cli/repl/server/messages/hello.d.ts +20 -0
- package/cli/repl/server/messages/hello.js +3 -0
- package/cli/repl/server/messages/index.d.ts +1 -0
- package/cli/repl/server/messages/index.js +3 -0
- package/cli/repl/server/messages/messages.d.ts +35 -0
- package/cli/repl/server/messages/messages.js +20 -0
- package/cli/repl/server/messages/repl.d.ts +33 -0
- package/cli/repl/server/messages/repl.js +17 -0
- package/cli/repl/server/messages/slice.d.ts +25 -0
- package/cli/repl/server/messages/slice.js +17 -0
- package/cli/repl/server/net.d.ts +33 -0
- package/cli/repl/server/net.js +24 -0
- package/cli/repl/server/send.d.ts +4 -0
- package/cli/repl/server/send.js +18 -0
- package/cli/repl/server/server.d.ts +20 -0
- package/cli/repl/server/server.js +66 -0
- package/cli/repl/server/validate.d.ts +15 -0
- package/cli/repl/server/validate.js +34 -0
- package/cli/slicer-app.d.ts +11 -0
- package/cli/slicer-app.js +81 -0
- package/cli/statistics-app.d.ts +11 -0
- package/cli/statistics-app.js +98 -0
- package/cli/statistics-helper-app.d.ts +11 -0
- package/cli/statistics-helper-app.js +83 -0
- package/cli/summarizer-app.d.ts +18 -0
- package/cli/summarizer-app.js +67 -0
- package/core/index.d.ts +4 -0
- package/core/index.js +23 -0
- package/core/input.d.ts +42 -0
- package/core/input.js +3 -0
- package/core/output.d.ts +15 -0
- package/core/output.js +3 -0
- package/core/pipeline-executor.js +221 -0
- package/core/print/dataflow-printer.d.ts +8 -0
- package/core/print/dataflow-printer.js +62 -0
- package/core/print/normalize-printer.d.ts +7 -0
- package/core/print/normalize-printer.js +31 -0
- package/core/print/parse-printer.d.ts +3 -0
- package/core/print/parse-printer.js +29 -0
- package/core/print/print.d.ts +47 -0
- package/core/print/print.js +13 -0
- package/core/print/slice-diff-ansi.d.ts +2 -0
- package/core/print/slice-diff-ansi.js +49 -0
- package/core/slicer.d.ts +123 -0
- package/core/slicer.js +227 -0
- package/core/stepping-slicer.js +160 -0
- package/core/steps/all/00-parse.js +19 -0
- package/core/steps/all/10-normalize.js +21 -0
- package/core/steps/all/20-dataflow.js +21 -0
- package/core/steps/all/30-slice.js +16 -0
- package/core/steps/all/40-reconstruct.js +16 -0
- package/core/steps/all/core/00-parse.js +24 -0
- package/core/steps/all/core/10-normalize.js +46 -0
- package/core/steps/all/core/20-dataflow.js +39 -0
- package/core/steps/all/static-slicing/00-slice.js +21 -0
- package/core/steps/all/static-slicing/10-reconstruct.js +21 -0
- package/core/steps/index.js +21 -0
- package/core/steps/input.js +3 -0
- package/core/steps/output.js +3 -0
- package/core/steps/pipeline/create.js +130 -0
- package/core/steps/pipeline/default.js +15 -0
- package/core/steps/pipeline/dependency-checker.js +76 -0
- package/core/steps/pipeline/index.js +20 -0
- package/core/steps/pipeline/invalid-pipeline-error.js +14 -0
- package/core/steps/pipeline/pipeline.js +28 -0
- package/core/steps/step.js +8 -0
- package/core/steps/steps-provider.js +3 -0
- package/core/steps/steps.js +35 -0
- package/core/steps.d.ts +166 -0
- package/core/steps.js +99 -0
- package/dataflow/common/environments/append.js +48 -0
- package/dataflow/common/environments/environment.js +165 -0
- package/dataflow/common/environments/index.js +23 -0
- package/dataflow/common/environments/overwrite.js +82 -0
- package/dataflow/common/environments/register.js +49 -0
- package/dataflow/common/environments/resolve-by-name.js +35 -0
- package/dataflow/common/environments/scopes.js +6 -0
- package/dataflow/common/environments/scoping.js +27 -0
- package/dataflow/environments/append.d.ts +8 -0
- package/dataflow/environments/append.js +48 -0
- package/dataflow/environments/environment.d.ts +78 -0
- package/dataflow/environments/environment.js +161 -0
- package/dataflow/environments/index.d.ts +7 -0
- package/dataflow/environments/index.js +23 -0
- package/dataflow/environments/overwrite.d.ts +6 -0
- package/dataflow/environments/overwrite.js +82 -0
- package/dataflow/environments/register.d.ts +7 -0
- package/dataflow/environments/register.js +39 -0
- package/dataflow/environments/resolve-by-name.d.ts +12 -0
- package/dataflow/environments/resolve-by-name.js +35 -0
- package/dataflow/environments/scopes.d.ts +6 -0
- package/dataflow/environments/scopes.js +6 -0
- package/dataflow/environments/scoping.d.ts +4 -0
- package/dataflow/environments/scoping.js +27 -0
- package/dataflow/extractor.d.ts +6 -0
- package/dataflow/extractor.js +60 -0
- package/dataflow/graph/diff.d.ts +18 -0
- package/dataflow/graph/diff.js +206 -0
- package/dataflow/graph/edge.d.ts +37 -0
- package/dataflow/graph/edge.js +32 -0
- package/dataflow/graph/equal.js +127 -0
- package/dataflow/graph/graph.d.ts +120 -0
- package/dataflow/graph/graph.js +298 -0
- package/dataflow/graph/index.d.ts +4 -0
- package/dataflow/graph/index.js +21 -0
- package/dataflow/graph/quads.d.ts +8 -0
- package/dataflow/graph/quads.js +27 -0
- package/dataflow/graph/vertex.d.ts +86 -0
- package/dataflow/graph/vertex.js +3 -0
- package/dataflow/index.d.ts +5 -0
- package/dataflow/index.js +24 -0
- package/dataflow/internal/info.d.ts +21 -0
- package/dataflow/internal/info.js +16 -0
- package/dataflow/internal/linker.d.ts +41 -0
- package/dataflow/internal/linker.js +255 -0
- package/dataflow/internal/process/access.d.ts +4 -0
- package/dataflow/internal/process/access.js +53 -0
- package/dataflow/internal/process/expression-list.d.ts +8 -0
- package/dataflow/internal/process/expression-list.js +148 -0
- package/dataflow/internal/process/functions/argument.d.ts +8 -0
- package/dataflow/internal/process/functions/argument.js +46 -0
- package/dataflow/internal/process/functions/exit-points.d.ts +2 -0
- package/dataflow/internal/process/functions/exit-points.js +121 -0
- package/dataflow/internal/process/functions/function-call.d.ts +5 -0
- package/dataflow/internal/process/functions/function-call.js +99 -0
- package/dataflow/internal/process/functions/function-definition.d.ts +4 -0
- package/dataflow/internal/process/functions/function-definition.js +176 -0
- package/dataflow/internal/process/functions/parameter.d.ts +4 -0
- package/dataflow/internal/process/functions/parameter.js +47 -0
- package/dataflow/internal/process/if-then-else.d.ts +4 -0
- package/dataflow/internal/process/if-then-else.js +56 -0
- package/dataflow/internal/process/loops/for-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/for-loop.js +54 -0
- package/dataflow/internal/process/loops/repeat-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/repeat-loop.js +21 -0
- package/dataflow/internal/process/loops/while-loop.d.ts +4 -0
- package/dataflow/internal/process/loops/while-loop.js +31 -0
- package/dataflow/internal/process/operators/assignment.d.ts +4 -0
- package/dataflow/internal/process/operators/assignment.js +129 -0
- package/dataflow/internal/process/operators/non-assignment-binary-op.d.ts +4 -0
- package/dataflow/internal/process/operators/non-assignment-binary-op.js +25 -0
- package/dataflow/internal/process/operators/pipe.d.ts +4 -0
- package/dataflow/internal/process/operators/pipe.js +46 -0
- package/dataflow/internal/process/operators/unary-op.d.ts +4 -0
- package/dataflow/internal/process/operators/unary-op.js +10 -0
- package/dataflow/internal/process/symbol.d.ts +4 -0
- package/dataflow/internal/process/symbol.js +21 -0
- package/dataflow/internal/process/uninteresting-leaf.d.ts +3 -0
- package/dataflow/internal/process/uninteresting-leaf.js +9 -0
- package/dataflow/processor.d.ts +47 -0
- package/dataflow/processor.js +20 -0
- package/dataflow/v1/extractor.js +60 -0
- package/dataflow/v1/graph/diff.js +206 -0
- package/dataflow/v1/graph/edge.js +32 -0
- package/dataflow/v1/graph/graph.js +298 -0
- package/dataflow/v1/graph/index.js +21 -0
- package/dataflow/v1/graph/quads.js +27 -0
- package/dataflow/v1/graph/vertex.js +3 -0
- package/dataflow/v1/index.js +24 -0
- package/dataflow/v1/internal/info.js +16 -0
- package/dataflow/v1/internal/linker.js +255 -0
- package/dataflow/v1/internal/process/access.js +54 -0
- package/dataflow/v1/internal/process/expression-list.js +154 -0
- package/dataflow/v1/internal/process/functions/argument.js +46 -0
- package/dataflow/v1/internal/process/functions/exit-points.js +125 -0
- package/dataflow/v1/internal/process/functions/function-call.js +99 -0
- package/dataflow/v1/internal/process/functions/function-definition.js +176 -0
- package/dataflow/v1/internal/process/functions/parameter.js +47 -0
- package/dataflow/v1/internal/process/if-then-else.js +57 -0
- package/dataflow/v1/internal/process/loops/for-loop.js +54 -0
- package/dataflow/v1/internal/process/loops/repeat-loop.js +21 -0
- package/dataflow/v1/internal/process/loops/while-loop.js +31 -0
- package/dataflow/v1/internal/process/operators/assignment.js +129 -0
- package/dataflow/v1/internal/process/operators/non-assignment-binary-op.js +25 -0
- package/dataflow/v1/internal/process/operators/pipe.js +46 -0
- package/dataflow/v1/internal/process/operators/unary-op.js +10 -0
- package/dataflow/v1/internal/process/symbol.js +21 -0
- package/dataflow/v1/internal/process/uninteresting-leaf.js +9 -0
- package/dataflow/v1/processor.js +20 -0
- package/dataflow/v2/entry.js +11 -0
- package/flowr-1.3.7.tgz +0 -0
- package/flowr.d.ts +26 -0
- package/flowr.js +135 -0
- package/index.d.ts +6 -0
- package/index.js +23 -0
- package/package.json +384 -0
- package/r-bridge/index.d.ts +11 -0
- package/r-bridge/index.js +28 -0
- package/r-bridge/lang-4.x/ast/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/index.js +19 -0
- package/r-bridge/lang-4.x/ast/model/collect.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/collect.js +23 -0
- package/r-bridge/lang-4.x/ast/model/index.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/index.js +23 -0
- package/r-bridge/lang-4.x/ast/model/model.d.ts +127 -0
- package/r-bridge/lang-4.x/ast/model/model.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/index.d.ts +21 -0
- package/r-bridge/lang-4.x/ast/model/nodes/index.js +38 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/index.js +27 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/r-delimiter.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/model/nodes/info/r-delimiter.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-access.d.ts +24 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-access.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-argument.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-argument.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.d.ts +25 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-binary-op.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-break.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-break.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-comment.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-comment.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-expression-list.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-for-loop.d.ts +18 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-for-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.d.ts +31 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-call.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-function-definition.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-if-then-else.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-if-then-else.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-line-directive.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-line-directive.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-logical.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-logical.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-next.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-next.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-number.d.ts +8 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-number.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-parameter.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-parameter.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-pipe.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-pipe.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-repeat-loop.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-repeat-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-string.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-string.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.d.ts +7 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-symbol.js +9 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.d.ts +18 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-unary-op.js +3 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-while-loop.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/nodes/r-while-loop.js +3 -0
- package/r-bridge/lang-4.x/ast/model/operators.d.ts +46 -0
- package/r-bridge/lang-4.x/ast/model/operators.js +67 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.d.ts +81 -0
- package/r-bridge/lang-4.x/ast/model/processing/decorate.js +342 -0
- package/r-bridge/lang-4.x/ast/model/processing/fold.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/model/processing/fold.js +20 -0
- package/r-bridge/lang-4.x/ast/model/processing/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/model/processing/index.js +22 -0
- package/r-bridge/lang-4.x/ast/model/processing/role.d.ts +41 -0
- package/r-bridge/lang-4.x/ast/model/processing/role.js +17 -0
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.d.ts +61 -0
- package/r-bridge/lang-4.x/ast/model/processing/stateful-fold.js +87 -0
- package/r-bridge/lang-4.x/ast/model/processing/visitor.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/model/processing/visitor.js +109 -0
- package/r-bridge/lang-4.x/ast/model/type.d.ts +206 -0
- package/r-bridge/lang-4.x/ast/model/type.js +18 -0
- package/r-bridge/lang-4.x/ast/model/versions.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/model/versions.js +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/config.js +16 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/input-format.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/meta.js +118 -0
- package/r-bridge/lang-4.x/ast/parser/xml/common/xml-to-json.js +58 -0
- package/r-bridge/lang-4.x/ast/parser/xml/config.d.ts +25 -0
- package/r-bridge/lang-4.x/ast/parser/xml/config.js +16 -0
- package/r-bridge/lang-4.x/ast/parser/xml/data.d.ts +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.d.ts +292 -0
- package/r-bridge/lang-4.x/ast/parser/xml/hooks.js +136 -0
- package/r-bridge/lang-4.x/ast/parser/xml/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/parser/xml/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.d.ts +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/input-format.js +33 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/access.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/access.js +107 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then-else.d.ts +15 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then-else.js +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/if-then.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/control/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/expression.js +65 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.d.ts +1 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/expression/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/argument.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/argument.js +74 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/call.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/call.js +149 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/definition.js +60 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.d.ts +2 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/parameter.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/functions/parameter.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/index.js +27 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/break.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/for.js +72 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.d.ts +5 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/next.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/repeat.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/loops/while.js +45 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.d.ts +50 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/meta.js +118 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/binary.d.ts +8 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/binary.js +162 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.d.ts +6 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/special.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/operators/unary.js +59 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/comment.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.d.ts +1 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.d.ts +12 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/other/line-directive.js +55 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.d.ts +10 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/elements.js +159 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.d.ts +4 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/root.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/structure/single-element.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.d.ts +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.d.ts +13 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/number.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.d.ts +11 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/string.js +41 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/symbol.d.ts +14 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/values/symbol.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.d.ts +9 -0
- package/r-bridge/lang-4.x/ast/parser/xml/internal/xml-to-json.js +51 -0
- package/r-bridge/lang-4.x/ast/parser/xml/parser.d.ts +17 -0
- package/r-bridge/lang-4.x/ast/parser/xml/parser.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/hooks.js +136 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/access.js +107 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/if-then-else.js +32 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/if-then.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/control/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/expression/expression.js +65 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/expression/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/argument.js +74 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/call.js +149 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/definition.js +60 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/functions/parameter.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/index.js +27 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/break.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/for.js +72 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/index.js +22 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/next.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/repeat.js +42 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/loops/while.js +45 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/binary.js +162 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/special.js +24 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/operators/unary.js +59 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/comment.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/other/line-directive.js +55 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/elements.js +159 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/root.js +34 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/structure/single-element.js +64 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/index.js +20 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/number.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/string.js +41 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/internal/values/symbol.js +56 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v1/normalize.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/data.js +3 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/access.js +95 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/expression.js +99 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/functions/argument.js +71 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/binary.js +30 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/index.js +19 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/operators/unary.js +35 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/comment.js +25 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/other/line-directive.js +38 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/root.js +26 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/single-element.js +63 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/index.js +18 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/number.js +46 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/string.js +33 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/internal/values/symbol.js +63 -0
- package/r-bridge/lang-4.x/ast/parser/xml/v2/normalize.js +25 -0
- package/r-bridge/lang-4.x/index.d.ts +2 -0
- package/r-bridge/lang-4.x/index.js +19 -0
- package/r-bridge/lang-4.x/values.d.ts +39 -0
- package/r-bridge/lang-4.x/values.js +149 -0
- package/r-bridge/retriever.d.ts +48 -0
- package/r-bridge/retriever.js +71 -0
- package/r-bridge/shell.d.ts +147 -0
- package/r-bridge/shell.js +423 -0
- package/reconstruct/reconstruct.d.ts +28 -0
- package/reconstruct/reconstruct.js +448 -0
- package/slicing/criterion/collect-all.d.ts +36 -0
- package/slicing/criterion/collect-all.js +23 -0
- package/slicing/criterion/filters/all-variables.d.ts +2 -0
- package/slicing/criterion/filters/all-variables.js +63 -0
- package/slicing/criterion/filters/index.d.ts +1 -0
- package/slicing/criterion/filters/index.js +18 -0
- package/slicing/criterion/index.d.ts +3 -0
- package/slicing/criterion/index.js +20 -0
- package/slicing/criterion/parse.d.ts +20 -0
- package/slicing/criterion/parse.js +79 -0
- package/slicing/index.d.ts +3 -0
- package/slicing/index.js +20 -0
- package/slicing/static/index.d.ts +1 -0
- package/slicing/static/index.js +18 -0
- package/slicing/static/static-slicer.d.ts +29 -0
- package/slicing/static/static-slicer.js +186 -0
- package/statistics/features/common-syntax-probability.d.ts +30 -0
- package/statistics/features/common-syntax-probability.js +159 -0
- package/statistics/features/feature.d.ts +175 -0
- package/statistics/features/feature.js +30 -0
- package/statistics/features/index.d.ts +1 -0
- package/statistics/features/index.js +18 -0
- package/statistics/features/post-processing.d.ts +12 -0
- package/statistics/features/post-processing.js +21 -0
- package/statistics/features/supported/assignments/assignments.d.ts +11 -0
- package/statistics/features/supported/assignments/assignments.js +53 -0
- package/statistics/features/supported/assignments/index.d.ts +1 -0
- package/statistics/features/supported/assignments/index.js +6 -0
- package/statistics/features/supported/assignments/post-process.d.ts +3 -0
- package/statistics/features/supported/assignments/post-process.js +125 -0
- package/statistics/features/supported/comments/comments.d.ts +18 -0
- package/statistics/features/supported/comments/comments.js +133 -0
- package/statistics/features/supported/comments/index.d.ts +1 -0
- package/statistics/features/supported/comments/index.js +6 -0
- package/statistics/features/supported/comments/post-process.d.ts +3 -0
- package/statistics/features/supported/comments/post-process.js +50 -0
- package/statistics/features/supported/control-flow/control-flow.d.ts +17 -0
- package/statistics/features/supported/control-flow/control-flow.js +67 -0
- package/statistics/features/supported/control-flow/index.d.ts +1 -0
- package/statistics/features/supported/control-flow/index.js +6 -0
- package/statistics/features/supported/control-flow/post-process.d.ts +3 -0
- package/statistics/features/supported/control-flow/post-process.js +65 -0
- package/statistics/features/supported/data-access/data-access.d.ts +15 -0
- package/statistics/features/supported/data-access/data-access.js +118 -0
- package/statistics/features/supported/data-access/index.d.ts +1 -0
- package/statistics/features/supported/data-access/index.js +6 -0
- package/statistics/features/supported/data-access/post-process.d.ts +3 -0
- package/statistics/features/supported/data-access/post-process.js +107 -0
- package/statistics/features/supported/defined-functions/defined-functions.d.ts +35 -0
- package/statistics/features/supported/defined-functions/defined-functions.js +139 -0
- package/statistics/features/supported/defined-functions/index.d.ts +1 -0
- package/statistics/features/supported/defined-functions/index.js +6 -0
- package/statistics/features/supported/defined-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/defined-functions/post-process.js +177 -0
- package/statistics/features/supported/expression-list/expression-list.d.ts +9 -0
- package/statistics/features/supported/expression-list/expression-list.js +36 -0
- package/statistics/features/supported/expression-list/index.d.ts +1 -0
- package/statistics/features/supported/expression-list/index.js +6 -0
- package/statistics/features/supported/expression-list/post-process.d.ts +3 -0
- package/statistics/features/supported/expression-list/post-process.js +44 -0
- package/statistics/features/supported/index.d.ts +10 -0
- package/statistics/features/supported/index.js +27 -0
- package/statistics/features/supported/loops/index.d.ts +1 -0
- package/statistics/features/supported/loops/index.js +6 -0
- package/statistics/features/supported/loops/loops.d.ts +20 -0
- package/statistics/features/supported/loops/loops.js +79 -0
- package/statistics/features/supported/loops/post-process.d.ts +3 -0
- package/statistics/features/supported/loops/post-process.js +72 -0
- package/statistics/features/supported/used-functions/index.d.ts +1 -0
- package/statistics/features/supported/used-functions/index.js +6 -0
- package/statistics/features/supported/used-functions/post-process.d.ts +6 -0
- package/statistics/features/supported/used-functions/post-process.js +179 -0
- package/statistics/features/supported/used-functions/used-functions.d.ts +24 -0
- package/statistics/features/supported/used-functions/used-functions.js +95 -0
- package/statistics/features/supported/used-packages/index.d.ts +1 -0
- package/statistics/features/supported/used-packages/index.js +6 -0
- package/statistics/features/supported/used-packages/post-process.d.ts +3 -0
- package/statistics/features/supported/used-packages/post-process.js +121 -0
- package/statistics/features/supported/used-packages/used-packages.d.ts +16 -0
- package/statistics/features/supported/used-packages/used-packages.js +130 -0
- package/statistics/features/supported/values/index.d.ts +1 -0
- package/statistics/features/supported/values/index.js +6 -0
- package/statistics/features/supported/values/post-process.d.ts +3 -0
- package/statistics/features/supported/values/post-process.js +72 -0
- package/statistics/features/supported/values/values.d.ts +14 -0
- package/statistics/features/supported/values/values.js +101 -0
- package/statistics/features/supported/variables/index.d.ts +1 -0
- package/statistics/features/supported/variables/index.js +6 -0
- package/statistics/features/supported/variables/post-process.d.ts +9 -0
- package/statistics/features/supported/variables/post-process.js +122 -0
- package/statistics/features/supported/variables/variables.d.ts +15 -0
- package/statistics/features/supported/variables/variables.js +70 -0
- package/statistics/index.d.ts +6 -0
- package/statistics/index.js +24 -0
- package/statistics/meta-statistics.d.ts +33 -0
- package/statistics/meta-statistics.js +17 -0
- package/statistics/output/ansi.d.ts +50 -0
- package/statistics/output/ansi.js +58 -0
- package/statistics/output/file-provider.d.ts +37 -0
- package/statistics/output/file-provider.js +97 -0
- package/statistics/output/index.d.ts +4 -0
- package/statistics/output/index.js +21 -0
- package/statistics/output/print-stats.d.ts +17 -0
- package/statistics/output/print-stats.js +69 -0
- package/statistics/output/statistics-file.d.ts +37 -0
- package/statistics/output/statistics-file.js +69 -0
- package/statistics/statistics.d.ts +24 -0
- package/statistics/statistics.js +109 -0
- package/util/args.d.ts +14 -0
- package/util/args.js +67 -0
- package/util/arrays.d.ts +44 -0
- package/util/arrays.js +145 -0
- package/util/assert.d.ts +11 -0
- package/util/assert.js +35 -0
- package/util/bimap.d.ts +24 -0
- package/util/bimap.js +71 -0
- package/util/cfg.d.ts +55 -0
- package/util/cfg.js +498 -0
- package/util/defaultmap.d.ts +34 -0
- package/util/defaultmap.js +65 -0
- package/util/diff.d.ts +43 -0
- package/util/diff.js +28 -0
- package/util/files.d.ts +54 -0
- package/util/files.js +144 -0
- package/util/json.d.ts +2 -0
- package/util/json.js +28 -0
- package/util/log.d.ts +22 -0
- package/util/log.js +48 -0
- package/util/mermaid/ast.d.ts +6 -0
- package/util/mermaid/ast.js +28 -0
- package/util/mermaid/cfg.d.ts +7 -0
- package/util/mermaid/cfg.js +44 -0
- package/util/mermaid/dfg.d.ts +21 -0
- package/util/mermaid/dfg.js +165 -0
- package/util/mermaid/index.d.ts +3 -0
- package/util/mermaid/index.js +20 -0
- package/util/mermaid/mermaid.d.ts +7 -0
- package/util/mermaid/mermaid.js +24 -0
- package/util/numbers.d.ts +1 -0
- package/util/numbers.js +9 -0
- package/util/objects.d.ts +17 -0
- package/util/objects.js +60 -0
- package/util/os.d.ts +2 -0
- package/util/os.js +25 -0
- package/util/parallel.d.ts +30 -0
- package/util/parallel.js +103 -0
- package/util/quads.d.ts +92 -0
- package/util/quads.js +189 -0
- package/util/random.d.ts +4 -0
- package/util/random.js +22 -0
- package/util/range.d.ts +32 -0
- package/util/range.js +61 -0
- package/util/set.d.ts +8 -0
- package/util/set.js +32 -0
- package/util/strings.d.ts +12 -0
- package/util/strings.js +41 -0
- package/util/summarizer/auto-detect.d.ts +2 -0
- package/util/summarizer/auto-detect.js +32 -0
- package/util/summarizer/benchmark/benchmark-summarizer.js +208 -0
- package/util/summarizer/benchmark/data.d.ts +66 -0
- package/util/summarizer/benchmark/data.js +13 -0
- package/util/summarizer/benchmark/first-phase/input.d.ts +2 -0
- package/util/summarizer/benchmark/first-phase/input.js +59 -0
- package/util/summarizer/benchmark/first-phase/process.d.ts +10 -0
- package/util/summarizer/benchmark/first-phase/process.js +208 -0
- package/util/summarizer/benchmark/second-phase/graph.d.ts +2 -0
- package/util/summarizer/benchmark/second-phase/graph.js +54 -0
- package/util/summarizer/benchmark/second-phase/process.d.ts +4 -0
- package/util/summarizer/benchmark/second-phase/process.js +89 -0
- package/util/summarizer/benchmark/summarizer.d.ts +34 -0
- package/util/summarizer/benchmark/summarizer.js +53 -0
- package/util/summarizer/statistics/first-phase/process.d.ts +6 -0
- package/util/summarizer/statistics/first-phase/process.js +81 -0
- package/util/summarizer/statistics/post-process/clusterer.d.ts +26 -0
- package/util/summarizer/statistics/post-process/clusterer.js +43 -0
- package/util/summarizer/statistics/post-process/file-based-count.d.ts +17 -0
- package/util/summarizer/statistics/post-process/file-based-count.js +49 -0
- package/util/summarizer/statistics/post-process/histogram.d.ts +59 -0
- package/util/summarizer/statistics/post-process/histogram.js +128 -0
- package/util/summarizer/statistics/post-process/index.d.ts +4 -0
- package/util/summarizer/statistics/post-process/index.js +21 -0
- package/util/summarizer/statistics/post-process/post-process-output.d.ts +16 -0
- package/util/summarizer/statistics/post-process/post-process-output.js +104 -0
- package/util/summarizer/statistics/second-phase/process.d.ts +11 -0
- package/util/summarizer/statistics/second-phase/process.js +117 -0
- package/util/summarizer/statistics/summarizer.d.ts +34 -0
- package/util/summarizer/statistics/summarizer.js +135 -0
- package/util/summarizer/summarizer.d.ts +25 -0
- package/util/summarizer/summarizer.js +13 -0
- package/util/time.d.ts +6 -0
- package/util/time.js +13 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { type MergeableRecord } from '../util/objects';
|
|
3
|
+
import { SemVer } from 'semver';
|
|
4
|
+
import { TokenMap } from './retriever';
|
|
5
|
+
export type OutputStreamSelector = 'stdout' | 'stderr' | 'both';
|
|
6
|
+
export interface CollectorTimeout extends MergeableRecord {
|
|
7
|
+
/**
|
|
8
|
+
* number of milliseconds to wait for the collection to finish
|
|
9
|
+
*/
|
|
10
|
+
ms: number;
|
|
11
|
+
/**
|
|
12
|
+
* if true, the timeout will reset whenever we receive new data
|
|
13
|
+
*/
|
|
14
|
+
resetOnNewData: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Configuration for the internal output collector used by the {@link RShell}
|
|
18
|
+
* The defaults are configured with {@link DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION}
|
|
19
|
+
*/
|
|
20
|
+
export interface OutputCollectorConfiguration extends MergeableRecord {
|
|
21
|
+
/** the streams to use to collect the output from */
|
|
22
|
+
from: OutputStreamSelector;
|
|
23
|
+
/**
|
|
24
|
+
* a string marker to signal that the command was executed successfully.
|
|
25
|
+
* must not appear as a standalone line in the output. this is our hacky way of ensuring that we are done.
|
|
26
|
+
*/
|
|
27
|
+
postamble: string;
|
|
28
|
+
/** internal timeout configuration to use (see {@link CollectorTimeout}) */
|
|
29
|
+
timeout: CollectorTimeout;
|
|
30
|
+
/** should the postamble be included in the result? */
|
|
31
|
+
keepPostamble: boolean;
|
|
32
|
+
/** automatically trim all lines in the output (useful to ignore trailing whitespace etc.) */
|
|
33
|
+
automaticallyTrimOutput: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare const DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION: OutputCollectorConfiguration;
|
|
36
|
+
export interface RShellSessionOptions extends MergeableRecord {
|
|
37
|
+
/** The path to the R executable, can be only the executable if it is to be found on the PATH. */
|
|
38
|
+
readonly pathToRExecutable: string;
|
|
39
|
+
/** Command line options to use when starting the R session. */
|
|
40
|
+
readonly commandLineOptions: readonly string[];
|
|
41
|
+
/** The current working directory of the R session. */
|
|
42
|
+
readonly cwd: string;
|
|
43
|
+
/** The character to use to mark the end of a line. Is probably always `\n` (even on windows). */
|
|
44
|
+
readonly eol: string;
|
|
45
|
+
/** The environment variables available in the R session. */
|
|
46
|
+
readonly env: NodeJS.ProcessEnv;
|
|
47
|
+
/** If set, the R session will be restarted if it exits due to an error */
|
|
48
|
+
readonly revive: 'never' | 'on-error' | 'always';
|
|
49
|
+
/** Called when the R session is restarted, this makes only sense if `revive` is not set to `'never'` */
|
|
50
|
+
readonly onRevive: (code: number, signal: string | null) => void;
|
|
51
|
+
/** The path to the library directory, use undefined to let R figure that out for itself */
|
|
52
|
+
readonly homeLibPath: string | undefined;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Configuration of an {@link RShell} instance.
|
|
56
|
+
* See {@link DEFAULT_R_SHELL_OPTIONS} for the default values used by {@link RShell}.
|
|
57
|
+
*/
|
|
58
|
+
export interface RShellOptions extends RShellSessionOptions {
|
|
59
|
+
readonly sessionName: string;
|
|
60
|
+
}
|
|
61
|
+
export declare const DEFAULT_R_SHELL_OPTIONS: RShellOptions;
|
|
62
|
+
/**
|
|
63
|
+
* The `RShell` represents an interactive session with the R interpreter.
|
|
64
|
+
* You can configure it by {@link RShellOptions}.
|
|
65
|
+
*
|
|
66
|
+
* At the moment we are using a live R session (and not networking etc.) to communicate with R easily,
|
|
67
|
+
* which allows us to install packages etc. However, this might and probably will change in the future (leaving this
|
|
68
|
+
* as a legacy mode :D)
|
|
69
|
+
*/
|
|
70
|
+
export declare class RShell {
|
|
71
|
+
readonly options: Readonly<RShellOptions>;
|
|
72
|
+
private session;
|
|
73
|
+
private readonly log;
|
|
74
|
+
private versionCache;
|
|
75
|
+
private tokenMapCache;
|
|
76
|
+
private tempDirs;
|
|
77
|
+
constructor(options?: Partial<RShellOptions>);
|
|
78
|
+
private revive;
|
|
79
|
+
/**
|
|
80
|
+
* sends the given command directly to the current R session
|
|
81
|
+
* will not do anything to alter input markers!
|
|
82
|
+
*/
|
|
83
|
+
sendCommand(command: string): void;
|
|
84
|
+
usedRVersion(): Promise<SemVer | null>;
|
|
85
|
+
/**
|
|
86
|
+
* Retrieve the token map of the xmlparsedata package.
|
|
87
|
+
*
|
|
88
|
+
* @note For multiple calls, this makes use of caching
|
|
89
|
+
*/
|
|
90
|
+
tokenMap(): Promise<TokenMap>;
|
|
91
|
+
private retrieveTokenMap;
|
|
92
|
+
/**
|
|
93
|
+
* Send a command and collect the output
|
|
94
|
+
*
|
|
95
|
+
* @param command - The R command to execute (similar to {@link sendCommand})
|
|
96
|
+
* @param addonConfig - Further configuration on how and what to collect: see {@link OutputCollectorConfiguration},
|
|
97
|
+
* defaults are set in {@link DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION}
|
|
98
|
+
*/
|
|
99
|
+
sendCommandWithOutput(command: string, addonConfig?: Partial<OutputCollectorConfiguration>): Promise<string[]>;
|
|
100
|
+
/**
|
|
101
|
+
* execute multiple commands in order
|
|
102
|
+
*
|
|
103
|
+
* @see sendCommand
|
|
104
|
+
*/
|
|
105
|
+
sendCommands(...commands: string[]): void;
|
|
106
|
+
/**
|
|
107
|
+
* clears the R environment using the `rm` command.
|
|
108
|
+
*/
|
|
109
|
+
clearEnvironment(): void;
|
|
110
|
+
/**
|
|
111
|
+
* usually R will stop execution on errors, with this the R session will try to
|
|
112
|
+
* continue working!
|
|
113
|
+
*/
|
|
114
|
+
continueOnError(): void;
|
|
115
|
+
injectLibPaths(...paths: string[]): void;
|
|
116
|
+
tryToInjectHomeLibPath(): void;
|
|
117
|
+
/**
|
|
118
|
+
* checks if a given package is already installed on the system!
|
|
119
|
+
*/
|
|
120
|
+
isPackageInstalled(packageName: string): Promise<boolean>;
|
|
121
|
+
allInstalledPackages(): Promise<string[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Installs the package using a temporary location
|
|
124
|
+
*
|
|
125
|
+
* @param packageName - The package to install
|
|
126
|
+
* @param autoload - If true, the package will be loaded after installation
|
|
127
|
+
* @param force - If true, the package will be installed no if it is already on the system and ready to be loaded
|
|
128
|
+
*/
|
|
129
|
+
ensurePackageInstalled(packageName: string, autoload?: boolean, force?: boolean): Promise<{
|
|
130
|
+
packageName: string;
|
|
131
|
+
packageExistedAlready: boolean;
|
|
132
|
+
/** the temporary directory used for the installation, undefined if none was used */
|
|
133
|
+
libraryLocation?: string;
|
|
134
|
+
}>;
|
|
135
|
+
/**
|
|
136
|
+
* Obtain the temporary directory used by R.
|
|
137
|
+
* Additionally, this marks the directory for removal when the shell exits.
|
|
138
|
+
*/
|
|
139
|
+
obtainTmpDir(): Promise<string>;
|
|
140
|
+
/**
|
|
141
|
+
* Close the current R session, makes the object effectively invalid (can no longer be reopened etc.)
|
|
142
|
+
*
|
|
143
|
+
* @returns true if the operation succeeds, false otherwise
|
|
144
|
+
*/
|
|
145
|
+
close(): boolean;
|
|
146
|
+
private _sendCommand;
|
|
147
|
+
}
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.RShell = exports.DEFAULT_R_SHELL_OPTIONS = exports.DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION = void 0;
|
|
30
|
+
const child_process_1 = require("child_process");
|
|
31
|
+
const objects_1 = require("../util/objects");
|
|
32
|
+
const readline = __importStar(require("node:readline"));
|
|
33
|
+
const lang_4_x_1 = require("./lang-4.x");
|
|
34
|
+
const log_1 = require("../util/log");
|
|
35
|
+
const preload_1 = __importDefault(require("semver/preload"));
|
|
36
|
+
const os_1 = require("../util/os");
|
|
37
|
+
const fs_1 = __importDefault(require("fs"));
|
|
38
|
+
const retriever_1 = require("./retriever");
|
|
39
|
+
exports.DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION = {
|
|
40
|
+
from: 'stdout',
|
|
41
|
+
postamble: `🐧${'-'.repeat(5)}🐧`,
|
|
42
|
+
timeout: {
|
|
43
|
+
ms: 750_000,
|
|
44
|
+
resetOnNewData: true
|
|
45
|
+
},
|
|
46
|
+
keepPostamble: false,
|
|
47
|
+
automaticallyTrimOutput: true,
|
|
48
|
+
errorStopsWaiting: true
|
|
49
|
+
};
|
|
50
|
+
exports.DEFAULT_R_SHELL_OPTIONS = {
|
|
51
|
+
sessionName: 'default',
|
|
52
|
+
pathToRExecutable: (0, os_1.getPlatform)() === 'windows' ? 'R.exe' : 'R',
|
|
53
|
+
commandLineOptions: ['--vanilla', '--quiet', '--no-echo', '--no-save'],
|
|
54
|
+
cwd: process.cwd(),
|
|
55
|
+
env: process.env,
|
|
56
|
+
eol: '\n',
|
|
57
|
+
homeLibPath: (0, os_1.getPlatform)() === 'windows' ? undefined : '~/.r-libs',
|
|
58
|
+
revive: 'never',
|
|
59
|
+
onRevive: () => { }
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* The `RShell` represents an interactive session with the R interpreter.
|
|
63
|
+
* You can configure it by {@link RShellOptions}.
|
|
64
|
+
*
|
|
65
|
+
* At the moment we are using a live R session (and not networking etc.) to communicate with R easily,
|
|
66
|
+
* which allows us to install packages etc. However, this might and probably will change in the future (leaving this
|
|
67
|
+
* as a legacy mode :D)
|
|
68
|
+
*/
|
|
69
|
+
class RShell {
|
|
70
|
+
options;
|
|
71
|
+
session;
|
|
72
|
+
log;
|
|
73
|
+
versionCache = null;
|
|
74
|
+
tokenMapCache = null;
|
|
75
|
+
// should never be more than one, but let's be sure
|
|
76
|
+
tempDirs = new Set();
|
|
77
|
+
constructor(options) {
|
|
78
|
+
this.options = (0, objects_1.deepMergeObject)(exports.DEFAULT_R_SHELL_OPTIONS, options);
|
|
79
|
+
this.log = log_1.log.getSubLogger({ name: this.options.sessionName });
|
|
80
|
+
this.session = new RShellSession(this.options, this.log);
|
|
81
|
+
this.revive();
|
|
82
|
+
}
|
|
83
|
+
revive() {
|
|
84
|
+
if (this.options.revive === 'never') {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.session.onExit((code, signal) => {
|
|
88
|
+
if (this.options.revive === 'always' || (this.options.revive === 'on-error' && code !== 0)) {
|
|
89
|
+
this.log.warn(`R session exited with code ${code}, reviving!`);
|
|
90
|
+
this.options.onRevive(code, signal);
|
|
91
|
+
this.session = new RShellSession(this.options, this.log);
|
|
92
|
+
this.revive();
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* sends the given command directly to the current R session
|
|
98
|
+
* will not do anything to alter input markers!
|
|
99
|
+
*/
|
|
100
|
+
sendCommand(command) {
|
|
101
|
+
if (this.log.settings.minLevel >= 1 /* LogLevel.Trace */) {
|
|
102
|
+
this.log.trace(`> ${JSON.stringify(command)}`);
|
|
103
|
+
}
|
|
104
|
+
this._sendCommand(command);
|
|
105
|
+
}
|
|
106
|
+
async usedRVersion() {
|
|
107
|
+
if (this.versionCache !== null) {
|
|
108
|
+
return this.versionCache;
|
|
109
|
+
}
|
|
110
|
+
// retrieve raw version:
|
|
111
|
+
const result = await this.sendCommandWithOutput(`cat(paste0(R.version$major,".",R.version$minor), ${(0, lang_4_x_1.ts2r)(this.options.eol)})`);
|
|
112
|
+
this.log.trace(`raw version: ${JSON.stringify(result)}`);
|
|
113
|
+
this.versionCache = preload_1.default.coerce(result[0]);
|
|
114
|
+
return result.length === 1 ? this.versionCache : null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Retrieve the token map of the xmlparsedata package.
|
|
118
|
+
*
|
|
119
|
+
* @note For multiple calls, this makes use of caching
|
|
120
|
+
*/
|
|
121
|
+
async tokenMap() {
|
|
122
|
+
if (this.tokenMapCache === null) {
|
|
123
|
+
this.tokenMapCache = await this.retrieveTokenMap();
|
|
124
|
+
}
|
|
125
|
+
return this.tokenMapCache;
|
|
126
|
+
}
|
|
127
|
+
async retrieveTokenMap() {
|
|
128
|
+
await this.ensurePackageInstalled('xmlparsedata', true /* use some kind of environment in the future */);
|
|
129
|
+
// we invert the token map to get a mapping back from the replacement
|
|
130
|
+
const parsed = (0, lang_4_x_1.parseCSV)(await this.sendCommandWithOutput('write.table(xmlparsedata::xml_parse_token_map,sep=",",col.names=FALSE)'));
|
|
131
|
+
if (parsed.some(s => s.length !== 2)) {
|
|
132
|
+
throw new Error(`Expected two columns in token map, but got ${JSON.stringify(parsed)}`);
|
|
133
|
+
}
|
|
134
|
+
// we swap key and value to get the other direction, furthermore we remove quotes from keys if they are quoted
|
|
135
|
+
const cache = {};
|
|
136
|
+
for (const [key, value] of parsed) {
|
|
137
|
+
cache[value] = (0, retriever_1.removeTokenMapQuotationMarks)(key);
|
|
138
|
+
}
|
|
139
|
+
return cache;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Send a command and collect the output
|
|
143
|
+
*
|
|
144
|
+
* @param command - The R command to execute (similar to {@link sendCommand})
|
|
145
|
+
* @param addonConfig - Further configuration on how and what to collect: see {@link OutputCollectorConfiguration},
|
|
146
|
+
* defaults are set in {@link DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION}
|
|
147
|
+
*/
|
|
148
|
+
async sendCommandWithOutput(command, addonConfig) {
|
|
149
|
+
const config = (0, objects_1.deepMergeObject)(exports.DEFAULT_OUTPUT_COLLECTOR_CONFIGURATION, addonConfig);
|
|
150
|
+
if (this.log.settings.minLevel >= 1 /* LogLevel.Trace */) {
|
|
151
|
+
this.log.trace(`> ${JSON.stringify(command)}`);
|
|
152
|
+
}
|
|
153
|
+
const output = await this.session.collectLinesUntil(config.from, {
|
|
154
|
+
predicate: data => data === config.postamble,
|
|
155
|
+
includeInResult: config.keepPostamble // we do not want the postamble
|
|
156
|
+
}, config.timeout, () => {
|
|
157
|
+
this._sendCommand(command);
|
|
158
|
+
if (config.from === 'stderr') {
|
|
159
|
+
this._sendCommand(`cat("${config.postamble}${this.options.eol}", file=stderr())`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
this._sendCommand(`cat("${config.postamble}${this.options.eol}")`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
if (config.automaticallyTrimOutput) {
|
|
166
|
+
return output.map(line => line.trim());
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return output;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* execute multiple commands in order
|
|
174
|
+
*
|
|
175
|
+
* @see sendCommand
|
|
176
|
+
*/
|
|
177
|
+
sendCommands(...commands) {
|
|
178
|
+
for (const element of commands) {
|
|
179
|
+
this.sendCommand(element);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* clears the R environment using the `rm` command.
|
|
184
|
+
*/
|
|
185
|
+
clearEnvironment() {
|
|
186
|
+
this.log.debug('clearing environment');
|
|
187
|
+
this._sendCommand('rm(list=ls())');
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* usually R will stop execution on errors, with this the R session will try to
|
|
191
|
+
* continue working!
|
|
192
|
+
*/
|
|
193
|
+
continueOnError() {
|
|
194
|
+
this.log.info('continue in case of Errors');
|
|
195
|
+
this._sendCommand('options(error=function() {})');
|
|
196
|
+
}
|
|
197
|
+
injectLibPaths(...paths) {
|
|
198
|
+
this.log.debug(`injecting lib paths ${JSON.stringify(paths)}`);
|
|
199
|
+
this._sendCommand(`.libPaths(c(.libPaths(), ${paths.map(lang_4_x_1.ts2r).join(',')}))`);
|
|
200
|
+
}
|
|
201
|
+
tryToInjectHomeLibPath() {
|
|
202
|
+
// ensure the path exists first
|
|
203
|
+
if (this.options.homeLibPath === undefined) {
|
|
204
|
+
this.log.debug('ensuring home lib path exists (automatic inject)');
|
|
205
|
+
this.sendCommand('if(!dir.exists(Sys.getenv("R_LIBS_USER"))) { dir.create(path=Sys.getenv("R_LIBS_USER"),showWarnings=FALSE,recursive=TRUE) }');
|
|
206
|
+
this.sendCommand('.libPaths(c(.libPaths(), Sys.getenv("R_LIBS_USER")))');
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
this.injectLibPaths(this.options.homeLibPath);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* checks if a given package is already installed on the system!
|
|
214
|
+
*/
|
|
215
|
+
async isPackageInstalled(packageName) {
|
|
216
|
+
this.log.debug(`checking if package "${packageName}" is installed`);
|
|
217
|
+
const result = await this.sendCommandWithOutput(`cat(system.file(package="${packageName}")!="","${this.options.eol}")`);
|
|
218
|
+
return result.length === 1 && result[0] === 'TRUE';
|
|
219
|
+
}
|
|
220
|
+
async allInstalledPackages() {
|
|
221
|
+
this.log.debug('getting all installed packages');
|
|
222
|
+
const [packages] = await this.sendCommandWithOutput(`cat(paste0(installed.packages()[,1], collapse=","),"${this.options.eol}")`);
|
|
223
|
+
return packages.split(',');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Installs the package using a temporary location
|
|
227
|
+
*
|
|
228
|
+
* @param packageName - The package to install
|
|
229
|
+
* @param autoload - If true, the package will be loaded after installation
|
|
230
|
+
* @param force - If true, the package will be installed no if it is already on the system and ready to be loaded
|
|
231
|
+
*/
|
|
232
|
+
async ensurePackageInstalled(packageName, autoload = false, force = false) {
|
|
233
|
+
const packageExistedAlready = await this.isPackageInstalled(packageName);
|
|
234
|
+
if (!force && packageExistedAlready) {
|
|
235
|
+
this.log.info(`package "${packageName}" is already installed`);
|
|
236
|
+
if (autoload) {
|
|
237
|
+
this.sendCommand(`library(${(0, lang_4_x_1.ts2r)(packageName)})`);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
packageName,
|
|
241
|
+
packageExistedAlready: true
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
// obtain a temporary directory
|
|
245
|
+
const tempdir = await this.obtainTmpDir();
|
|
246
|
+
this.log.debug(`using temporary directory: "${tempdir}" to install package "${packageName}"`);
|
|
247
|
+
await this.sendCommandWithOutput(`install.packages(${(0, lang_4_x_1.ts2r)(packageName)},repos="https://cloud.r-project.org/",quiet=FALSE,lib=temp)`, {
|
|
248
|
+
ms: 750_000,
|
|
249
|
+
resetOnNewData: true
|
|
250
|
+
});
|
|
251
|
+
if (autoload) {
|
|
252
|
+
this.sendCommand(`library(${(0, lang_4_x_1.ts2r)(packageName)},lib.loc=temp)`);
|
|
253
|
+
}
|
|
254
|
+
return {
|
|
255
|
+
packageName,
|
|
256
|
+
libraryLocation: tempdir,
|
|
257
|
+
packageExistedAlready
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Obtain the temporary directory used by R.
|
|
262
|
+
* Additionally, this marks the directory for removal when the shell exits.
|
|
263
|
+
*/
|
|
264
|
+
async obtainTmpDir() {
|
|
265
|
+
this.sendCommand('temp <- tempdir()');
|
|
266
|
+
const [tempdir] = await this.sendCommandWithOutput(`cat(temp, ${(0, lang_4_x_1.ts2r)(this.options.eol)})`);
|
|
267
|
+
this.tempDirs.add(tempdir);
|
|
268
|
+
return tempdir;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Close the current R session, makes the object effectively invalid (can no longer be reopened etc.)
|
|
272
|
+
*
|
|
273
|
+
* @returns true if the operation succeeds, false otherwise
|
|
274
|
+
*/
|
|
275
|
+
close() {
|
|
276
|
+
return this.session.end([...this.tempDirs]);
|
|
277
|
+
}
|
|
278
|
+
_sendCommand(command) {
|
|
279
|
+
this.session.writeLine(command);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.RShell = RShell;
|
|
283
|
+
/**
|
|
284
|
+
* Used to deal with the underlying input-output streams of the R process
|
|
285
|
+
*/
|
|
286
|
+
class RShellSession {
|
|
287
|
+
bareSession;
|
|
288
|
+
sessionStdOut;
|
|
289
|
+
sessionStdErr;
|
|
290
|
+
options;
|
|
291
|
+
log;
|
|
292
|
+
collectionTimeout;
|
|
293
|
+
constructor(options, log) {
|
|
294
|
+
this.bareSession = (0, child_process_1.spawn)(options.pathToRExecutable, options.commandLineOptions, {
|
|
295
|
+
env: options.env,
|
|
296
|
+
cwd: options.cwd,
|
|
297
|
+
windowsHide: true
|
|
298
|
+
});
|
|
299
|
+
this.sessionStdOut = readline.createInterface({
|
|
300
|
+
input: this.bareSession.stdout,
|
|
301
|
+
terminal: false
|
|
302
|
+
});
|
|
303
|
+
this.sessionStdErr = readline.createInterface({
|
|
304
|
+
input: this.bareSession.stderr,
|
|
305
|
+
terminal: false
|
|
306
|
+
});
|
|
307
|
+
this.onExit(() => { this.end(); });
|
|
308
|
+
this.options = options;
|
|
309
|
+
this.log = log;
|
|
310
|
+
this.setupRSessionLoggers();
|
|
311
|
+
}
|
|
312
|
+
write(data) {
|
|
313
|
+
this.bareSession.stdin.write(data);
|
|
314
|
+
}
|
|
315
|
+
writeLine(data) {
|
|
316
|
+
this.write(`${data}${this.options.eol}`);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Collect lines from the selected streams until the given condition is met or the timeout is reached
|
|
320
|
+
*
|
|
321
|
+
* This method does allow other listeners to consume the same input
|
|
322
|
+
*
|
|
323
|
+
* @param from - The stream(s) to collect the information from
|
|
324
|
+
* @param until - If the predicate returns true, this will stop the collection and resolve the promise
|
|
325
|
+
* @param timeout - Configuration for how and when to timeout
|
|
326
|
+
* @param action - Event to be performed after all listeners are installed, this might be the action that triggers the output you want to collect
|
|
327
|
+
*/
|
|
328
|
+
async collectLinesUntil(from, until, timeout, action) {
|
|
329
|
+
const result = [];
|
|
330
|
+
let handler;
|
|
331
|
+
let error;
|
|
332
|
+
return await new Promise((resolve, reject) => {
|
|
333
|
+
const makeTimer = () => setTimeout(() => {
|
|
334
|
+
reject(new Error(`timeout of ${timeout.ms}ms reached (${JSON.stringify(result)})`));
|
|
335
|
+
}, timeout.ms);
|
|
336
|
+
this.collectionTimeout = makeTimer();
|
|
337
|
+
handler = (data) => {
|
|
338
|
+
const end = until.predicate(data);
|
|
339
|
+
if (!end || until.includeInResult) {
|
|
340
|
+
result.push(data);
|
|
341
|
+
}
|
|
342
|
+
if (end) {
|
|
343
|
+
clearTimeout(this.collectionTimeout);
|
|
344
|
+
resolve(result);
|
|
345
|
+
}
|
|
346
|
+
else if (timeout.resetOnNewData) {
|
|
347
|
+
clearTimeout(this.collectionTimeout);
|
|
348
|
+
this.collectionTimeout = makeTimer();
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
error = () => { resolve(result); };
|
|
352
|
+
this.onExit(error);
|
|
353
|
+
this.on(from, 'line', handler);
|
|
354
|
+
action?.();
|
|
355
|
+
}).finally(() => {
|
|
356
|
+
this.removeListener(from, 'line', handler);
|
|
357
|
+
this.bareSession.removeListener('exit', error);
|
|
358
|
+
this.bareSession.stdin.removeListener('error', error);
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* close the current R session, makes the object effectively invalid (can no longer be reopened etc.)
|
|
363
|
+
*
|
|
364
|
+
* @param filesToUnlink - If set, these files will be unlinked before closing the session (e.g., to clean up tempfiles)
|
|
365
|
+
*
|
|
366
|
+
* @returns true if the kill succeeds, false otherwise
|
|
367
|
+
* @see RShell#close
|
|
368
|
+
*/
|
|
369
|
+
end(filesToUnlink) {
|
|
370
|
+
if (filesToUnlink !== undefined) {
|
|
371
|
+
log_1.log.info(`unlinking ${filesToUnlink.length} files (${JSON.stringify(filesToUnlink)})`);
|
|
372
|
+
for (const f of filesToUnlink) {
|
|
373
|
+
fs_1.default.rmSync(f, { recursive: true, force: true });
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
const killResult = this.bareSession.kill();
|
|
377
|
+
if (this.collectionTimeout !== undefined) {
|
|
378
|
+
clearTimeout(this.collectionTimeout);
|
|
379
|
+
}
|
|
380
|
+
this.sessionStdOut.close();
|
|
381
|
+
this.sessionStdErr.close();
|
|
382
|
+
log_1.log.info(`killed R session with pid ${this.bareSession.pid ?? '<unknown>'} and result ${killResult ? 'successful' : 'failed'} (including streams)`);
|
|
383
|
+
return killResult;
|
|
384
|
+
}
|
|
385
|
+
setupRSessionLoggers() {
|
|
386
|
+
if (this.log.settings.minLevel >= 1 /* LogLevel.Trace */) {
|
|
387
|
+
this.bareSession.stdout.on('data', (data) => {
|
|
388
|
+
this.log.trace(`< ${data.toString()}`);
|
|
389
|
+
});
|
|
390
|
+
this.bareSession.on('close', (code) => {
|
|
391
|
+
this.log.trace(`session exited with code ${code}`);
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
this.bareSession.stderr.on('data', (data) => {
|
|
395
|
+
this.log.warn(`< ${data}`);
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
onExit(callback) {
|
|
399
|
+
this.bareSession.on('exit', callback);
|
|
400
|
+
this.bareSession.stdin.on('error', callback);
|
|
401
|
+
}
|
|
402
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
403
|
+
on(from, event, listener) {
|
|
404
|
+
const both = from === 'both';
|
|
405
|
+
if (both || from === 'stdout') {
|
|
406
|
+
this.sessionStdOut.on(event, listener);
|
|
407
|
+
}
|
|
408
|
+
if (both || from === 'stderr') {
|
|
409
|
+
this.sessionStdErr.on(event, listener);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
413
|
+
removeListener(from, event, listener) {
|
|
414
|
+
const both = from === 'both';
|
|
415
|
+
if (both || from === 'stdout') {
|
|
416
|
+
this.sessionStdOut.removeListener(event, listener);
|
|
417
|
+
}
|
|
418
|
+
if (both || from === 'stderr') {
|
|
419
|
+
this.sessionStdErr.removeListener(event, listener);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This module has one goal (and is to be rewritten soon to achieve that goal,
|
|
3
|
+
* as the file itself is way too long). See {@link reconstructToCode}.
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { NormalizedAst, NodeId, ParentInformation, RNode } from '../r-bridge';
|
|
7
|
+
type Selection = Set<NodeId>;
|
|
8
|
+
export declare const reconstructLogger: import("tslog").Logger<import("tslog").ILogObj>;
|
|
9
|
+
/** The structure of the predicate that should be used to determine if a given normalized node should be included in the reconstructed code independent of if it is selected by the slice or not */
|
|
10
|
+
export type AutoSelectPredicate = (node: RNode<ParentInformation>) => boolean;
|
|
11
|
+
export declare function doNotAutoSelect(_node: RNode<ParentInformation>): boolean;
|
|
12
|
+
export declare function autoSelectLibrary(node: RNode<ParentInformation>): boolean;
|
|
13
|
+
export interface ReconstructionResult {
|
|
14
|
+
code: string;
|
|
15
|
+
/** number of nodes that triggered the `autoSelectIf` predicate {@link reconstructToCode} */
|
|
16
|
+
autoSelected: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reconstructs parts of a normalized R ast into R code on an expression basis.
|
|
20
|
+
*
|
|
21
|
+
* @param ast - The {@link NormalizedAst|normalized ast} to be used as a basis for reconstruction
|
|
22
|
+
* @param selection - The selection of nodes to be reconstructed (probably the {@link NodeId|NodeIds} identified by the slicer)
|
|
23
|
+
* @param autoSelectIf - A predicate that can be used to force the reconstruction of a node (for example to reconstruct library call statements, see {@link autoSelectLibrary}, {@link doNotAutoSelect})
|
|
24
|
+
*
|
|
25
|
+
* @returns The number of times `autoSelectIf` triggered, as well as the reconstructed code itself.
|
|
26
|
+
*/
|
|
27
|
+
export declare function reconstructToCode<Info>(ast: NormalizedAst<Info>, selection: Selection, autoSelectIf?: AutoSelectPredicate): ReconstructionResult;
|
|
28
|
+
export {};
|