From 2a1ee34a6a2483ab410ed73dcfaf834fb162a3f5 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 29 Oct 2025 16:35:44 +0100 Subject: [PATCH 01/36] feat: add wasm solver --- scip-server/server.py | 45 --------- scip-server/src/constraints.py | 43 --------- scip-server/src/expressions.py | 50 ---------- scip-server/src/solver.py | 24 ----- solver/.clang-format | 98 +++++++++++++++++++ solver/.clang-tidy | 55 +++++++++++ solver/.gitignore | 4 + solver/CMakeLists.txt | 35 +++++++ solver/cmake/cpm.cmake | 24 +++++ solver/include/emitter.hpp | 34 +++++++ solver/include/lexer.hpp | 52 ++++++++++ solver/include/parser.hpp | 65 +++++++++++++ solver/include/utils.hpp | 27 ++++++ solver/include/utils.inl | 28 ++++++ solver/src/emitter.cpp | 97 +++++++++++++++++++ solver/src/lexer.cpp | 106 ++++++++++++++++++++ solver/src/parser.cpp | 170 +++++++++++++++++++++++++++++++++ solver/src/solver.cpp | 124 ++++++++++++++++++++++++ 18 files changed, 919 insertions(+), 162 deletions(-) delete mode 100644 scip-server/server.py delete mode 100644 scip-server/src/constraints.py delete mode 100644 scip-server/src/expressions.py delete mode 100644 scip-server/src/solver.py create mode 100644 solver/.clang-format create mode 100644 solver/.clang-tidy create mode 100644 solver/.gitignore create mode 100644 solver/CMakeLists.txt create mode 100644 solver/cmake/cpm.cmake create mode 100644 solver/include/emitter.hpp create mode 100644 solver/include/lexer.hpp create mode 100644 solver/include/parser.hpp create mode 100644 solver/include/utils.hpp create mode 100644 solver/include/utils.inl create mode 100644 solver/src/emitter.cpp create mode 100644 solver/src/lexer.cpp create mode 100644 solver/src/parser.cpp create mode 100644 solver/src/solver.cpp diff --git a/scip-server/server.py b/scip-server/server.py deleted file mode 100644 index 91fdd367..00000000 --- a/scip-server/server.py +++ /dev/null @@ -1,45 +0,0 @@ -from flask import Flask, jsonify, request -from src.solver import Solver -import json -import time -app = Flask(__name__) - -times = set() - - -@app.route('/optimize', methods=['GET']) -def optimize(): - print("____REQUEST____") - try: - input = request.args.get('input') - data = decodeInput(input) - print("INPUT: " + str(data)) - - start = time.time() - solver = Solver(data["variables"], data["constraints"], data["objective"]) - solution = solver.solve() - end = time.time() - - times.add(end - start) - printTiming() - - print("SOLUTION: " + str(solution)) - return jsonify({'status': 'success', 'result': encodeOutput(solution)}) - except Exception as e: - print(e) - return jsonify({'status': 'error', 'message': 'An unknown error occurred.'}) - -def printTiming(): - print(f"TIME: AVG: {sum(times)/len(times)} FOR N: {len(times)}") - print(f"MIN {min(times)}, MAX: {max(times)}") - -def decodeInput(input:str) -> dict: - # TODO: base 64 decode - return json.loads(input) - -def encodeOutput(input) -> dict: - # TODO: base 64 encode - return json.dumps(input) - -if __name__ == '__main__': - app.run(port=5000) diff --git a/scip-server/src/constraints.py b/scip-server/src/constraints.py deleted file mode 100644 index e0c859ed..00000000 --- a/scip-server/src/constraints.py +++ /dev/null @@ -1,43 +0,0 @@ -from pyscipopt import Variable -from src.expressions import constructExpression - - -def getConstraintType(input: str) -> str: - # check for "==" - parts = input.split("==") - if len(parts) > 2: - raise Exception("Given constraint contains multiple \"==\".") - if len(parts) == 2: - return "==" - - # check for "<=" - parts = input.split("<=") - if len(parts) > 2: - raise Exception("Given constraint contains multiple \"<=\".") - if len(parts) == 2: - return "<=" - - # check for ">=" - parts = input.split(">=") - if len(parts) > 2: - raise Exception("Given constraint contains multiple \">=\".") - if len(parts) == 2: - return ">=" - - # Error - raise Exception("Given constraint contains no \"==\", \"<=\" or \">=\"") - - -def constructConstraint(input: str, vars_dict: dict[str, Variable]): - type = getConstraintType(input) - - parts = input.split(type) - - match type: - case "==": - return constructExpression(parts[0], vars_dict) == constructExpression(parts[1], vars_dict) - case "<=": - return constructExpression(parts[0], vars_dict) <= constructExpression(parts[1], vars_dict) - case ">=": - return constructExpression(parts[0], vars_dict) >= constructExpression(parts[1], vars_dict) - \ No newline at end of file diff --git a/scip-server/src/expressions.py b/scip-server/src/expressions.py deleted file mode 100644 index 43770a79..00000000 --- a/scip-server/src/expressions.py +++ /dev/null @@ -1,50 +0,0 @@ -from pyscipopt import Variable - - -def constructFactor(input: str, vars_dict: dict[str, Variable]): - if len(input) == 0: - return 0 - - #print(f"in: {input}, vars: {vars_dict}") - negative = input.startswith('-') - - if negative and input[1: len(input)] in vars_dict: - return vars_dict[input[1: len(input)]] * -1 - if input in vars_dict: - return vars_dict[input] - - # factor is not a variable => it must be a number - if '.' in input: - return float(input) - return int(input) - - -def constructTerm(input: str, vars_dict: dict[str, Variable]): - factors = input.split('*') - - if len(factors) <= 0: - raise Exception("Term is empty.") - - result = constructFactor(factors[0], vars_dict) - - for i in range(1, len(factors)): - result = result * constructFactor(factors[i], vars_dict) - - return result - - - -def constructExpression(input: str, vars_dict: dict[str, Variable]): - # remove whitespaces - input = input.replace(' ', '') - - if len(input) <= 0: - raise Exception("Expression is empty.") - - # prefix every - with a +. This moves the minus into the term and lets us split by just + - input = input.replace('-', '+-') - - terms = input.split('+') - #print(terms) - - return sum(constructTerm(term, vars_dict) for term in terms) diff --git a/scip-server/src/solver.py b/scip-server/src/solver.py deleted file mode 100644 index 74dbbae0..00000000 --- a/scip-server/src/solver.py +++ /dev/null @@ -1,24 +0,0 @@ -from pyscipopt import Model, Variable -from src.constraints import constructConstraint -from src.expressions import constructExpression - -class Solver: - _model: Model - _variables: dict[str, Variable] - - def __init__(self, variables: list[str], constraints: list[str], objective: str): - self._model = Model() - - self._variables = dict() - for v in variables: - self._variables[v] = self._model.addVar(v, vtype="B") - - self._model.setObjective(constructExpression(objective, self._variables)) - - for cons in constraints: - self._model.addCons(constructConstraint(cons, self._variables)) - - def solve(self) -> dict[str, int]: - self._model.optimize() - solution = self._model.getBestSol() - return {variable:int(solution[self._variables[variable]]) for variable in self._variables } \ No newline at end of file diff --git a/solver/.clang-format b/solver/.clang-format new file mode 100644 index 00000000..2823f67b --- /dev/null +++ b/solver/.clang-format @@ -0,0 +1,98 @@ +--- +InsertNewlineAtEOF: true +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: true +AlignConsecutiveAssignments: + Enabled: true + AcrossComments: false + AcrossEmptyLines: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Right +AlignOperands: true +AlignTrailingComments: true +AllowAllArgumentsOnNextLine: true +AllowAllConstructorInitializersOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Empty +AllowShortLambdasOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: true +BinPackParameters: true +BraceWrapping: + BeforeLambdaBody: true + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterObjCDeclaration: true + AfterStruct: true + AfterUnion: false + AfterExternBlock: true + BeforeCatch: true + BeforeElse: true + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Custom +BreakBeforeInheritanceComma: false +BreakInheritanceList: BeforeColon +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: false +BreakConstructorInitializers: BeforeColon +BreakAfterJavaFieldAnnotations: false +BreakStringLiterals: true +ColumnLimit: 140 +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DeriveLineEnding: true +DerivePointerAlignment: false +FixNamespaceComments: true +IndentCaseLabels: false +IndentGotoLabels: true +IndentPPDirectives: None +IndentWidth: 4 +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: true +NamespaceIndentation: All +PointerAlignment: Right +ReflowComments: true +SortIncludes: false +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyBlock: false +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInConditionalStatement: false +SpacesInContainerLiterals: true +SpacesInCStyleCastParentheses: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +SpaceBeforeSquareBrackets: false +Standard: Latest +TabWidth: 4 +UseCRLF: false +UseTab: Never diff --git a/solver/.clang-tidy b/solver/.clang-tidy new file mode 100644 index 00000000..55a84837 --- /dev/null +++ b/solver/.clang-tidy @@ -0,0 +1,55 @@ +--- +Checks: "*, + -abseil-*, + -altera-*, + -android-*, + -fuchsia-*, + -google-*, + -llvm*, + -modernize-use-trailing-return-type, + -zircon-*, + -readability-else-after-return, + -readability-static-accessed-through-instance, + -readability-avoid-const-params-in-decls, + -cppcoreguidelines-non-private-member-variables-in-classes, + -misc-non-private-member-variables-in-classes, + -readability-redundant-access-specifiers, + -cppcoreguidelines-special-member-functions, + -hicpp-special-member-functions, + -readability-implicit-bool-conversion, + -hicpp-explicit-conversions, + -*-magic-numbers, + -readability-named-parameter, + -hicpp-named-parameter, + -readability-identifier-length, + -cppcoreguidelines-owning-memory, + -cppcoreguidelines-pro-type-reinterpret-cast, + -cppcoreguidelines-avoid-non-const-global-variables, + -hicpp-signed-bitwise, + -*-uppercase-literal-suffix, + -*-cognitive-complexity, + -*-multiway-paths-covered, + -*-switch-missing-default-case, + -*-avoid-endl, + -cppcoreguidelines-pro-type-static-cast-downcast, + -misc-header-include-cycle, + -cppcoreguidelines-pro-type-vararg, + -*-member-init, + -bugprone-easily-swappable-parameters, + -hicpp-vararg, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -*-dcl21-cpp, + -cert-err58-cpp, + -performance-no-int-to-ptr, + -cppcoreguidelines-interfaces-global-init, + -*-avoid-c-arrays, + -hicpp-no-array-decay, + -*-array-to-pointer-decay, + -readability-isolate-declaration, + -readability-avoid-return-with-void-value, + -misc-use-internal-linkage, + -readability-avoid-nested-conditional-operator, +" +WarningsAsErrors: '' +HeaderFilterRegex: '' +FormatStyle: none diff --git a/solver/.gitignore b/solver/.gitignore new file mode 100644 index 00000000..03ddc880 --- /dev/null +++ b/solver/.gitignore @@ -0,0 +1,4 @@ +.cache +**/**.bak + +build diff --git a/solver/CMakeLists.txt b/solver/CMakeLists.txt new file mode 100644 index 00000000..c6df3bb2 --- /dev/null +++ b/solver/CMakeLists.txt @@ -0,0 +1,35 @@ +cmake_minimum_required(VERSION 3.25) +project(jspl-solver LANGUAGES CXX VERSION 1.0.0) + +# -------------------------------------------------------------------------------------------------------- +# Create Library +# -------------------------------------------------------------------------------------------------------- + +file(GLOB src "src/*.cpp") + +add_executable(${PROJECT_NAME} ${src}) +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "index" EXECUTABLE_SUFFIX ".html") + +target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_23) +set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23 CXX_EXTENSIONS OFF CXX_STANDARD_REQUIRED ON) + +# -------------------------------------------------------------------------------------------------------- +# Setup Includes +# -------------------------------------------------------------------------------------------------------- + +target_include_directories(${PROJECT_NAME} PUBLIC "include") + +# -------------------------------------------------------------------------------------------------------- +# Setup Dependencies +# -------------------------------------------------------------------------------------------------------- + +include("cmake/cpm.cmake") + +CPMFindPackage( + NAME z3 + GIT_TAG z3-4.15.3 + GIT_REPOSITORY "https://github.com/Z3Prover/z3" +) + +target_link_libraries(${PROJECT_NAME} PUBLIC libz3 embind) +target_include_directories(libz3 INTERFACE $) diff --git a/solver/cmake/cpm.cmake b/solver/cmake/cpm.cmake new file mode 100644 index 00000000..77b333c4 --- /dev/null +++ b/solver/cmake/cpm.cmake @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: MIT +# +# SPDX-FileCopyrightText: Copyright (c) 2019-2023 Lars Melchior and contributors + +set(CPM_DOWNLOAD_VERSION 0.41.0) +set(CPM_HASH_SUM "e570f03806b9aae2082ca5b950a9e6b3b41ad56972a78a876aedcaad16653116") + +if(CPM_SOURCE_CACHE) + set(CPM_DOWNLOAD_LOCATION "${CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +elseif(DEFINED ENV{CPM_SOURCE_CACHE}) + set(CPM_DOWNLOAD_LOCATION "$ENV{CPM_SOURCE_CACHE}/cpm/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +else() + set(CPM_DOWNLOAD_LOCATION "${CMAKE_BINARY_DIR}/cmake/CPM_${CPM_DOWNLOAD_VERSION}.cmake") +endif() + +# Expand relative path. This is important if the provided path contains a tilde (~) +get_filename_component(CPM_DOWNLOAD_LOCATION ${CPM_DOWNLOAD_LOCATION} ABSOLUTE) + +file(DOWNLOAD + https://github.com/cpm-cmake/CPM.cmake/releases/download/v${CPM_DOWNLOAD_VERSION}/CPM.cmake + ${CPM_DOWNLOAD_LOCATION} EXPECTED_HASH SHA256=${CPM_HASH_SUM} +) + +include(${CPM_DOWNLOAD_LOCATION}) diff --git a/solver/include/emitter.hpp b/solver/include/emitter.hpp new file mode 100644 index 00000000..81c5db65 --- /dev/null +++ b/solver/include/emitter.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include "parser.hpp" + +#include +#include + +namespace jspl +{ + // While the whole parser for expressions here is rather overkill, it would allow to + // easily swap out z3 with scip in the future if desired (scip does not work well with wasm though). + // Furthermore, we have the added benefit of allowing more complicated expressions later on. + + struct emitter + { + using variables = std::unordered_map; + + private: + z3::context *m_context; + variables *m_variables; + + public: + emitter(z3::context &, variables &); + + private: + res emit(binary &); + res emit(unary &); + res emit(literal &); + res emit(constant &); + + public: + res emit(node); + }; +} // namespace jspl diff --git a/solver/include/lexer.hpp b/solver/include/lexer.hpp new file mode 100644 index 00000000..ae8ce3fc --- /dev/null +++ b/solver/include/lexer.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include "utils.hpp" + +#include +#include + +namespace jspl +{ + enum class token_type : std::uint8_t + { + eof, + eq, + lt, + gt, + leq, + geq, + neq, + plus, + minus, + literal, + constant, + }; + + struct token + { + token_type type; + std::string_view value; + }; + + class lexer + { + std::string_view m_source; + + public: + lexer(std::string_view source); + + private: + [[nodiscard]] char peek(std::size_t = 0) const; + [[nodiscard]] std::string_view consume(std::size_t); + + private: + res expect(char, std::size_t = 0); + + private: + res literal(); + res constant(); + + public: + res next(); + }; +} // namespace jspl diff --git a/solver/include/parser.hpp b/solver/include/parser.hpp new file mode 100644 index 00000000..35e58cf9 --- /dev/null +++ b/solver/include/parser.hpp @@ -0,0 +1,65 @@ +#pragma once + +#include "lexer.hpp" +#include "utils.hpp" + +namespace jspl +{ + struct binary; + struct unary; + struct literal; + struct constant; + + using node = variant_ptr; + + struct binary + { + token_type op; + node left, right; + }; + + struct unary + { + token_type op; + node value; + }; + + struct literal + { + std::string_view name; + }; + + struct constant + { + std::string_view value; + }; + + class parser + { + lexer m_lexer; + res m_current; + + public: + parser(std::string_view); + + private: + [[nodiscard]] bool is(token_type) const; + + private: + [[nodiscard]] res take(); + [[nodiscard]] res take(token_type); + [[nodiscard]] res take(std::initializer_list); + + private: + [[nodiscard]] res primary(); + [[nodiscard]] res unary(); + + private: + [[nodiscard]] res expr(); + [[nodiscard]] res term(); + + public: + [[nodiscard]] res objective(); + [[nodiscard]] res constraint(); + }; +} // namespace jspl diff --git a/solver/include/utils.hpp b/solver/include/utils.hpp new file mode 100644 index 00000000..2e3b5fa0 --- /dev/null +++ b/solver/include/utils.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +#include +#include +#include + +namespace jspl +{ + template + using res = std ::expected; + using err = std::unexpected; + + template + using variant_ptr = std::variant...>; + + template + requires std::invocable + auto bind_ignore(T &&, Ts &&...); + + template + auto bind_ignore(T (C::*)(Ts...), C *, Ts &&...); +} // namespace jspl + +#include "utils.inl" diff --git a/solver/include/utils.inl b/solver/include/utils.inl new file mode 100644 index 00000000..bb1df7a6 --- /dev/null +++ b/solver/include/utils.inl @@ -0,0 +1,28 @@ +#pragma once + +#include "utils.hpp" + +#include +#include + +namespace jspl +{ + template + auto bind_ignore(T (C::*func)(Ts...), C *instance, Ts &&...params) + { + return [func, instance, ... params = std::forward(params)](Ds &&...) mutable + { + return std::invoke(func, instance, std::forward(params)...); + }; + } + + template + requires std::invocable + auto bind_ignore(T &&callable, Ts &&...params) + { + return [callable = std::forward(callable), ... params = std::forward(params)](Ds &&...) mutable + { + return std::invoke(std::forward(callable), std::forward(params)...); + }; + } +} // namespace jspl diff --git a/solver/src/emitter.cpp b/solver/src/emitter.cpp new file mode 100644 index 00000000..3c55d3ba --- /dev/null +++ b/solver/src/emitter.cpp @@ -0,0 +1,97 @@ +#include "emitter.hpp" + +#include + +namespace jspl +{ + emitter::emitter(z3::context &ctx, variables &vars) : m_context(&ctx), m_variables(&vars) {} + + res emitter::emit(binary &node) + { + auto left = emit(std::move(node.left)); + + if (!left) + { + return left; + } + + auto right = emit(std::move(node.right)); + + if (!right) + { + return right; + } + + switch (node.op) + { + using enum token_type; + + case minus: + return left.value() - right.value(); + case plus: + return left.value() + right.value(); + case lt: + return left.value() < right.value(); + case gt: + return left.value() > right.value(); + case leq: + return left.value() <= right.value(); + case geq: + return left.value() >= right.value(); + case eq: + return left.value() == right.value(); + case neq: + return left.value() != right.value(); + + case eof: + [[fallthrough]]; + case literal: + [[fallthrough]]; + case constant: + std::unreachable(); + } + } + + res emitter::emit(unary &node) + { + auto value = emit(std::move(node.value)); + + if (!value) + { + return value; + } + + switch (node.op) + { + using enum token_type; + + case minus: + return -1 * value.value(); + + default: + std::unreachable(); + } + } + + res emitter::emit(literal &node) + { + auto var = m_variables->find(node.name); + + if (var == m_variables->end()) + { + return err{std::format("No variable '{}'", node.name)}; + } + + return z3::ite(var->second, m_context->int_val(1), m_context->int_val(0)); + } + + res emitter::emit(constant &node) + { + return m_context->int_val(std::string{node.value}.c_str()); + } + + res emitter::emit(node node) + { + return std::visit([this](auto &&value) { return emit(*value); }, std::move(node)); + } +} // namespace jspl diff --git a/solver/src/lexer.cpp b/solver/src/lexer.cpp new file mode 100644 index 00000000..f15611b8 --- /dev/null +++ b/solver/src/lexer.cpp @@ -0,0 +1,106 @@ +#include "lexer.hpp" + +#include +#include + +namespace jspl +{ + static const auto special = std::unordered_set{'+', '-', '<', '>', '='}; + + lexer::lexer(std::string_view source) : m_source(source) {} + + char lexer::peek(std::size_t offset) const + { + return offset < m_source.size() ? m_source[offset] : '\0'; + } + + std::string_view lexer::consume(std::size_t n) + { + auto rtn = m_source.substr(0, n); + m_source = m_source.substr(n); + return rtn; + } + + res lexer::expect(char c, std::size_t offset) + { + auto rtn = peek(offset); + + if (rtn != c) + { + return err{std::format("Expected '{}' but got '{}'", c, rtn)}; + } + + return rtn; + } + + res lexer::literal() + { + std::size_t len = 0; + + for (auto c = peek(); len == 0 ? std::isalpha(c) : std::isalnum(c);) + { + c = peek(++len); + } + + if (!len) + { + return err{"Expected literal"}; + } + + return token{.type = token_type::literal, .value = consume(len)}; + } + + res lexer::constant() + { + std::size_t len = 0; + + for (auto c = peek(); std::isdigit(c);) + { + c = peek(++len); + } + + if (!len) + { + return err{"Expected number"}; + } + + return token{.type = token_type::constant, .value = consume(len)}; + } + + res lexer::next() + { + while (!m_source.empty() && std::isspace(peek())) + { + std::ignore = consume(1); + } + + if (m_source.empty()) + { + return token{.type = token_type::eof, .value = {}}; + } + + switch (peek()) + { + using enum token_type; + + case '-': + return token{.type = minus, .value = consume(1)}; + case '+': + return token{.type = plus, .value = consume(1)}; + case '>': { + const auto len = 1 + (peek(1) == '='); + return token{.type = len == 2 ? geq : gt, .value = consume(len)}; + } + case '<': { + const auto len = 1 + (peek(1) == '='); + return token{.type = len == 2 ? leq : lt, .value = consume(len)}; + } + case '=': + return expect('=', 1).transform(bind_ignore([this] { return token{.type = eq, .value = consume(2)}; })); + case '!': + return expect('=', 1).transform(bind_ignore([this] { return token{.type = eq, .value = consume(2)}; })); + } + + return constant().or_else(bind_ignore(&lexer::literal, this)); + } +} // namespace jspl diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp new file mode 100644 index 00000000..4aecd698 --- /dev/null +++ b/solver/src/parser.cpp @@ -0,0 +1,170 @@ +#include "parser.hpp" + +#include +#include + +#include + +namespace jspl +{ + parser::parser(std::string_view source) : m_lexer(source) + { + std::ignore = take(); + } + + bool parser::is(token_type type) const + { + return m_current && m_current->type == type; + } + + res parser::take() + { + auto rtn = std::move(m_current); + m_current = m_lexer.next(); + return rtn; + } + + res parser::take(token_type type) + { + if (!is(type)) + { + return err{std::format("Expected <{}>", std::to_underlying(type))}; + } + + return take(); + } + + res parser::take(std::initializer_list allowed) + { + for (const auto &type : allowed) + { + auto rtn = take(type); + + if (!rtn) + { + continue; + } + + return rtn; + } + + // Emscriptens libc++ does not have std::views::join_with + // yet, so we'll have to it the ugly way :/ + + auto str = std::string{}; + + for (const auto &type : allowed) + { + str += std::format("{},", std::to_underlying(type)); + } + + str.pop_back(); + + return err{std::format("Expected one of <{}>", str)}; + } + + res parser::primary() + { + if (auto tok = take(token_type::literal); tok) + { + return std::make_unique(tok->value); + } + + if (auto tok = take(token_type::constant); tok) + { + return std::make_unique(tok->value); + } + + return err{"Expected primary"}; + } + + res parser::unary() + { + auto op = take(token_type::minus); + + if (!op) + { + return err{op.error()}; + } + + auto prim = primary(); + + if (!prim) + { + return prim; + } + + return std::make_unique(op->type, std::move(prim.value())); + } + + res parser::expr() + { + return unary().or_else(bind_ignore(&parser::primary, this)); + } + + res parser::term() + { + using enum token_type; + + auto left = expr(); + + if (!left) + { + return left; + } + + auto op = res{}; + + while ((op = take({plus, minus}))) + { + auto right = expr(); + + if (!right) + { + return right; + } + + left = std::make_unique(op->type, std::move(left.value()), std::move(right.value())); + } + + return left; + } + + res parser::objective() + { + return term(); + } + + res parser::constraint() + { + using enum token_type; + + auto left = term(); + + if (!left) + { + return left; + } + + auto op = take({lt, gt, leq, geq, eq, neq}); + + if (!op) + { + return err{op.error()}; + } + + auto right = term(); + + if (!right) + { + return right; + } + + if (auto res = take(eof); !res) + { + return err{res.error()}; + } + + return std::make_unique(op->type, std::move(left.value()), std::move(right.value())); + } +} // namespace jspl diff --git a/solver/src/solver.cpp b/solver/src/solver.cpp new file mode 100644 index 00000000..cd670383 --- /dev/null +++ b/solver/src/solver.cpp @@ -0,0 +1,124 @@ +#include "emitter.hpp" + +#include +#include +#include + +#include + +struct input +{ + std::string objective; + + public: + std::vector variables; + std::vector constraints; +}; + +struct output +{ + bool success; + std::string message; + + public: + std::map variables; +}; + +output solve(const input &inp) +{ + using namespace jspl; + + auto ctx = z3::context{}; + auto opt = z3::optimize{ctx}; + auto var = emitter::variables{}; + + for (const auto &name : inp.variables) + { + var.emplace(name, ctx.bool_const(name.c_str())); + } + + auto emt = emitter{ctx, var}; + + for (const auto &constraint : inp.constraints) + { + auto parsed = parser{constraint}.constraint(); + + if (!parsed) + { + return { + .success = false, + .message = parsed.error(), + }; + } + + auto expr = emt.emit(std::move(parsed.value())); + + if (!expr) + { + return { + .success = false, + .message = expr.error(), + }; + } + + opt.add(expr.value()); + } + + auto parsed = parser{inp.objective}.objective(); + + if (!parsed) + { + return { + .success = false, + .message = parsed.error(), + }; + } + + auto objective = emt.emit(std::move(parsed.value())); + + if (!objective) + { + return { + .success = false, + .message = objective.error(), + }; + } + + opt.minimize(objective.value()); + + if (opt.check() != z3::sat) + { + return { + .success = false, + .message = "unsat", + }; + } + + auto model = opt.get_model(); + auto rtn = output{.success = true}; + + for (const auto &[name, value] : var) + { + rtn.variables.emplace(name, model.eval(value).is_true()); + } + + return rtn; +} + +EMSCRIPTEN_BINDINGS(solver) +{ + emscripten::register_vector("VecString"); + emscripten::register_map("MapVariables"); + + emscripten::value_object("Input") + .field("objective", &input::objective) + .field("variables", &input::variables) + .field("constraints", &input::constraints); + + emscripten::value_object("Output") + .field("success", &output::success) + .field("message", &output::message) + .field("variables", &output::variables); + + emscripten::function("solve", solve); +} From 23f7be1a29c7ea729ad367e69f6bab5792e756fa Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 29 Oct 2025 17:21:13 +0100 Subject: [PATCH 02/36] refactor(parser): ensure eof in objective --- solver/src/parser.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp index 4aecd698..65de9dc9 100644 --- a/solver/src/parser.cpp +++ b/solver/src/parser.cpp @@ -132,7 +132,16 @@ namespace jspl res parser::objective() { - return term(); + using enum token_type; + + auto rtn = term(); + + if (auto res = take(eof); !res) + { + return err{res.error()}; + } + + return rtn; } res parser::constraint() From 913ca200794e2b95b586add278936b320481a898 Mon Sep 17 00:00:00 2001 From: Curve Date: Thu, 30 Oct 2025 18:47:37 +0100 Subject: [PATCH 03/36] feat(solver): add type-definitions and helper script --- package.json | 1 + solver/.gitignore | 1 + solver/CMakeLists.txt | 11 ++++++++--- solver/dprint.json | 21 +++++++++++++++++++++ solver/wasm/loader.ts | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 solver/dprint.json create mode 100644 solver/wasm/loader.ts diff --git a/package.json b/package.json index 0ddbe2e8..1ec79ea4 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@typescript-eslint/eslint-plugin": "~6.4.1", "@typescript-eslint/parser": "~6.4.1", "concurrently": "~8.2.1", + "dprint": "^0.50.2", "esbuild": "^0.19.12", "eslint": "~8.47.0", "langium-cli": "~2.1.0", diff --git a/solver/.gitignore b/solver/.gitignore index 03ddc880..f1e6224f 100644 --- a/solver/.gitignore +++ b/solver/.gitignore @@ -2,3 +2,4 @@ **/**.bak build +wasm/solver.d.ts diff --git a/solver/CMakeLists.txt b/solver/CMakeLists.txt index c6df3bb2..90aebd7c 100644 --- a/solver/CMakeLists.txt +++ b/solver/CMakeLists.txt @@ -8,11 +8,16 @@ project(jspl-solver LANGUAGES CXX VERSION 1.0.0) file(GLOB src "src/*.cpp") add_executable(${PROJECT_NAME} ${src}) -set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "index" EXECUTABLE_SUFFIX ".html") - target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_23) set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23 CXX_EXTENSIONS OFF CXX_STANDARD_REQUIRED ON) +# -------------------------------------------------------------------------------------------------------- +# Setup Emscripten +# -------------------------------------------------------------------------------------------------------- + +set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "solver") +target_link_options(${PROJECT_NAME} PRIVATE "SHELL:--emit-tsd \"${CMAKE_CURRENT_SOURCE_DIR}/ts/solver.d.ts\"") + # -------------------------------------------------------------------------------------------------------- # Setup Includes # -------------------------------------------------------------------------------------------------------- @@ -31,5 +36,5 @@ CPMFindPackage( GIT_REPOSITORY "https://github.com/Z3Prover/z3" ) -target_link_libraries(${PROJECT_NAME} PUBLIC libz3 embind) +target_link_libraries(${PROJECT_NAME} PRIVATE libz3 embind) target_include_directories(libz3 INTERFACE $) diff --git a/solver/dprint.json b/solver/dprint.json new file mode 100644 index 00000000..6d6c1c34 --- /dev/null +++ b/solver/dprint.json @@ -0,0 +1,21 @@ +{ + "typescript": { + "module.sortImportDeclarations": "maintain", + "quoteStyle": "preferDouble", + "bracePosition": "nextLine", + "indentWidth": 4 + }, + "prettier": { + "tabWidth": 2, + "bracketSameLine": false + }, + "excludes": [ + "**/node_modules", + "**/*-lock.yaml" + ], + "plugins": [ + "https://plugins.dprint.dev/typescript-0.90.3.wasm", + "https://plugins.dprint.dev/json-0.19.2.wasm", + "https://plugins.dprint.dev/prettier-0.40.0.json@68c668863ec834d4be0f6f5ccaab415df75336a992aceb7eeeb14fdf096a9e9c" + ] +} diff --git a/solver/wasm/loader.ts b/solver/wasm/loader.ts new file mode 100644 index 00000000..243e71b6 --- /dev/null +++ b/solver/wasm/loader.ts @@ -0,0 +1,36 @@ +import { EmbindModule } from "./solver"; // < Generated when solver is compiled + +declare global +{ + const Module: EmscriptenModule; +} + +export default function(path = "solver.js") +{ + return new Promise((resolve, reject) => + { + const script = document.createElement("script"); + + script.onload = () => + { + if (!Module) + { + return reject("Module not available. Did the WASM module load properly?"); + } + + Module.onRuntimeInitialized = () => + { + resolve(Module as unknown as EmbindModule); + }; + }; + + script.onerror = (event, source) => + { + reject(`Failed to load script (${event}): ${source}`); + }; + + script.src = path; + + document.head.appendChild(script); + }); +} From b34daefb2ae72e7dd2318cfb926a20d3d5782c55 Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 00:48:19 +0100 Subject: [PATCH 04/36] feat(lib): in-memory model parsing --- lib/model.ts | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 lib/model.ts diff --git a/lib/model.ts b/lib/model.ts new file mode 100644 index 00000000..2af7d4c8 --- /dev/null +++ b/lib/model.ts @@ -0,0 +1,29 @@ +import { AstNode, EmptyFileSystem, LangiumDocument, LangiumServices, URI } from "langium"; + +import type { Model } from "../src/language/generated/ast"; +import { createJavaScriptPropositionalLaboratoryFormatServices as createJSPLFormatServices } from "../src/language/java-script-propositional-laboratory-format-module.js"; + +export async function extractDocument(content: string, services: LangiumServices): Promise +{ + const document = services.shared.workspace.LangiumDocumentFactory.fromString(content, URI.file("tmp.jspl")); + await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); + const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); + + if (validationErrors.length > 0) + { + throw validationErrors; + } + + return document; +} + +export async function extractAstNode(fileName: string, services: LangiumServices): Promise +{ + return (await extractDocument(fileName, services)).parseResult?.value as T; +} + +export function extractModel(input: string): Promise +{ + const services = createJSPLFormatServices(EmptyFileSystem).JavaScriptPropositionalLaboratoryFormat; + return extractAstNode(input, services); +} From 11503f8ada599793ceada71c0cd380d46cf49cf2 Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 00:58:19 +0100 Subject: [PATCH 05/36] refactor(lib): exceptions are evil --- lib/model.ts | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/model.ts b/lib/model.ts index 2af7d4c8..120a7ae4 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -1,9 +1,17 @@ +import { Diagnostic } from "vscode-languageserver"; import { AstNode, EmptyFileSystem, LangiumDocument, LangiumServices, URI } from "langium"; import type { Model } from "../src/language/generated/ast"; -import { createJavaScriptPropositionalLaboratoryFormatServices as createJSPLFormatServices } from "../src/language/java-script-propositional-laboratory-format-module.js"; +import { createJavaScriptPropositionalLaboratoryFormatServices as createJSPLFormatServices } from "../src/language/java-script-propositional-laboratory-format-module"; -export async function extractDocument(content: string, services: LangiumServices): Promise +import { err, ok, Result } from "neverthrow"; + +type Res = Result; + +export async function extractDocument( + content: string, + services: LangiumServices, +): Promise>> { const document = services.shared.workspace.LangiumDocumentFactory.fromString(content, URI.file("tmp.jspl")); await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); @@ -11,18 +19,18 @@ export async function extractDocument(content: string, services: LangiumServices if (validationErrors.length > 0) { - throw validationErrors; + return err(validationErrors); } - return document; + return ok(document); } -export async function extractAstNode(fileName: string, services: LangiumServices): Promise +export async function extractAstNode(fileName: string, services: LangiumServices): Promise> { - return (await extractDocument(fileName, services)).parseResult?.value as T; + return (await extractDocument(fileName, services)).andThen(doc => ok(doc.parseResult?.value as T)); } -export function extractModel(input: string): Promise +export function extractModel(input: string): Promise> { const services = createJSPLFormatServices(EmptyFileSystem).JavaScriptPropositionalLaboratoryFormat; return extractAstNode(input, services); From 9c4c382324991991f0db0757b401922ad748ea02 Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 00:59:59 +0100 Subject: [PATCH 06/36] fix(solver/cmake): ts-definition path --- solver/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solver/CMakeLists.txt b/solver/CMakeLists.txt index 90aebd7c..99b7ca9f 100644 --- a/solver/CMakeLists.txt +++ b/solver/CMakeLists.txt @@ -16,7 +16,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23 CXX_EXTENSIONS # -------------------------------------------------------------------------------------------------------- set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "solver") -target_link_options(${PROJECT_NAME} PRIVATE "SHELL:--emit-tsd \"${CMAKE_CURRENT_SOURCE_DIR}/ts/solver.d.ts\"") +target_link_options(${PROJECT_NAME} PRIVATE "SHELL:--emit-tsd \"${CMAKE_CURRENT_SOURCE_DIR}/wasm/solver.d.ts\"") # -------------------------------------------------------------------------------------------------------- # Setup Includes From f355c073d1196e0854f203ff736744af513827f1 Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 14:39:48 +0100 Subject: [PATCH 07/36] refactor: cleanup tree --- .eslintrc.json | 13 - .gitignore | 17 +- .vscode/extensions.json | 9 - .vscode/launch.json | 35 -- .vscode/tasks.json | 21 - .vscodeignore | 8 - bin/cli.js | 4 - config/langium.json | 12 + solver/dprint.json => dprint.json | 0 esbuild.mjs | 54 -- graphviz.dot | 52 -- icon.png | Bin 18331 -> 0 bytes langium-config.json | 12 - langium-quickstart.md | 40 -- language-configuration.json | 30 - lib/language/jspl-format-module.ts | 81 +++ lib/language/jspl-validator.ts | 361 +++++++++++ .../language/jspl.langium | 4 +- lib/model.ts | 6 +- src/cli/main.ts | 50 -- src/extension/main.ts | 209 ------- src/generators/actions.ts | 105 ---- src/generators/graphviz/main.ts | 100 --- src/generators/json/main.ts | 213 ------- src/generators/lab/concerns.ts | 22 - src/generators/lab/conditions.ts | 15 - src/generators/lab/main.ts | 150 ----- src/generators/lab/propositions.ts | 86 --- src/generators/lab/util.ts | 96 --- src/generators/optimizer/concerns.ts | 22 - src/generators/optimizer/conditions.ts | 15 - src/generators/optimizer/logic.ts | 100 --- src/generators/optimizer/main.ts | 162 ----- src/generators/optimizer/propositions.ts | 86 --- src/generators/optimizer/raiseConditions.ts | 104 ---- src/generators/optimizer/util.ts | 101 --- ...-propositional-laboratory-format-module.ts | 63 -- ...opositional-laboratory-format-validator.ts | 193 ------ src/language/main.ts | 13 - src/util/cli-util.ts | 60 -- src/util/modelUtil.ts | 205 ------- templates/laboratory-template/LICENSE | 21 - templates/laboratory-template/README.md | 5 - templates/laboratory-template/data.js | 40 -- templates/laboratory-template/favicon.svg | 3 - templates/laboratory-template/github.png | Bin 1714 -> 0 bytes templates/laboratory-template/index.html | 74 --- templates/laboratory-template/lab.js | 237 ------- templates/optimizer-template/LICENSE | 21 - templates/optimizer-template/README.md | 5 - templates/optimizer-template/data.js | 39 -- templates/optimizer-template/favicon.svg | 3 - templates/optimizer-template/github.png | Bin 1714 -> 0 bytes .../htm_preact_standalone.js | 1 - templates/optimizer-template/index.html | 93 --- templates/optimizer-template/lab.js | 576 ------------------ templates/optimizer-template/optimization.js | 224 ------- 57 files changed, 464 insertions(+), 3807 deletions(-) delete mode 100644 .eslintrc.json delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/launch.json delete mode 100644 .vscode/tasks.json delete mode 100644 .vscodeignore delete mode 100644 bin/cli.js create mode 100644 config/langium.json rename solver/dprint.json => dprint.json (100%) delete mode 100644 esbuild.mjs delete mode 100644 graphviz.dot delete mode 100644 icon.png delete mode 100644 langium-config.json delete mode 100644 langium-quickstart.md delete mode 100644 language-configuration.json create mode 100644 lib/language/jspl-format-module.ts create mode 100644 lib/language/jspl-validator.ts rename src/language/java-script-propositional-laboratory-format.langium => lib/language/jspl.langium (98%) delete mode 100644 src/cli/main.ts delete mode 100644 src/extension/main.ts delete mode 100644 src/generators/actions.ts delete mode 100644 src/generators/graphviz/main.ts delete mode 100644 src/generators/json/main.ts delete mode 100644 src/generators/lab/concerns.ts delete mode 100644 src/generators/lab/conditions.ts delete mode 100644 src/generators/lab/main.ts delete mode 100644 src/generators/lab/propositions.ts delete mode 100644 src/generators/lab/util.ts delete mode 100644 src/generators/optimizer/concerns.ts delete mode 100644 src/generators/optimizer/conditions.ts delete mode 100644 src/generators/optimizer/logic.ts delete mode 100644 src/generators/optimizer/main.ts delete mode 100644 src/generators/optimizer/propositions.ts delete mode 100644 src/generators/optimizer/raiseConditions.ts delete mode 100644 src/generators/optimizer/util.ts delete mode 100644 src/language/java-script-propositional-laboratory-format-module.ts delete mode 100644 src/language/java-script-propositional-laboratory-format-validator.ts delete mode 100644 src/language/main.ts delete mode 100644 src/util/cli-util.ts delete mode 100644 src/util/modelUtil.ts delete mode 100644 templates/laboratory-template/LICENSE delete mode 100644 templates/laboratory-template/README.md delete mode 100644 templates/laboratory-template/data.js delete mode 100644 templates/laboratory-template/favicon.svg delete mode 100644 templates/laboratory-template/github.png delete mode 100644 templates/laboratory-template/index.html delete mode 100644 templates/laboratory-template/lab.js delete mode 100644 templates/optimizer-template/LICENSE delete mode 100644 templates/optimizer-template/README.md delete mode 100644 templates/optimizer-template/data.js delete mode 100644 templates/optimizer-template/favicon.svg delete mode 100644 templates/optimizer-template/github.png delete mode 100644 templates/optimizer-template/htm_preact_standalone.js delete mode 100644 templates/optimizer-template/index.html delete mode 100644 templates/optimizer-template/lab.js delete mode 100644 templates/optimizer-template/optimization.js diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 8252235c..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - } -} diff --git a/.gitignore b/.gitignore index 4079519f..3e9d4182 100644 --- a/.gitignore +++ b/.gitignore @@ -1,13 +1,6 @@ -.vscode/* -!.vscode/extensions.json -!.vscode/launch.json -!.vscode/tasks.json -node_modules -out/ -src/language/generated/ -static/bundle/ -static/monaco-editor-workers/ -static/worker/ +.cache + +test/ syntaxes/ -examples/out -**/__pycache__/* +node_modules/ +lib/language/generated diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 25933b03..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. - // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp - - // List of extensions which should be recommended for users of this workspace. - "recommendations": [ - "langium.langium-vscode" - ] -} diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index e44e9fbc..00000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,35 +0,0 @@ -// A launch configuration that launches the extension inside a new window -// Use IntelliSense to learn about possible attributes. -// Hover to view descriptions of existing attributes. -// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*.js" - ] - }, - { - "name": "Attach to Language Server", - "type": "node", - "port": 6009, - "request": "attach", - "skipFiles": [ - "/**" - ], - "sourceMaps": true, - "outFiles": [ - "${workspaceFolder}/out/**/*.js", - "${workspaceFolder}/node_modules/langium" - ] - } - ] -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index d0aa3d5a..00000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "Build java-script-propositional-laboratory-format", - "command": "npm run langium:generate && npm run build", - "type": "shell", - "group": { - "kind": "build", - "isDefault": true - }, - "detail": "Langium: Generate grammar and build the java-script-propositional-laboratory-format language", - "icon": { - "color": "terminal.ansiGreen", - "id": "server-process" - } - } - ] -} diff --git a/.vscodeignore b/.vscodeignore deleted file mode 100644 index d10f9b25..00000000 --- a/.vscodeignore +++ /dev/null @@ -1,8 +0,0 @@ -.vscode/** -.vscode-test/** -.gitignore -langium-quickstart.md -src/ -examples/ -node_modules/ -scip-server/ \ No newline at end of file diff --git a/bin/cli.js b/bin/cli.js deleted file mode 100644 index e166dc61..00000000 --- a/bin/cli.js +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env node - -import main from '../out/cli/main.js'; -main(); diff --git a/config/langium.json b/config/langium.json new file mode 100644 index 00000000..6989b0f7 --- /dev/null +++ b/config/langium.json @@ -0,0 +1,12 @@ +{ + "projectName": "JSPL", + "languages": [{ + "id": "jspl", + "textMate": { + "out": "../syntaxes/jspl-format.tmLanguage.json" + }, + "fileExtensions": [".jspl"], + "grammar": "../lib/language/jspl.langium" + }], + "out": "../lib/language/generated" +} diff --git a/solver/dprint.json b/dprint.json similarity index 100% rename from solver/dprint.json rename to dprint.json diff --git a/esbuild.mjs b/esbuild.mjs deleted file mode 100644 index db5eff80..00000000 --- a/esbuild.mjs +++ /dev/null @@ -1,54 +0,0 @@ -//@ts-check -import * as esbuild from 'esbuild'; - -const watch = process.argv.includes('--watch'); -const minify = process.argv.includes('--minify'); - -const success = watch ? 'Watch build succeeded' : 'Build succeeded'; - -function getTime() { - const date = new Date(); - return `[${`${padZeroes(date.getHours())}:${padZeroes(date.getMinutes())}:${padZeroes(date.getSeconds())}`}] `; -} - -function padZeroes(i) { - return i.toString().padStart(2, '0'); -} - -const plugins = [{ - name: 'watch-plugin', - setup(build) { - build.onEnd(result => { - if (result.errors.length === 0) { - console.log(getTime() + success); - } - }); - }, -}]; - -const ctx = await esbuild.context({ - // Entry points for the vscode extension and the language server - entryPoints: ['src/extension/main.ts', 'src/language/main.ts'], - outdir: 'out', - bundle: true, - target: "ES2017", - // VSCode's extension host is still using cjs, so we need to transform the code - format: 'cjs', - // To prevent confusing node, we explicitly use the `.cjs` extension - outExtension: { - '.js': '.cjs' - }, - loader: { '.ts': 'ts' }, - external: ['vscode'], - platform: 'node', - sourcemap: !minify, - minify, - plugins -}); - -if (watch) { - await ctx.watch(); -} else { - await ctx.rebuild(); - ctx.dispose(); -} diff --git a/graphviz.dot b/graphviz.dot deleted file mode 100644 index 811d2e7b..00000000 --- a/graphviz.dot +++ /dev/null @@ -1,52 +0,0 @@ -digraph G { - typeofArray [shape=oval, color=black]; - typeofNan [shape=oval, color=black]; - zeroTripleEqualsNegativZero [shape=oval, color=black]; - zeroObjectIsNegativeZero [shape=oval, color=black]; - arrayWithNegativeZeroIncludesZero [shape=oval, color=black]; - nanTripleEqualsNan [shape=oval, color=black]; - nanObjectIsNan [shape=oval, color=black]; - arrayWithNanIncludesNan [shape=oval, color=black]; - arrayWithZeroTripleEqualsArrayWithZero [shape=oval, color=black]; - tupleWithZeroTripleEqualsTupleWithZero [shape=oval, color=black]; - objectIsFrozenTupleWithZero [shape=oval, color=black]; - storeNegativeZero [shape=oval, color=black]; - zerosAreTripleEqual [shape=oval, color=black]; - storeNegativeZero -> zerosAreTripleEqual [labelfontcolor="#ffba08", color="#ffba08"]; - storeNegativeZero -> zerosAreTripleEqual [labelfontcolor="#ffba08", color="#ffba08"]; - storeNegativeZero -> zerosAreTripleEqual [labelfontcolor="#ffba08", color="#ffba08"]; - tupleNaNAreTripleEqual [shape=oval, color=black]; - tupleWithZeroObjectIsTupleWithNegativeZero [shape=oval, color=black]; - storeNegativeZero -> tupleWithZeroObjectIsTupleWithNegativeZero [labelfontcolor="#ffba08", color="#ffba08"]; - typeofTuple -> tupleWithZeroObjectIsTupleWithNegativeZero [labelfontcolor="#ffba08", color="#ffba08"]; - zerosAreTripleEqual -> tupleWithZeroObjectIsTupleWithNegativeZero [labelfontcolor="#ffba08", color="#ffba08"]; - storeNegativeZero -> tupleWithZeroObjectIsTupleWithNegativeZero [labelfontcolor="#ffba08", color="#ffba08"]; - tupleWithNanObjectIsTupleWithNan [shape=oval, color=black]; - tupleNaNAreTripleEqual -> tupleWithNanObjectIsTupleWithNan [labelfontcolor="#ffba08", color="#ffba08"]; - typeofTuple [shape=oval, color=black]; - typeOfTupleWithBox -> typeofTuple [labelfontcolor="#ffba08", color="#ffba08"]; - typeofBoxConstructor -> typeofTuple [labelfontcolor="#ffba08", color="#ffba08"]; - typeOfTupleWithBox -> typeofTuple [labelfontcolor="#ffba08", color="#ffba08"]; - typeofBoxConstructor -> typeofTuple [labelfontcolor="#ffba08", color="#ffba08"]; - tupleWrappedInObjectTripleEqualsTuple [shape=oval, color=black]; - typeofTuple -> tupleWrappedInObjectTripleEqualsTuple [labelfontcolor="#ffba08", color="#ffba08"]; - typeofTuple -> tupleWrappedInObjectTripleEqualsTuple [labelfontcolor="#ffba08", color="#ffba08"]; - addingTupleToWeakSetThrows [shape=oval, color=black]; - typeofTuple -> addingTupleToWeakSetThrows [labelfontcolor="#ffba08", color="#ffba08"]; - tupleAsArgumentOfNewProxyThrows [shape=oval, color=black]; - typeofTuple -> tupleAsArgumentOfNewProxyThrows [labelfontcolor="#ffba08", color="#ffba08"]; - typeofBoxConstructor [shape=oval, color=black]; - typeofBoxInstance [shape=oval, color=black]; - noBox -> typeofBoxInstance [labelfontcolor="#9d0208", color="#9d0208"]; - typeOfTupleWithBox [shape=oval, color=black]; - typeofTuple -> typeOfTupleWithBox [labelfontcolor="#ffba08", color="#ffba08"]; - typeofBoxInstance -> typeOfTupleWithBox [labelfontcolor="#ffba08", color="#ffba08"]; - noBox -> typeOfTupleWithBox [labelfontcolor="#9d0208", color="#9d0208"]; - boxConstructorWithPrimitives [shape=oval, color=black]; - noBox -> boxConstructorWithPrimitives [labelfontcolor="#9d0208", color="#9d0208"]; - addingTuplesWithBoxesToWeakSets [shape=oval, color=black]; - noBox -> addingTuplesWithBoxesToWeakSets [labelfontcolor="#9d0208", color="#9d0208"]; - tupleWithBoxAsArgumentForNewProxy [shape=oval, color=black]; - typeOfTupleWithBox -> tupleWithBoxAsArgumentForNewProxy [labelfontcolor="#ffba08", color="#ffba08"]; - noBox -> tupleWithBoxAsArgumentForNewProxy [labelfontcolor="#9d0208", color="#9d0208"]; -} diff --git a/icon.png b/icon.png deleted file mode 100644 index fe85553edf8166ceef73f8b766e7343ed65f5f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18331 zcmeIaXH-<%wk|rWD4-A!5F|?uA_xcwB2jXXAW=Yq%4c)y=S-g^R;{L-mR@&i#Ep`vyU-)`1;rTSg$nI6^Sp}^Xxe>!a4cW>p~ z@W5F^<3N&1zk%CyoC$& zLoC#{RiFQT2A<&j`^mre;QvoOKoKB@LUWZTLi2LHm(62Mc+{F&3#iUc7S5Vod>?l8 z^(RcGKj`Y|ic25oK0g@e=Hylss9Ag2EWmED+JA7`RDX?+OvX8j;=@ z3og_5B|1(z25*H6*)BUIMqw)Wv@74mms0q(pFhZPbX^GhUMZm}AZ*iJ(??U~v#vMs z&NIx>u-a-V%L1Kt?rmE8_=)3>I^&~Lil-xXIS+g~e;b|IG_ySrI4fu8r{K<|Qx|q z1e1#0iwZpi6XG|)U7s&oY73{G>SXA5QfV|m5d_^{YEdDj)U_XPQ^CLx=KnNA zVYbuQ=V|)Mrt%j4Mn#G;1mhQ^N@|n=`Z9)k&kX&1K5IM@w6KGTW9@gQac1o`VS*vD zrRCPLlOcFE_0@%QHQ?ycFE;~!w6+}J4sAcp|9SI6F9FcFOA76gp-3huR9egW06~g! zi6lZR``7L^>ZHCaXH>`OO%;M6nCvWxHo;dn38H`cae_z@^pt{6`|if^Zd8Gm|1lkuwxr% zVXp{iJUtV)nHBo*bU4>Ipk8plKIo?q!y-A6>s~bzw34FbiU!9KNm>g2ztnrKy_x&G zF`{1knhtkCkbw1|0t6d;p7_y^2?e>>+One{+jcs>K-YtQw_Yo!J&n&qhG0d8TU!1i z;Qfn)e`m>ixcc2~W@+rz0i!_L6nN0MQ(ftYXzLi}S)qXqQtA1A6D0Ajpk_rrMAt~*U(;lbCPpcO*x8#+L^!b4V3 zQ8;PW_!A=`cy{LdgZHfpPAi3cciT0=@?Zaonx98XvssWhe?_7UN2jOGGc(-E-Dge) z#$&mPDN7PA?~HaIU#7E~d)rs_aDii@;bEiWOgh(e>%e%Gted+VyNK9+cURbx>smZ& zLt*)P)yuht8>%NpC<)eK1B9Jugpl&|& zeYfh!aYC-jlTfYqcdUxOSHuq68nW|}Jak4%C-1%y6@ioXP2w2cglALkk-vGAv=VWk zZzPm$KTUFiKEYg-BF5Z2r)yD8J0Q)YReP&6MR_xKgZZXKIjyVmc!8#i*L^wY?roNw zuY_>Yh;&&ac6j#1fDyce`L0T@x7^gyc}*6zi zRWoeGtBBRubg3q_vI;8n=^B6k?W?<@Kgor|DI9mZuee~C8yPQHDMlQij1qwn*kL|=42EMTB$ zl)6*doO1`drm`BTZ9kpaoww_OEnKI_TT!b zbX504vt9R%cK=CMg_mitY0!P@pnez~B7_AjQvP<%4ij|#RW9}IO(7~ z@a6J}4X$7~2Iuv+o9oz!yk)AS{cMSEgZta_vz(&aR?HC07TSGpbgZzO za+Dy2uC}T5T};=|(kKjgMKUm*3Yac5=~p^zGlbHeEBD9nV7FE^`T%98e$4e&E}sD7c1T%6XtI<7(b8zs!ry{Dd;3ZYZ3?8s;LG*l6nD?fOs}*? zFJ72-3U18Yep_Nvr@nJH{sn~4A(e)7G;=!`u!m0)8M~nJrP!Te%k(Ph0-e57VkTAd z^{^llhBn8$Fc|WX85ry9&T%*xjLV{8`(ljBGr^oajP2c{aWN|^>z=kU)1FPqIW{RN zsWs1JMmXs>4uBxCvfMx^h^L(`Hlpo`xr@0dH51yuC3PuA1+ceM@ z(sRla4gfKfXeXTUCx_6NMCT9l?L%=NSe?($%&(5MB-zQ@C_Ag0v{egUK`>Qtf^gXR z92*X4n+m2q!_$2lOuI6r zxpBIwawUj z#rUB|KZco8k@5miOL_KAXy1^-A*rM`(3l5;=K}z9SM_scASvV#Y%;i~v+S)a=7D?t z?YxAu_t)Kps#_d5VSy%;L8i5iPvp6?b&<)60Jiaw7u=SChTA6&U;4TYWIGIBe%CYv zwBFM7?gdIU(*|uK^B|K}^EV5{IRQuncmo;f!DfSf!{kv`J=?XU2A?pEDNf|dY*M+c+gfZlUj+_bre zL>=>lQm7^^odW(B0SupUm|G|0gVM=gG?;8BT1|OLW@FD+ovd-f>&@S$G0GQp}XH<99q!*qd zy{U*I>G;{tzgVD&fTMN<)-@g*pBKOa`95hpYwnq!ouggNc)CJB_NA{Yj-XQUO3=}e zt%0PMhm6HI0sJ9WqjMR9>&c*I=A_d5Dh-h>#@%cBDrh+!jb!P-z?QpLj>G)-cSZc4 zFg>(iqs9ZsfM|s*l^iz6=(#gagZg1^10U~YiOx#mn+f1omh^E;_O88Z{RCwPcJSLJ z*AhkqQ?fLl|1TlYjc(SElyHMsmgq`$ZM=h1y_RJOJ+~_NINF|m(m?>}2bGh)hd>B- zQi^L2u6o{?Z6C_9h%@7`Ow1+V$*MN=HJ&j|?0pckdmm3)8XxEtzOMZ_aJR?}v#TH@ z-8kDdEc%h7;1VaGt%Yb3gt8tpa+tOrXLvJ`Ror2^3lL`VE-OEPT#jGzxZ~qbEJz67 z4rOaqkP8}t@qWlA-*x;d*OA5Cj!Hp<4%iu;q1;hkpf|H57toX+ymnh3tOzaLmEPPX z&vFe|%Y+S>Z0enMJ#{2SJ^^tYZx7iA5D~d&Wvu*sel1@NPLv}lHfbS+q2V8r%KbI0 zBQw(m&({#J1h6*=LPhN~(38mEce@|mCaP_e8{G|QhcB0&CZW7=UQdezQU`TFAoKz~ zM<|PhxVz#poeqkn&s;m7WkR#u5f&tv@8G?-=HqIba>Fe$g?K38Kj|!ufsTWYf%9+o z*E$aOC&HiqHm8Cc&`b=S^^RG6h-V)RmSzI$lIBYxfp!Dk}B^50f4?T!PCCSugzb&^|+*&579ByWDr$Nqxg=!0+)& z+_k&-moXhkvopZrG9DN8WkAFdcukm1vGg&O{2126^B77^UJ1kB@33j^Ks# z7?41pNPE9#JQakjZA^3TH=NGoIW5emMNy(TWE`zYH#aW*HYVXedGX9zNRCP!97=ll zNV+^Tv}jpbs~(zo^-@ss;MSN2DOy3s@hACa=9SI1uM+HhNm1~R8lUl(J#o>_=oHYdz%%YSc_r&kzIatu`Slb~kz2gt@DqyfoaanAzBkAU zgKSF=+n)l+J|FUt?P65$R7)Z=U$}}nqEW`|Kj*`xye5F=0@-^+h776SNLa>=S)LD> ztb3W44#!{d8D)s}r2#YN=O$TdxC7Ks=SN5rhDO)vKG(kMox6C3>*Cs)@9(hpUpl=r z*(kAj9bbZXx*0aklnt`>>=2fl`$`aOc6L*?O^kImgJ#n*8zjz^QKa_r$3O4_oN1UW zB-7XMxh$AB|8O05un~)U`pacLojT1^%64LlC;?|*OB_+A{k|vWd7%o=KNWg$D9tqD z$y+z`=XKd_gDk@LMX4KDeZNfIArjx{R%7Ki+dr~LhVV{ ziv}v+7Q>`wj0ZQf7jWKRm@2B!UE_TQ7@4H+`1M`|AJfODpz@-V?0L(DIvS?p3-Lf- zu5SERdk)F*xohjK1@vwH4*Q`5{Dn%F8~a_m9xukI$G*w{6%2b_xd1@KEcJiDMgr1J zXO-deCOx;I2*s|zoBL{JPbV6iTz3=&_TO+>izs{P0q|DxvTK@y4DzdXFLg)z2EXC6 zW3_p_Od-aqIr)7dU??D&Xyd5#{n@uVQDEBcRW4QJh_|s*Sr6ngs*Jz9+WZ*P$Sx%{gPraHn67@})>j(%tXz1^{m;0@8VQm5 z@2kyA^+#Gvs|2b_eDP93`YFe_(TQ{CG7_P>rxHd&YqMfJuh{jYhDCYbp5;TDTM72=^yvP6v_im@`>upm=9q5x7k!vWg#Ad?onYf$S5w% zdPd}+SS9!mfF(E%u4iz*78PF zc_PR9szdsRpyj;Ql6d^cjpbI-%PblY?BywQHWe_|$VaUs5|$I?#h?8cPKRGt4`0q7 zGDToh$zglFK3kURmMl(*^MmLA%cnA-)B5Y_H9C?3zIEPF&#km&+fI&6(a((Yl(rt< z#J#CYBVrc1+p^56Ho`^64)*OYC5pQJ8$*GTD(1~>xhom8VU!}gMkPtR`Km$XiONvG zT83otZ$?SLod|5cD#y}r{eYxQkGeI9%L1(&qSc}El8pe~wKKD1p+lP%#!QxN@-iu{ z{(!?=3PpU8614FX%V9C{khJKOba4K+=t^k_Wuf7P3K7_$d!mP`$d^HrnVtj2)2o2x zC`uEDCos@>Ru9{mOdTe8O3is3c}&9RPIB+;fDp52W9jh%kTi#v$WT%?KWbbX!&gM^ zwXBPojFyiVmJuj&-;~VBoD}>`%dO{S6vkeS-g7^fFT`5qR%&zl36-LPf#ggKxQ_lhdO|Ou`($y=YGA!p zs`Aje=*hNd@m$uGD7ss^O^scZ>ufHk@2|`^DQeWfJJ%Q~yW=wa48C%!rGi7{mtrjz zlLOhpl0J04#>OpZ6c}#Ia~Oc>60kY_sDu%ocqfZf{|0ke3;4{2Y#}|`{bP`rC(=P48or~?4q?{5G?uQBFlr>Y;^cR~#dR3D>2N0x(1Tx`(8e6?s#Mk4 zKQgYjxQ+O2J@T!%BaI8(GOoP+S`5&tjoCqFFu_JGP0yUv1CBsR{e-ptpsVt(wi)CYcGgrS^)Y4~)`j(vv zcm^j>k^1T%d)+Eez-F6VMn&%$G~p#eC0=Vg82qDCDe3usjc3p;M%Ow*uz_17s?d3T z2;lMzcE42}M%XT@8}jU!^ToB^n?388k=%cR!Im+)J+2iJvOZPO$e0l0Fx!z$PT?{J zYFC$9!n_KSHr$6H(5ctWBcG#R0nLMcx4!0#yAz0uZaS-`$0fXR{;90D&AZ|N0-asJ z%AKJm3-UR}jkqt{HBP93+ zn*50OAK?2vAyAR2J3m99!Z&0YD${2)fLU7p&6Avf2huGhk%tf`*tLa7sL;YrJI@P! zc2}Wk?}^&=Z^i7u$*G1^y;lQH&JBsWomiu@ElFGd-bcS{vg1vLQ&(@kBpE2eRaNMN z5w?Fv9Is7~ZQDgXaMH>z_$-yVZe%zufO8+^T+nLO;fc;apyc>zTG!a4 zL()XsISBgO3otlOx!gwvA{^_T)CMB38i7Ak>3y$oi<=A@cKc{^6Dm+*YM7LL(=2`Is5B7eE4sE0-az&B2WqW;1@Y+f!qQiow^Ap-LlQp{_ug!N- z7`CEl09=`94A;_xf>%vjK`}AVWoYgrH9sI^wtrcnpWg70ac6-D9#%OQEVEko5GL(L zNWg9kG)&u#JAQIPtvk+`e;~X&E zt+7OZQLe|sVUE5AKB(&!uKKcVD(k^@weKSuwlfu8w3sfTWsd+%#gFm1QzWYLYwqwk zU=`+Ck9IyuvHKHg0cfTP#a!~^*qk31%d>x?qQ^u#@hD_>Rp86G2^nPZM!BJ~l2I+D zcH{8ATeW)}Ll1;31k7F`i*m-)C2yyVH(CHEbN}`~+P04M)O=8 z*d1+*Y*4coDl+#?3)&mY>(j3C{fZvlJ(*Ex#w0s1J}@?XY|nH3wlEo*2WGU1X!>@B z(@2cv6mg|Q1!b5B07$r0F@Dn(j^zrHtR>i{Vb-4(&pJG<`cBw6dot*%;>!&;_-Je= z%QAB>D_1jLaPUhf^Gp1UO>afXDGeI&Xrm~Bq8R$%*L?ppa9gg-XJN8!aYro1%XQT0 zdgi84$M{ye3S~@(;&4*O`fB^5UY+Kx^U*IUm6{e2R#uihp9k`L2FF^HtXj(i>UDje zv;i^#x_IF_Vq-1nnb1kAf}#ED)!R0wGRvO6d{^=!N(>tOmACpY2t{^D$Bmx=N{M!& zph(T9;Gon0mO)2=xNZ~S**KFKD>&_rVIp+BW8TpAsm6io>yOWf(7WjU7Qdj_CXbWO z(cR*PuK~sJ2@0jFN>hn9bDhIdwTcaNxwLqU_k{Guj0D`Dol>79e)&8QSaobjRxF$C zlLutWyT!FgcI&KvE_cVc(*Sp_86U4_Q>4Riq`Kdlu;6lNz+FxGl`B=+$d!)iW@Z~IE%KqGHaN z6VBZYn8*N{ z>PECdK8ysV$&Ct4VX_lUv%rGeMl59w$Lwkuxosw=ZsbmAXYD`7VIV{6l{$8jZ?+g~ z<^{Hodmv8QAF1fPHWV$=oQpabpHW>mVmZo5Rj>q9bweJVB?x_13!wc0RM!q2Cf0Pf z2#?2^NdH32(WX(A_uOB|XQrH|Y&xewEzJ+ASZ3DD^={C4`Kqm@GL0hPnkfq}g1x8R zr1C%ubR1;)1o4?P*q#=L+R0x~HS}FuI1}ABIgD!c8;kdDEm~@4D4c8d(-`XM?tOJO z+aHSA?4PWWt$EZP??hMIX+rZWq?EQOg0=xraDHKY2c(N6dy2lKL4)_lRr=O+?K!DgdSwL8r8;}aVWL& zK5=x)YQajAdl$d~8so?KzWN@flg-udqz*J!nZ@0w(|$>OegCc&o|e!sT9ifqabR zvim9|nD&MnD}O2g+^Mi152hOrPM9la4x6>lcqOk#{=j_qe>^0HV44Ma+H6ub>zu0o zRW8u61M+tLq=r5RC2Wb%ZR(8PV5+QVbK~60Yi%`Xa&>Crr2#dltwTWPzRG@X_Pd^!- zlpx#6UN#S$qwUXhPE$4=vCneUK}g>P+vQ2T|BYehi_Ji!i;!y~F6i!K5(UoFt*K;! z4tD6JGd&lG7TXr>>gulKkfp^gDI4@nWXCzbd{2f7`h?zU6|o#W*pa#Wv9}A>#<JD@@bOa0kCrV20Yxhg6R zBih8)F{A5@swTXxM`FH8)jXgCdINyd8=BhP^77F3&W_cf_RN>r%$d}XOi8S;_wN8< zS@P%8!b2cS=PBk#)54lf+L*r+N7I9#BWg0bw%!2oq`cQMi8NkYl9+#iH3J9{3xFTn zKyN5n*#*=A4W?qO^9$$H3+4TbnQJ!fAC%&NVa5PY&T6qW6CVbz@b9%Id5}y6y%6wz0DiY#Y7WcWc-<=xb{U3W_E2v3mzx*2LGR_bIUhTz~=o+#VBd zjDS}Jw&x$(1)^)uo#+JLRlep2&tb@yOi&~PZVeLU^<&y@=JcAyF=&>EO8=B`N-x1+ z0Ol}b0LIpIH~z6@733|o8$=^$8b~i7o9};9yT*CE%(9On7$_nXjBPl5Rb6GT@eMJ1 zus~XQ6e3Og)Dg+Y)^LZ}nnT_2+q7I$}PJ!k+`wxZ&mmAs3z20Q9SL=NlGSyR7r}SFp z=4bN+=fOmZZMKj*yj`F!2Q_gnFDxvo2AY_h;)zY$>`d!#Ht8?cjC1c-WMKWf)SH>@ zlbS<^Pu*%&f$bgR4%(;OzSFmavC2kT5d|E)sr6$ba7f_KO;BapjEMeo=s>W)_^sd?w?EG<%+ z|EISN5h(d_axa!8F1U|<88YCu1QkrIDVWh#cvB+Uer?)L*#kc?vUPb<9InaFYV0?^ zwAA_3ETWgDm4Dxmt(uc3KBBT3&k=*o2<4=i=z(j!HHni38m@>uWXMZF6`mtVRGWi1 zlNS`(GY6^1yg)0SM)FutJMJgx{@XD9z8Y?aL9X3vv&0rG#*24 z+yLsjE_~mDN|CS%Rx`BB$DfbF6R=50Nw1?=s@^bYDMGSYF-5ZhEmbzFS&xLq6Oz5Y z&K3reTYgTPGoQINZm++?1AcvRX|GP&AqvfHi9#XA3h5Qc}LW>MIw2qw<|!Q0p+NqWr zBj9FEkA<8?ft%Qd2<;hRS6@b-VI;-&ug(FdpVTF5eZQU>(bhd~`yB=(#$n!YB0!?% zV3^7#z{L7sUi1C(B7f&33puKW2O0zYtBajy7!3w$xEYivlD(?Gy`cK0)KCa+ru#r> zl@xsDHNRIa1)^;W|mh$3;1XBNN@e$$JEW{)48+f(>) zCHKYuv>h*lhRn7PnwWYv?E425O@LYQIgbq#2skY7z>$W+qh8`&!4j6VYgs)q5Iu=E zUr!I{vBMS_fI2$}ArNi9y>0s+f|Y#w>8mOWhSZ@JN|S397}j@lzLEe!AtxZb>Ua|f z^0Sh}(i&UiQ_$F+I*FSv{UIe>qljo5x3%rX_Q=e^Sb>!3v)d*wL7mUzcM0O)qNfOg z>Hc&tUa%C{^GHTQ>?qDUakT5l1NyCS?=jru8fGY;T}J92)>1Qt;IrOs$~*&&somXlj6`Lo7hMPr0lS1tR&_e_gAD?0ZV5L1>u(ag4P%6q`4TzgL-SOZx7qU^EDULZ zs^6a;?!dNlkc^FtOL4z>k53*-f)-StZp65g8V={@c_i0*HH z%9ES;bskD1d^}P-1DJdbl4foM(=O7MDF^$7CyLN8;z5bdJ<;>jeYfrF7|vz+Z^IPC z_1*F1*4<%A&E#%W9~Gh3oYFY=u-cR<4$l^z#U@0TB?e+~E|wS6xFAQW1gaN0I-nsRpD zuLE88?C%-6xPez=R6;gg+d5&72>XKgND6a7sJAdBs%_(Uh_ zCAss2>0wF{bZ`D6x%oLqhBCvs4QkT!&qa8NJhgDEr$&ys45|;ka1&zrf&qy9uhFjJ zCk0m~Z+XAZaKjR=_(XkD@A<=r6&2^n#4seTSey(~AbE8FZ`osgNuEh;Peaz~Kh-FF zsmdrC)7GD|M?dF^B(LR4QoxiluCOxCz5qJ#A`{nw3^glz`=8Fr3xVd0f`OZ}R05#0 zjq$P;Vp`PjNY;2~c$S2ijO6-OMAU^M5_w3= zrc>#k6xZg%eFW2CH0}FR?t=hNr%m#cWYVhoD@bMYa*CDJj0)&7{S3Y`cj6= zLm?z~fV%3g*4`lgBgMf7HlNj+r~n6Us^zjuBqd&U_id?y%*yaB(HextOo4kH6L-h&vI80l_4e`X! z6aJMDw~ePv`h!m6|E#Xf*|aB`O5x~V9LI8l$&zYXf8U>p&l-qg0eNuvuf|Sv9dv^N z_@AR|aZ#2^x&1itzZYUW`mInQ+f?T?&06jSYd>rojQ6p?ztZ~jz|P8{deu%dPF?;V zYHEyeeXBLs3gi7jrsHEBjzV1k`g0)^Z%i5rA+*VoIZ=w*GS1anzwklrtyz9}Uy7U4 zlg$ky6m%6CbBR<5cqss6(m-VSkmoUOhu=fo%!hQAkr%w4+#tsw_R~s!B$n^V|6+Xn zKPl9?*`gxqbl-|hOC=Lr?!UBX3^iLZK^H#dQXpbM+RO&)=`aR1ttIxe;iB6HD<{5S z$}fZIX0#y9)*?x0F^9=Tm{R&>KN)Fu0G8O*a2%MSW7(q7!YXm`T@Eh8oR@!G+wUzt zEabWQ-@3M4Jgug?H+&wC_i5E{1p0Cg=}3SZP-R62(cb8XPDttd^C==Lf5I(3u{=dhm=0Wif zCv$J+8#A~_V6%+`Br!b+BPh_hfYP7n-oC|rE?s2o$K_`umoF9#0b*}HQZ|doZojoa z9+HVd;jv)56UDtj?{6FE&G*DOa1~7M2WbJ9i@_x>+T3%P>3I=FM9@t4Ujw8TNu689 z1-CvndLZsf56=;bLTOStss6`bsMbUl#3RYG$0bXG~_)S*a9=9-ih1Vv4Y99n`6p-G3 z^b`jR3(4W69oT7 z1oj?n?UOdE0T1?GO{K?>&E(tZp;M+UWKh_;3= zwtx!5mH{{HXt1i#nOF-bA)oV{mR|w;kLI33{P*;~;TW(2$JA^+MK&sBS zL3jN909^igwtt96hRX~Gl&Z}lSaNHRmPfqB`fq3kzOgPy{P^G%QRdlx-vX(>tDfElz{3$vC;8!rk9N2hJ506?MgS9H)NrS%_-Nt+z~TRs5u=)4{5*^9 z@9IuSzako&k+9S0R|YDmkr+{n)r)_wu$naLg5v%q%nm40SOm>nYQ2okAD6P(0hGjM zXVh0xB|vLOUlUdBnD{3%G9P$n6ZW^JR&D4GRAkZebsjlFnouwF8o-oSpDJ@9*#H5f z1W$|rIiPSpWoafEXu$8Y?*rzV9QQ0yofNu$pX)8~Y1yP4c}&p=ur`AG!W*GLfeqh* z%bGa}BE>fW@-$PYG`xKWdS{kbCFy(|Gd=>0}7vO)( z1^o9yo5exct3;!`6WK0%&PlXVwyB_u+`cYv*mN69%3ZR%0#kZ=>Ex+$8wa@97#HDA z5_oQOG~e}5xQ5|XCK=Re0j~9uj0Z0;Ll>XcyXCt;e@3uViKUFsV#5N2LEOjFBz7eSw1pcQiuP#?6V;1s101erR(f|Me diff --git a/langium-config.json b/langium-config.json deleted file mode 100644 index 47c805e3..00000000 --- a/langium-config.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "projectName": "JavaScriptPropositionalLaboratoryFormat", - "languages": [{ - "id": "java-script-propositional-laboratory-format", - "grammar": "src/language/java-script-propositional-laboratory-format.langium", - "fileExtensions": [".jspl"], - "textMate": { - "out": "syntaxes/java-script-propositional-laboratory-format.tmLanguage.json" - } - }], - "out": "src/language/generated" -} diff --git a/langium-quickstart.md b/langium-quickstart.md deleted file mode 100644 index 57259af0..00000000 --- a/langium-quickstart.md +++ /dev/null @@ -1,40 +0,0 @@ -# Welcome to your Langium VS Code Extension - -## What's in the folder - -This folder contains all necessary files for your language extension. - * `package.json` - the manifest file in which you declare your language support. - * `language-configuration.json` - the language configuration used in the VS Code editor, defining the tokens that are used for comments and brackets. - * `src/extension/main.ts` - the main code of the extension, which is responsible for launching a language server and client. - * `src/language/java-script-propositional-laboratory-format.langium` - the grammar definition of your language. - * `src/language/main.ts` - the entry point of the language server process. - * `src/language/java-script-propositional-laboratory-format-module.ts` - the dependency injection module of your language implementation. Use this to register overridden and added services. - * `src/language/java-script-propositional-laboratory-format-validator.ts` - an example validator. You should change it to reflect the semantics of your language. - * `src/cli/main.ts` - the entry point of the command line interface (CLI) of your language. - * `src/cli/generator.ts` - the code generator used by the CLI to write output files from DSL documents. - * `src/cli/cli-util.ts` - utility code for the CLI. - -## Get up and running straight away - - * Run `npm run langium:generate` to generate TypeScript code from the grammar definition. - * Run `npm run build` to compile all TypeScript code. - * Press `F5` to open a new window with your extension loaded. - * Create a new file with a file name suffix matching your language. - * Verify that syntax highlighting, validation, completion etc. are working as expected. - * Run `node ./bin/cli` to see options for the CLI; `node ./bin/cli generate ` generates code for a given DSL file. - -## Make changes - - * Run `npm run watch` to have the TypeScript compiler run automatically after every change of the source files. - * Run `npm run langium:watch` to have the Langium generator run automatically after every change of the grammar declaration. - * You can relaunch the extension from the debug toolbar after making changes to the files listed above. - * You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - -## Install your extension - -* To start using your extension with VS Code, copy it into the `/.vscode/extensions` folder and restart Code. -* To share your extension with the world, read the [VS Code documentation](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) about publishing an extension. - -## To Go Further - -Documentation about the Langium framework is available at https://langium.org diff --git a/language-configuration.json b/language-configuration.json deleted file mode 100644 index 6b619d0c..00000000 --- a/language-configuration.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "comments": { - // symbol used for single line comment. Remove this entry if your language does not support line comments - "lineComment": "//", - // symbols used for start and end a block comment. Remove this entry if your language does not support block comments - "blockComment": [ "/*", "*/" ] - }, - // symbols used as brackets - "brackets": [ - ["{", "}"], - ["[", "]"], - ["(", ")"] - ], - // symbols that are auto closed when typing - "autoClosingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""], - ["'", "'"] - ], - // symbols that can be used to surround a selection - "surroundingPairs": [ - ["{", "}"], - ["[", "]"], - ["(", ")"], - ["\"", "\""], - ["'", "'"] - ] -} diff --git a/lib/language/jspl-format-module.ts b/lib/language/jspl-format-module.ts new file mode 100644 index 00000000..85077066 --- /dev/null +++ b/lib/language/jspl-format-module.ts @@ -0,0 +1,81 @@ +import { + createDefaultModule, + createDefaultSharedModule, + type DefaultSharedModuleContext, + inject, + type LangiumServices, + type LangiumSharedServices, + type Module, + type PartialLangiumServices, +} from "langium"; + +import { JSPLFormatGeneratedModule, JSPLGeneratedSharedModule } from "./generated/module"; +import { JSPLFormatValidator, registerValidationChecks } from "./jspl-validator"; + +/** + * Declaration of custom services - add your own service classes here. + */ +export type JSPLFormatAddedServices = { + validation: { + JSPLFormatValidator: JSPLFormatValidator; + }; +}; + +/** + * Union of Langium default services and your custom services - use this as constructor parameter + * of custom service classes. + */ +export type JSPLFormatServices = + & LangiumServices + & JSPLFormatAddedServices; + +/** + * Dependency injection module that overrides Langium default services and contributes the + * declared custom services. The Langium defaults can be partially specified to override only + * selected services, while the custom services must be fully specified. + */ +export const JSPLFormatModule: Module< + JSPLFormatServices, + PartialLangiumServices & JSPLFormatAddedServices +> = { + validation: { + JSPLFormatValidator: () => new JSPLFormatValidator(), + }, +}; + +/** + * Create the full set of services required by Langium. + * + * First inject the shared services by merging two modules: + * - Langium default shared services + * - Services generated by langium-cli + * + * Then inject the language-specific services by merging three modules: + * - Langium default language-specific services + * - Services generated by langium-cli + * - Services specified in this file + * + * @param context Optional module context with the LSP connection + * @returns An object wrapping the shared services and the language-specific services + */ +export function createJSPLFormatServices(context: DefaultSharedModuleContext): { + shared: LangiumSharedServices; + JSPLFormat: JSPLFormatServices; +} +{ + const shared = inject( + createDefaultSharedModule(context), + JSPLGeneratedSharedModule, + ); + + const JSPLFormat = inject( + createDefaultModule({ shared }), + JSPLFormatGeneratedModule, + JSPLFormatModule, + ); + + shared.ServiceRegistry.register(JSPLFormat); + registerValidationChecks(JSPLFormat); + + return { shared, JSPLFormat }; +} diff --git a/lib/language/jspl-validator.ts b/lib/language/jspl-validator.ts new file mode 100644 index 00000000..0dab0075 --- /dev/null +++ b/lib/language/jspl-validator.ts @@ -0,0 +1,361 @@ +import type { ValidationAcceptor, ValidationChecks } from "langium"; +import type { JSPLFormatServices } from "./jspl-format-module"; + +import { + AndExpression, + Concern, + Condition, + Group, + type JSPLAstType, + LaboratoryInformation, + Model, + Negation, + OrExpression, + Proposition, + PropositionalExpression, + Referenceable, + Statement, +} from "./generated/ast"; + +const extractReferenceables = { + from: function(expression: PropositionalExpression) + { + const output = new Set(); + extractReferenceables.fromExpression(expression, output); + return output; + }, + fromExpression: function(expression: PropositionalExpression, output: Set) + { + if (expression === undefined) + { + return; + } + + switch (expression.$type) + { + case "OrExpression": + extractReferenceables.fromOrExpression(expression as OrExpression, output); + break; + case "AndExpression": + extractReferenceables.fromAndExpression(expression as AndExpression, output); + break; + case "Negation": + extractReferenceables.fromNegation(expression as Negation, output); + break; + case "Group": + extractReferenceables.fromGroup(expression as Group, output); + break; + case "Statement": + extractReferenceables.fromStatement(expression as Statement, output); + break; + } + }, + fromOrExpression: function(expression: OrExpression, output: Set) + { + extractReferenceables.fromExpression(expression.left, output); + extractReferenceables.fromExpression(expression.right, output); + }, + fromAndExpression: function(expression: AndExpression, output: Set) + { + extractReferenceables.fromExpression(expression.left, output); + extractReferenceables.fromExpression(expression.right, output); + }, + fromNegation: function(expression: Negation, output: Set) + { + extractReferenceables.fromExpression(expression.inner, output); + }, + fromGroup: function(expression: Group, output: Set) + { + extractReferenceables.fromExpression(expression.inner, output); + }, + fromStatement: function(statement: Statement, output: Set) + { + const { ref } = statement.reference; + + if (ref === undefined) + { + return; + } + + output.add(ref); + }, +}; + +export function getAllUsedConcerns(model: Model) +{ + const result = new Set(); + + for (const proposition of model.propositions) + { + for (const clause of proposition.valueClauses) + { + // TODO: Can concern be undefined? + clause.raises.map(x => x.concern?.ref) + .filter(x => x !== undefined) + .forEach(result.add); + } + } + + return result; +} + +export function getAllUsedReferenceables(model: Model) +{ + const result = new Set(); + + for (const prop of model.propositions) + { + for (const clause of prop.valueClauses) + { + for (const concern of clause.raises) + { + if (!concern.condition) + { + continue; + } + + extractReferenceables.from(concern.condition.expression).forEach(result.add); + } + } + + if (!prop.disable) + { + continue; + } + + for (const stmt of prop.disable.statements) + { + extractReferenceables.from(stmt.condition.expression).forEach(result.add); + } + } + + return result; +} + +/** + * Register custom validation checks. + */ +export function registerValidationChecks({ validation }: JSPLFormatServices) +{ + const { ValidationRegistry: registry, JSPLFormatValidator: validator } = validation; + + const checks: ValidationChecks = { + Model: [ + validator.uniqueConcernIdentifiers, + validator.uniqueReferenceableIdentifiers, + validator.checkForUnusedConcerns, + validator.checkForUnusedConditions, + ], + Proposition: [ + validator.propositionHasExactlyOneDefaultOrJustOneValue, + ], + Condition: [ + validator.noRecursionInConditions, + ], + LaboratoryInformation: [ + validator.noDuplicateFieldsInLaboratoryInformation, + ], + Statement: [ + validator.statementReferencesValidValue, + ], + }; + + registry.register(checks, validator); +} + +export class JSPLFormatValidator +{ + uniqueConcernIdentifiers(model: Model, accept: ValidationAcceptor) + { + const reported = new Set(); + + for (const concern of model.concerns) + { + if (!reported.has(concern.name)) + { + reported.add(concern.name); + continue; + } + + accept("error", `Concern has non-unique name '${concern.name}'.`, { node: concern, property: "name" }); + } + } + + uniqueReferenceableIdentifiers(model: Model, accept: ValidationAcceptor) + { + const reported = new Map(); + + // TODO: Remove Code-Duplication here + + for (const cond of model.conditions) + { + if (!reported.has(cond.name)) + { + reported.set(cond.name, cond); + continue; + } + + const nodes = [cond, reported.get(cond.name)!]; + + nodes.forEach(node => + accept( + "error", + `Condition has non-unique name '${node.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, + { node, property: "name" }, + ) + ); + } + + for (const prop of model.propositions) + { + if (!reported.has(prop.name)) + { + reported.set(prop.name, prop); + continue; + } + + const nodes = [prop, reported.get(prop.name)!]; + + nodes.forEach(node => + accept( + "error", + `Proposition has non-unique name '${node.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, + { node, property: "name" }, + ) + ); + } + } + + checkForUnusedConcerns(model: Model, accept: ValidationAcceptor) + { + const used = getAllUsedConcerns(model); + const unused = model.concerns.filter(con => !used.has(con)); + + for (const node of unused) + { + accept("warning", "Concern is defined, but never used.", { node, property: "name" }); + } + } + + checkForUnusedConditions(model: Model, accept: ValidationAcceptor) + { + const used = getAllUsedReferenceables(model); + const unused = model.conditions.filter(cond => !used.has(cond)); + + for (const node of unused) + { + accept("warning", "Condition is defined, but never used.", { node, property: "name" }); + } + } + + propositionHasExactlyOneDefaultOrJustOneValue(proposition: Proposition, accept: ValidationAcceptor) + { + const { name, valueClauses } = proposition; + + // Singleton is default implicitly + if (valueClauses.length == 1 && !valueClauses[0].default) + { + return accept( + "info", + `${valueClauses[0].value} of proposition ${name} is assumed to be default`, + { node: valueClauses[0], property: "default" }, + ); + } + + const defaults = valueClauses.filter(clause => clause.default); + + if (defaults.length > 1) + { + return accept("error", `Proposition has multiple default values.`, { + node: defaults[1], + property: "default", + }); + } + + if (defaults.length !== 1) + { + return; + } + + accept("error", `Proposition has no default value.`, { node: proposition, property: "name" }); + } + + noRecursionInConditions(node: Condition, accept: ValidationAcceptor) + { + const { name, condition } = node; + + const extracted = extractReferenceables.from(condition.expression); + const hasRecursion = [...extracted].some(ref => ref.name === name); + + if (!hasRecursion) + { + return; + } + + accept("error", `Recursion is not allowed here.`, { node, property: "name" }); + } + + // TODO: What's the use case of this? Why not make it impossible on grammar level? + noDuplicateFieldsInLaboratoryInformation(information: LaboratoryInformation, accept: ValidationAcceptor) + { + if (information.descriptions.length > 1) + { + accept("error", "Multiple descriptions for one laboratory are not allowed.", { node: information }); + } + if (information.titles.length > 1) + { + accept("error", "Multiple titles for one laboratory are not allowed.", { node: information }); + } + if (information.icons.length > 1) + { + accept("error", "Multiple icons for one laboratory are not allowed.", { node: information }); + } + if (information.formats.length > 1) + { + accept("error", "Multiple default formats for one laboratory are not allowed.", { node: information }); + } + if (information.authors.length > 1) + { + accept("error", "Multiple authors for one laboratory are not allowed.", { node: information }); + } + if (information.versions.length > 1) + { + accept("error", "Multiple versions for one laboratory are not allowed.", { node: information }); + } + } + + // TODO: Cleanup + statementReferencesValidValue(statement: Statement, accept: ValidationAcceptor): void + { + if (statement === undefined) return; + if (statement.value === undefined) return; + if (statement.reference === undefined) return; + if (statement.reference.ref === undefined) return; + + // Extract referenced referenceable + const referenceable = statement.reference.ref; + const value = statement.value; + + if (referenceable.$type === "Condition") + { + if (typeof value === "boolean") return; + accept("error", "Stated value is not a valid value of the referenced object.", { + node: statement, + property: "value", + }); + return; + } + + const proposition = referenceable as Proposition; + + if (!proposition.valueClauses || !proposition.valueClauses.some(x => x.value === value)) + { + return; + } + + accept("error", "Stated value is not a valid value of the referenced object.", { + node: statement, + property: "value", + }); + } +} diff --git a/src/language/java-script-propositional-laboratory-format.langium b/lib/language/jspl.langium similarity index 98% rename from src/language/java-script-propositional-laboratory-format.langium rename to lib/language/jspl.langium index 4b8967fe..0a1c7b3a 100644 --- a/src/language/java-script-propositional-laboratory-format.langium +++ b/lib/language/jspl.langium @@ -1,4 +1,4 @@ -grammar JavaScriptPropositionalLaboratoryFormat +grammar JSPLFormat entry Model: ( // Optional Header @@ -104,4 +104,4 @@ Proposition: (valueClauses+=ValueClause)+ (disable=DisableClause)? "}" -; \ No newline at end of file +; diff --git a/lib/model.ts b/lib/model.ts index 120a7ae4..1e72c4fb 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -1,8 +1,8 @@ import { Diagnostic } from "vscode-languageserver"; import { AstNode, EmptyFileSystem, LangiumDocument, LangiumServices, URI } from "langium"; -import type { Model } from "../src/language/generated/ast"; -import { createJavaScriptPropositionalLaboratoryFormatServices as createJSPLFormatServices } from "../src/language/java-script-propositional-laboratory-format-module"; +import { type Model } from "./language/generated/ast"; +import { createJSPLFormatServices } from "./language/jspl-format-module"; import { err, ok, Result } from "neverthrow"; @@ -32,6 +32,6 @@ export async function extractAstNode(fileName: string, servic export function extractModel(input: string): Promise> { - const services = createJSPLFormatServices(EmptyFileSystem).JavaScriptPropositionalLaboratoryFormat; + const services = createJSPLFormatServices(EmptyFileSystem).JSPLFormat; return extractAstNode(input, services); } diff --git a/src/cli/main.ts b/src/cli/main.ts deleted file mode 100644 index 832f6ed0..00000000 --- a/src/cli/main.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Command } from 'commander'; -import { fileURLToPath } from 'node:url'; -import { readFile } from 'node:fs/promises'; -import { resolve as pathResolve } from 'node:path'; -import { getInputExtensionsAsString } from '../util/cli-util.js'; -import { generateLaboratoryAction, generateGraphvizAction } from '../generators/actions.js'; -import chalk from 'chalk'; - -const __dirname = fileURLToPath(new URL('.', import.meta.url)); - -const packagePath = pathResolve(__dirname, '..', '..', 'package.json'); -const packageContent = await readFile(packagePath, 'utf-8'); - -async function generateLaboratoryCLI(...args: any[]) { - const inputFilePath: string = args[0]; - const outputDirectoryPath: string = args[1]; - const generatedLabPath = await generateLaboratoryAction(inputFilePath, outputDirectoryPath); - console.log(chalk.green(`JavaScript code generated successfully: ${generatedLabPath}`)); -} - -async function generateGraphvizCLI(...args: any[]) { - const inputFilePath: string = args[0]; - const outputFilePath: string = args[1]; - const generatedFilePath = await generateGraphvizAction(inputFilePath, outputFilePath); - console.log(chalk.green(`Graphviz Visualization generated successfully: ${generatedFilePath}`)); -} - -export default function(): void { - const program = new Command(); - - program.version(JSON.parse(packageContent).version); - - const fileExtensions = getInputExtensionsAsString(); - - program - .command('generate') - .argument('', `source file (possible file extensions: ${fileExtensions})`) - .argument('', `destination directory`) - .description('generates the laboratory backend from the source code') - .action(generateLaboratoryCLI); - - program - .command('graphviz') - .argument('', `source file (possible file extensions: ${fileExtensions})`) - .argument('', `destination file (possible file extensions: .dot)`) - .description('generates a ".dot" file, that can be used to display a graph of the laboratory structure.') - .action(generateGraphvizCLI); - - program.parse(process.argv); -} \ No newline at end of file diff --git a/src/extension/main.ts b/src/extension/main.ts deleted file mode 100644 index 1aabe9c2..00000000 --- a/src/extension/main.ts +++ /dev/null @@ -1,209 +0,0 @@ -import type { LanguageClientOptions, ServerOptions} from 'vscode-languageclient/node.js'; -import { ExtensionContext, commands, window, workspace, Uri } from 'vscode'; -import { join as pathJoin, dirname as pathDirname } from 'node:path'; -import { LanguageClient, TransportKind } from 'vscode-languageclient/node.js'; -import { generateGraphvizAction, generateJSONAction, generateLaboratoryAction, generateOptimizerAction } from '../generators/actions.js'; - -let client: LanguageClient; - -const GENERATE_WEB_PAGE_COMMAND_IDENTIFIER: string = "jspl.generate-webpage"; -const GENERATE_GRAPHVIZ_COMMAND_IDENTIFIER: string = "jspl.generate-graphviz"; -const GENERATE_JSON_COMMAND_IDENTIFIER: string = "jspl.generate-json"; -const GENERATE_OPTIMIZER_COMMAND_IDENTIFIER: string = "jspl.generate-optimizer" - -// This function is called when the extension is activated. -export function activate(context: ExtensionContext): void { - client = startLanguageClient(context); - - commands.registerCommand( - GENERATE_WEB_PAGE_COMMAND_IDENTIFIER, - () => {generateWebpageCommand(context);} - ); - - commands.registerCommand( - GENERATE_GRAPHVIZ_COMMAND_IDENTIFIER, - () => {generateGraphvizCommand(context);} - ); - - commands.registerCommand( - GENERATE_JSON_COMMAND_IDENTIFIER, - () => {generateJSONCommand(context);} - ); - - commands.registerCommand( - GENERATE_OPTIMIZER_COMMAND_IDENTIFIER, - () => {generateOptimizerCommand(context);} - ); -} - -// This function is called when the extension is deactivated. -export function deactivate(): Thenable | undefined { - if (client) { - return client.stop(); - } - return undefined; -} - -async function generateWebpageCommand(context: ExtensionContext) { - const currentFilePath: string = window.activeTextEditor?.document.uri.fsPath!; - const defaultOutputDirectory: string = pathDirname(currentFilePath); - const laboratoryTemplatePath = context.asAbsolutePath(pathJoin("templates", "laboratory-template")); - - // Let user pick directory - const selectedUris = await window.showOpenDialog({ - canSelectMany: false, - title: 'Select Output Directory', - openLabel: 'Select', - canSelectFiles: false, - canSelectFolders: true, - defaultUri: Uri.file(defaultOutputDirectory) - }); - if (selectedUris === undefined) { - window.showErrorMessage("No Directory selected."); - return; - } - const outputDirectoryPath: string = selectedUris[0].fsPath; - - generateLaboratoryAction( - currentFilePath, - outputDirectoryPath, - laboratoryTemplatePath - ).then((value: string) => { - // message user that the lab was created successfully - window.showInformationMessage("Successfully created Laboratory at: " + value); - }).catch((reason: any) => { - // message user about error - window.showErrorMessage("Couldn't create laboratory. " + reason); - }); -} - -async function generateGraphvizCommand(context: ExtensionContext) { - const currentFilePath: string = window.activeTextEditor?.document.uri.fsPath!; - const defaultOutputFile: string = pathDirname(currentFilePath) + "/graphviz.dot"; - - // Let user pick output file - const selectedUri = await window.showSaveDialog({ - title: 'Save DOT Output', - saveLabel: 'Save', - filters: {"DOT": ["dot"]}, - defaultUri: Uri.file(defaultOutputFile) - }); - if (selectedUri === undefined) { - window.showErrorMessage("No output file selected."); - return; - } - const outputFilePath = selectedUri.fsPath; - - generateGraphvizAction( - currentFilePath, - outputFilePath - ).then((value: string) => { - window.showInformationMessage("Successfully created Graphviz file at: " + value); - }).catch((reason: any) => { - // message user about error - window.showErrorMessage("Couldn't create Graphviz file. " + reason); - }) -} - -async function generateJSONCommand(context: ExtensionContext) { - const currentFilePath: string = window.activeTextEditor?.document.uri.fsPath!; - const defaultOutputFile: string = pathDirname(currentFilePath) + "/laboratory.json"; - - // Let user pick output file - const selectedUri = await window.showSaveDialog({ - title: 'Select JSON Output', - saveLabel: 'Save', - filters: {"JSON": ["json"]}, - defaultUri: Uri.file(defaultOutputFile) - }); - if (selectedUri === undefined) { - window.showErrorMessage("No output file selected."); - return; - } - const outputFilePath = selectedUri.fsPath; - - generateJSONAction( - currentFilePath, - outputFilePath - ).then((value: string) => { - window.showInformationMessage("Successfully created JSON file at: " + value); - }).catch((reason: any) => { - // message user about error - window.showErrorMessage("Couldn't create JSON file. " + reason); - }) -} - -async function generateOptimizerCommand(context: ExtensionContext) { - const currentFilePath: string = window.activeTextEditor?.document.uri.fsPath!; - const defaultOutputDirectory: string = pathDirname(currentFilePath); - const laboratoryTemplatePath = context.asAbsolutePath(pathJoin("templates", "optimizer-template")); - - // Let user pick directory - const selectedUris = await window.showOpenDialog({ - canSelectMany: false, - title: 'Select Output Directory', - openLabel: 'Select', - canSelectFiles: false, - canSelectFolders: true, - defaultUri: Uri.file(defaultOutputDirectory) - }); - if (selectedUris === undefined) { - window.showErrorMessage("No Directory selected."); - return; - } - const outputDirectoryPath: string = selectedUris[0].fsPath; - - generateOptimizerAction( - currentFilePath, - outputDirectoryPath, - laboratoryTemplatePath - ).then((value: string) => { - // message user that the lab was created successfully - window.showInformationMessage("Successfully created Laboratory at: " + value); - }).catch((reason: any) => { - // message user about error - window.showErrorMessage("Couldn't create laboratory. " + reason); - }); -} - -function startLanguageClient(context: ExtensionContext): LanguageClient { - const serverModule = context.asAbsolutePath(pathJoin('out', 'language', 'main.cjs')); - // The debug options for the server - // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging. - // By setting `process.env.DEBUG_BREAK` to a truthy value, the language server will wait until a debugger is attached. - const debugOptions = { execArgv: ['--nolazy', `--inspect${process.env.DEBUG_BREAK ? '-brk' : ''}=${process.env.DEBUG_SOCKET || '6009'}`] }; - - // If the extension is launched in debug mode then the debug server options are used - // Otherwise the run options are used - const serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc }, - debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } - }; - - const fileSystemWatcher = workspace.createFileSystemWatcher('**/*.jspl'); - context.subscriptions.push(fileSystemWatcher); - - // Options to control the language client - const clientOptions: LanguageClientOptions = { - documentSelector: [{ scheme: 'file', language: 'java-script-propositional-laboratory-format' }], - synchronize: { - // Notify the server about file changes to files contained in the workspace - fileEvents: fileSystemWatcher - } - }; - - // Create the language client and start the client. - const client = new LanguageClient( - 'java-script-propositional-laboratory-format', - 'JavaScript Propositional Laboratory Format', - serverOptions, - clientOptions - ); - - // Start the client. This will also launch the server - client.start(); - return client; -} - - - diff --git a/src/generators/actions.ts b/src/generators/actions.ts deleted file mode 100644 index 295ad995..00000000 --- a/src/generators/actions.ts +++ /dev/null @@ -1,105 +0,0 @@ -import type { Model } from '../language/generated/ast.js'; -import { createJavaScriptPropositionalLaboratoryFormatServices } from '../language/java-script-propositional-laboratory-format-module.js'; -import { extractAstNode, getInputExtensionsAsSet, getInputExtensionsAsString } from '../util/cli-util.js'; -import { generateLaboratory } from './lab/main.js'; -import { generateGraphviz } from './graphviz/main.js'; -import { generateOptimizer } from './optimizer/main.js'; -import { NodeFileSystem } from 'langium/node'; -import { statSync, existsSync, mkdirSync } from 'node:fs'; -import { FileSystemError } from 'vscode'; -import { extname as pathExtname } from 'node:path' -import { generateJSON } from './json/main.js'; -//import { workspace, Uri } from 'vscode'; // TODO: replace node:fs with workspace.fs - -const TEMPLATES_DIRECTORY: string = "./templates"; -const LABORATORY_TEMPLATE_DIRECTORY: string = TEMPLATES_DIRECTORY + "/laboratory-template"; - -function getModel(inputFile: string): Promise { - const services = createJavaScriptPropositionalLaboratoryFormatServices(NodeFileSystem).JavaScriptPropositionalLaboratoryFormat; - return extractAstNode(inputFile, services); -} - -function checkJSPLInput(inputFile: string): void { - const fileExtensions: Set = getInputExtensionsAsSet(); - const inputStats = statSync(inputFile); - - if (!inputStats.isFile()) - throw new FileSystemError(`The specified input file (${inputFile}) is not a file.`); - if (!fileExtensions.has(pathExtname(inputFile))) - throw new FileSystemError(`The specified input file (${inputFile}) does not have one of the allowed file extensions (${getInputExtensionsAsString()}).`); -} - -function checkLaboratoryOutputDirectory(outputDirectoryPath: string): void { - if (!existsSync(outputDirectoryPath)) - mkdirSync(outputDirectoryPath); - - const outputStats = statSync(outputDirectoryPath); - if (!outputStats.isDirectory()) - throw new FileSystemError(`The specified output directory (${outputDirectoryPath}) is not a directory.`); -} - -export const generateLaboratoryAction = async (inputFile: string, destination: string, templatePath: string = LABORATORY_TEMPLATE_DIRECTORY): Promise => { - // check input file - try { - checkJSPLInput(inputFile); - } catch (error) { - return Promise.reject(`Something went wrong while checking the input file. (Error: ${error})`) - } - - // check output directory - try { - checkLaboratoryOutputDirectory(destination); - } catch (error) { - return Promise.reject(`Something went wrong while checking the output directory. (Error: ${error})`); - } - - const model = await getModel(inputFile); - const generatedLabPath = generateLaboratory(model, destination, templatePath); - return Promise.resolve(generatedLabPath); -}; - -export const generateGraphvizAction = async (inputFile: string, destination: string): Promise => { - // check input file - try { - checkJSPLInput(inputFile); - } catch (error) { - return Promise.reject(`Something went wrong while reading the input file. (Error: ${error})`) - } - - const model = await getModel(inputFile); - const generatedFilePath = generateGraphviz(model, destination); - return Promise.resolve(generatedFilePath); -}; - -export const generateJSONAction = async (inputFile: string, destination: string): Promise => { - // check input file - try { - checkJSPLInput(inputFile); - } catch (error) { - return Promise.reject(`Something went wrong while reading the input file. (Error: ${error})`) - } - - const model = await getModel(inputFile); - const generatedFilePath = generateJSON(model, destination); - return Promise.resolve(generatedFilePath); -} - -export const generateOptimizerAction = async (inputFile: string, destination: string, templatePath: string = LABORATORY_TEMPLATE_DIRECTORY): Promise => { - // check input file - try { - checkJSPLInput(inputFile); - } catch (error) { - return Promise.reject(`Something went wrong while checking the input file. (Error: ${error})`) - } - - // check output directory - try { - checkLaboratoryOutputDirectory(destination); - } catch (error) { - return Promise.reject(`Something went wrong while checking the output directory. (Error: ${error})`); - } - - const model = await getModel(inputFile); - const generatedLabPath = generateOptimizer(model, destination, templatePath); - return Promise.resolve(generatedLabPath); -}; \ No newline at end of file diff --git a/src/generators/graphviz/main.ts b/src/generators/graphviz/main.ts deleted file mode 100644 index 9f0fb84b..00000000 --- a/src/generators/graphviz/main.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { Condition, Model, Proposition, Referenceable, } from '../../language/generated/ast.js'; -import { writeFileSync, appendFileSync } from 'node:fs'; -import { CompositeGeneratorNode, toString } from 'langium'; -import { getReferencablesInWhenCondition } from '../../util/modelUtil.js'; - -const COLORS = { - red: "\"#9d0208\"", - yellow: "\"#9e7702\"", - green: "\"#509e02\"", - black: "\"#000000\"" -} - -const DOT_PREFIX: string = "digraph G {\n"; -const DOT_POSTFIX: string = "}\n"; - -const CONDITION_VERTEX_STYLE: string = `shape=diamond, color=${COLORS.green}`; -const CONDITION_DETERMINED_EDGE_STYLE: string = `labelfontcolor=${COLORS.green}, color=${COLORS.green}`; - -const PROPOSITIONS_VERTEX_STYLE: string = `shape=oval, color=${COLORS.black}`; -const PROPOSITIONS_DISABLE_EDGE_STYLE: string = `labelfontcolor=${COLORS.red}, color=${COLORS.red}`; -const PROPOSITIONS_RAISE_EDGE_STYLE: string = `labelfontcolor=${COLORS.yellow}, color=${COLORS.yellow}`; - -export function generateGraphviz(model: Model, destination: string): string { - const generatedFilePath = destination; - - writeFileSync(generatedFilePath, DOT_PREFIX); - - // 2. Conditions - const conditionsNode = new CompositeGeneratorNode(); - generateConditions(model.conditions, conditionsNode); - appendFileSync(generatedFilePath, toString(conditionsNode)); - - // 3. Propositions - const propositionsNode = new CompositeGeneratorNode(); - generatePropositions(model.propositions, propositionsNode); - appendFileSync(generatedFilePath, toString(propositionsNode)); - - appendFileSync(generatedFilePath, DOT_POSTFIX); - - return generatedFilePath; -} - -function generateConditions(conditions: Condition[], fileNode: CompositeGeneratorNode): void { - fileNode.append(`\t// Conditions:\n`); - conditions.forEach(condition => { - // add vertex - fileNode.append(`\t${condition.name} [${CONDITION_VERTEX_STYLE}];\n`); - - // add incoming edges - getReferencablesInWhenCondition(condition.condition).forEach(referenceable => { - fileNode.append(`\t\t${referenceable.name} -> ${condition.name} [${CONDITION_DETERMINED_EDGE_STYLE}];\n`); - }); - }); -} - -function generatePropositions(propositions: Proposition[], fileNode: CompositeGeneratorNode): void { - fileNode.append(`\t// Propositions:\n`); - propositions.forEach(proposition => { - // add vertex - fileNode.append(`\t${proposition.name} [${PROPOSITIONS_VERTEX_STYLE}];\n`); - - // add edges for raising concerns - getReferenceablesCausingRaises(proposition).forEach(referenceable => { - fileNode.append(`\t\t${referenceable.name} -> ${proposition.name} [${PROPOSITIONS_RAISE_EDGE_STYLE}];\n`); - }); - - // add edges for disabling - getReferenceablesCausingDisable(proposition).forEach(referenceable => { - fileNode.append(`\t\t${referenceable.name} -> ${proposition.name} [${PROPOSITIONS_DISABLE_EDGE_STYLE}];\n`); - }); - }); -} - -function getReferenceablesCausingRaises(proposition: Proposition): Set { - let result = new Set(); - - proposition.valueClauses.forEach(clause => { - clause.raises.forEach(raise => { - if (raise.condition === undefined) return; - getReferencablesInWhenCondition(raise.condition).forEach(ref => { - result.add(ref) - }); - }); - }); - - return result; -} - -function getReferenceablesCausingDisable(proposition: Proposition): Set { - let result = new Set(); - if (proposition.disable === undefined) return result; - - proposition.disable.statements.forEach(statement => { - getReferencablesInWhenCondition(statement.condition).forEach(ref => { - result.add(ref); - }); - }); - - return result; -} diff --git a/src/generators/json/main.ts b/src/generators/json/main.ts deleted file mode 100644 index 0a377660..00000000 --- a/src/generators/json/main.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { CompositeGeneratorNode, toString } from "langium"; -import { Concern, Condition, FormattedString, LaboratoryInformation, Model, Proposition, WhenCondition } from "../../language/generated/ast.js"; -import { writeFileSync, appendFileSync } from "node:fs"; -import { extractLaboratoryInformation, extractValueAsString, getStringFromWhenCondition } from "../../util/modelUtil.js"; - -export function generateJSON(model: Model, destination: string): string { - writeFileSync(destination, "{\n"); - - // 1. Laboratory Information - const informationNode = new CompositeGeneratorNode(); - generateLaboratoryInformation(model.laboratory, informationNode); - appendFileSync(destination, toString(informationNode)); - - // 2. Concerns - const concernsNode = new CompositeGeneratorNode(); - generateConcerns(model.concerns, concernsNode); - appendFileSync(destination, toString(concernsNode)); - - // 3. Conditions - const conditionsNode = new CompositeGeneratorNode(); - generateConditions(model.conditions, conditionsNode); - appendFileSync(destination, toString(conditionsNode)); - - // 4. Propositions - const propositionsNode = new CompositeGeneratorNode(); - generatePropositions(model.propositions, propositionsNode); - appendFileSync(destination, toString(propositionsNode)); - - appendFileSync(destination, "}"); - - return destination; -} - -function generateLaboratoryInformation(laboratory: LaboratoryInformation | undefined, fileNode: CompositeGeneratorNode): void { - const extracted = extractLaboratoryInformation(laboratory); - - fileNode.append(`\t"laboratory": {\n`); - - const title = extracted.title === undefined ? "null" : `"${escapeString(extracted.title)}"`; - const author = extracted.author === undefined ? "null" : `"${escapeString(extracted.author)}"`; - const version = extracted.version === undefined ? "null" : `"${escapeString(extracted.version)}"`; - const icon = extracted.icon === undefined ? "null" : `"${escapeString(extracted.icon)}"`; - const format = extracted.format === undefined ? "null" : `"${escapeString(extracted.format)}"`; - const description = extracted.description === undefined ? "null" : generateFormattedString(extracted.description); - - fileNode.append(`\t\t\"title\": ${title},\n`); - fileNode.append(`\t\t\"author\": ${author},\n`); - fileNode.append(`\t\t\"version\": ${version},\n`); - fileNode.append(`\t\t\"icon\": ${icon},\n`); - fileNode.append(`\t\t\"format\": ${format},\n`); - fileNode.append(`\t\t\"description\": ${description}\n`); - - fileNode.append(`\t},\n`); -} - -function generateConcerns(concerns: Concern[], fileNode: CompositeGeneratorNode): void { - if (concerns.length === 0) { - fileNode.append(`\t"concerns": [],\n`); - return; - } - - fileNode.append(`\t"concerns": [\n`); - let isFirst: boolean = true; - concerns.forEach(concern => { - // make sure all elements except the last have a trailing comma - if (isFirst) isFirst = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t{\n`); - - fileNode.append(`\t\t\t"name": "${concern.name}",\n`); - fileNode.append(`\t\t\t"summary": "${concern.summary}",\n`); - fileNode.append(`\t\t\t"description": ${generateFormattedString(concern.description)}\n`); - - fileNode.append(`\t\t}`); - }); - fileNode.appendNewLine(); - - fileNode.append(`\t],\n`); -} - -function generateConditions(conditions: Condition[], fileNode: CompositeGeneratorNode): void { - if (conditions.length === 0) { - fileNode.append(`\t"conditions": [],\n`); - return; - } - - fileNode.append(`\t"conditions": [\n`); - let isFirst: boolean = true; - conditions.forEach(condition => { - // make sure all elements except the last have a trailing comma - if (isFirst) isFirst = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t{\n`); - - fileNode.append(`\t\t\t"name": "${condition.name}",\n`) - fileNode.append(`\t\t\t"condition": "${generateWhenCondition(condition.condition)}"\n`) - - fileNode.append(`\t\t}`); - }); - fileNode.appendNewLine(); - - fileNode.append(`\t],\n`); -} - -function generatePropositions(propositions: Proposition[], fileNode: CompositeGeneratorNode): void { - if (propositions.length === 0) { - fileNode.append(`\t"propositions": []\n`); - return; - } - - fileNode.append(`\t"propositions": [\n`); - let isFirst: boolean = true; - propositions.forEach(proposition => { - // make sure all elements except the last have a trailing comma - if (isFirst) isFirst = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t{\n`); - fileNode.append(`\t\t\t"name": "${proposition.name}",\n`); - fileNode.append(`\t\t\t"expression": "${proposition.expression}",\n`); - - generateValueClauses(proposition, fileNode); - - generateDisableStatements(proposition, fileNode); - - fileNode.append(`\t\t}`); - }); - fileNode.appendNewLine(); - - fileNode.append(`\t]\n`); -} - -function generateValueClauses(proposition: Proposition, fileNode: CompositeGeneratorNode): void { - if (proposition.valueClauses.length === 0) { - fileNode.append(`\t\t\t"values": [],\n`); - return; - } - - fileNode.append(`\t\t\t"values": [\n`); - let isFirstClause: boolean = true; - proposition.valueClauses.forEach(clause => { - if (isFirstClause) isFirstClause = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t\t\t{\n`) - - fileNode.append(`\t\t\t\t\t"value": ${extractValueAsString(clause.value)},\n`); - fileNode.append(`\t\t\t\t\t"default": ${extractValueAsString(clause.default)},\n`); - if (clause.raises.length === 0) { - fileNode.append(`\t\t\t\t\t"raises": []\n`); - fileNode.append(`\t\t\t\t}`); - return; - } - - fileNode.append(`\t\t\t\t\t"raises": [\n`); - let isFirstRaise: boolean = true; - clause.raises.forEach(raise => { - if (isFirstRaise) isFirstRaise = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t\t\t\t\t{\n`); - - fileNode.append(`\t\t\t\t\t\t\t"concern": "${raise.concern.ref?.name}",\n`); - fileNode.append(`\t\t\t\t\t\t\t"condition": ${raise.condition === undefined ? "null" : `"${generateWhenCondition(raise.condition)}"`}\n`); - - fileNode.append(`\t\t\t\t\t\t}`); - }); - fileNode.append(`\n\t\t\t\t\t]\n`) - fileNode.append(`\t\t\t\t}`); - }); - fileNode.append(`\n\t\t\t],\n`); -} - -function generateDisableStatements(proposition: Proposition, fileNode: CompositeGeneratorNode): void { - if (proposition.disable === undefined) { - fileNode.append(`\t\t\t"disabled": []\n`); - return; - } - - fileNode.append(`\t\t\t"disabled": [\n`); - let isFirst: boolean = true; - proposition.disable.statements.forEach(statement => { - if (isFirst) isFirst = false; - else fileNode.append(`,\n`); - - fileNode.append(`\t\t\t\t{\n`); - - fileNode.append(`\t\t\t\t\t"message": "${escapeString(statement.message)}",\n`) - fileNode.append(`\t\t\t\t\t"condition": "${generateWhenCondition(statement.condition)}"\n`) - - fileNode.append(`\t\t\t\t}`); - }); - fileNode.append(`\n\t\t\t]\n`); -} - -function generateFormattedString(formatted: FormattedString): string { - const format = formatted.format === undefined ? "null" : `"${formatted.format}"`; - return `{"format": ${format}, "contents": "${escapeString(formatted.contents)}"}`; -} - -function generateWhenCondition(condition: WhenCondition): string { - return escapeString(getStringFromWhenCondition(condition)); -} - -function escapeString(input: string): string { - return input - .replaceAll('"', '\\"') - //.replaceAll('\'', '\\\'') - .replaceAll('\n', '\\n') - .replaceAll('\t', '\\t'); -} \ No newline at end of file diff --git a/src/generators/lab/concerns.ts b/src/generators/lab/concerns.ts deleted file mode 100644 index 5ad6afd2..00000000 --- a/src/generators/lab/concerns.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { Concern } from "../../language/generated/ast.js"; -import { formattedStringToHTML } from "../../util/modelUtil.js"; -import { ExtractedWebLaboratoryInformation } from "./util.js"; - - -function generateConcernHtml(concern: Concern, default_format: string): string { - return `
⚠ ${concern.summary} - ${formattedStringToHTML(concern.description, default_format)} -
`; -} - -export function generateConcerns(concerns: Concern[], node: CompositeGeneratorNode, laboratoryInformation: ExtractedWebLaboratoryInformation) { - // Create JS-Object with concerns as members and string/html values (see original lab) - node.append(`const concerns = {\n`); - - concerns.forEach(concern => { - node.append(`\t${concern.name}: html\`${generateConcernHtml(concern, laboratoryInformation.format)}\`,\n`); - }); - - node.append(`};\n`); -} \ No newline at end of file diff --git a/src/generators/lab/conditions.ts b/src/generators/lab/conditions.ts deleted file mode 100644 index 8afc29db..00000000 --- a/src/generators/lab/conditions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { Condition } from "../../language/generated/ast.js"; -import { extractJSCondition } from "./util.js"; - -export function generateConditions(conditions: Condition[], node: CompositeGeneratorNode) { - node.append(`const conditions = {\n`); - - conditions.forEach(condition => { - node.append(`\t${condition.name}: (get) => {\n`); - node.append(`\t\treturn ${extractJSCondition.fromExpression(condition.condition.expression)};\n`); - node.append(`\t},\n`); - }); - - node.append(`};\n`); -} diff --git a/src/generators/lab/main.ts b/src/generators/lab/main.ts deleted file mode 100644 index e1c42932..00000000 --- a/src/generators/lab/main.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { existsSync, mkdirSync, copyFileSync, writeFileSync, appendFileSync } from 'node:fs'; -//import { workspace, Uri } from 'vscode'; // TODO: replace node:fs with workspace.fs -import { CompositeGeneratorNode, toString } from 'langium'; -import path from 'node:path'; -import { Model } from '../../language/generated/ast.js'; -import { generateConcerns } from './concerns.js'; -import { generateConditions } from './conditions.js'; -import { generateGivens, generateTweakables } from './propositions.js'; -import { extractLaboratoryInformationForWebWithDefaults, ExtractedWebLaboratoryInformation, readTemplatedFile } from './util.js'; - -type TemplateMarker = { - START: string, - END: string -} - -const DATA_TEMPLATE_MARKER: TemplateMarker = { - START: "//???TEMPLATE-MARKER-START???", - END: "//???TEMPLATE-MARKER-END???" -}; - -const INDEX_TEMPLATE_MARKER: TemplateMarker = { - START: "", - END: "" -} - -const ROOT_FILES_TO_COPY: Array = [ - //"README.md", - //"LICENSE", - "lab.js" -]; -const RESOURCES_TO_COPY: Array = [ - "favicon.svg", - "github.png" -]; - -export function generateLaboratory(model: Model, outputDirectory: string, templateDirectory: string): string { - const outputResourcesPath = path.join(outputDirectory, "res"); - - // make sure Resources Folder exists - if (!existsSync(outputResourcesPath)) - mkdirSync(outputResourcesPath); - - // Copy static files to output (index.html, LICENSE, README.md, res/favicon.svg, res/github.png) - ROOT_FILES_TO_COPY.forEach(fileName => { - copyFileSync( - path.join(templateDirectory, fileName), - path.join(outputDirectory, fileName) - ); - }); - RESOURCES_TO_COPY.forEach(fileName => { - copyFileSync( - path.join(templateDirectory, fileName), - path.join(outputResourcesPath, fileName) - ); - }); - - // extract laboratory information from model - const laboratoryInformation = extractLaboratoryInformationForWebWithDefaults(model.laboratory); - - generateIndex( - model, - laboratoryInformation, - path.join(templateDirectory, "index.html"), - path.join(outputDirectory, "index.html") - ); - - generateDataJS( - model, - laboratoryInformation, - path.join(templateDirectory, "data.js"), - path.join(outputDirectory, "data.js") - ); - - return outputDirectory; -} - -function generateIndex(model: Model, laboratoryInformation: ExtractedWebLaboratoryInformation, indexTemplatePath: string, outputIndexPath: string): void { - const indexTemplate = readTemplatedFile(indexTemplatePath, INDEX_TEMPLATE_MARKER); - - // Clear index.html file - writeFileSync(outputIndexPath, ""); - - // 1. Write Prefix - appendFileSync(outputIndexPath, indexTemplate.prefix); - - // 2. Write Header Data - const iconString = (laboratoryInformation.icon == undefined) ? "undefined" : laboratoryInformation.icon; - const headerData: string = `${laboratoryInformation.title}\n\t`; - appendFileSync(outputIndexPath, headerData); - - // 3. Write Postfix - appendFileSync(outputIndexPath, indexTemplate.postfix); -} - -function generateDataJS(model: Model, laboratoryInformation: ExtractedWebLaboratoryInformation, labTemplatePath: string, outputJavaScript: string): void { - const labTemplate = readTemplatedFile(labTemplatePath, DATA_TEMPLATE_MARKER); - - // Clear lab.js file - writeFileSync(outputJavaScript, ""); - - // Create lab.js (by appending to file?) - // 1. Write Prefix - appendFileSync(outputJavaScript, labTemplate.prefix); - - // 2. Write Laboratory Information - const laboratoryInformationNode = new CompositeGeneratorNode(); - generateLaboratoryInformation(laboratoryInformation, laboratoryInformationNode) - appendFileSync(outputJavaScript, toString(laboratoryInformationNode)); - - // 3. Write Concerns - const concernsNode = new CompositeGeneratorNode(); - generateConcerns(model.concerns, concernsNode, laboratoryInformation); - appendFileSync(outputJavaScript, toString(concernsNode)) - - // 4. Write Conditions - const conditionsNode = new CompositeGeneratorNode(); - generateConditions(model.conditions, conditionsNode); - appendFileSync(outputJavaScript, toString(conditionsNode)); - - // 5. Write Givens - const givensNode = new CompositeGeneratorNode(); - generateGivens(model.propositions, givensNode); - appendFileSync(outputJavaScript, toString(givensNode)); - - // 6. Write Tweakables - const tweakablesNode = new CompositeGeneratorNode(); - generateTweakables(model.propositions, tweakablesNode); - appendFileSync(outputJavaScript, toString(tweakablesNode)); - - // 7. Write Postfix - appendFileSync(outputJavaScript, labTemplate.postfix); -} - -function generateLaboratoryInformation(laboratoryInformation: ExtractedWebLaboratoryInformation, node: CompositeGeneratorNode) { - node.append("export const metaData = {\n"); - - const titleString = (laboratoryInformation.title == undefined) ? "undefined" : `"${laboratoryInformation.title}"`; - node.append(`\ttitle: ${titleString},\n`); - - const descriptionString = (laboratoryInformation.description == undefined) ? "undefined" : `${laboratoryInformation.description}`; - node.append(`\tdescriptionHtml: html\`${descriptionString}\`,\n`); - - const authorString = (laboratoryInformation.author == undefined) ? "undefined" : `"${laboratoryInformation.author}"`; - node.append(`\tauthor: ${authorString},\n`); - - const versionString = (laboratoryInformation.version == undefined) ? "undefined" : `"${laboratoryInformation.version}"`; - node.append(`\tversion: ${versionString},\n`); - - node.append("};\n"); -} \ No newline at end of file diff --git a/src/generators/lab/propositions.ts b/src/generators/lab/propositions.ts deleted file mode 100644 index bc1a5cc0..00000000 --- a/src/generators/lab/propositions.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { integer } from "vscode-languageserver"; -import { Proposition } from "../../language/generated/ast.js"; -import { extractJSCondition } from "./util.js"; -import { extractValueAsString } from "../../util/modelUtil.js"; - -function isGiven(proposition: Proposition) { - return proposition.valueClauses.length == 1; -} - -export function generateGivens(propositions: Proposition[], node: CompositeGeneratorNode) { - node.append(`export const givens = [\n`); - - propositions.filter(isGiven).forEach(given => { - let value = given.valueClauses[0].value; - node.append(`\t{ input: \`${given.expression}\`, output: ${extractValueAsString(value)} },\n`); - }); - - node.append(`];\n`); -} - -function generateConcernFunction(proposition: Proposition, node: CompositeGeneratorNode, baseIndent: string) { - const indent = (level: integer) => baseIndent + "\t".repeat(level); - - node.append(`(self, get) => {\n`); - node.append(indent(1) + `let result = [];\n`) - proposition.valueClauses.forEach(clause => { - node.append(indent(1) + `if (self === ${extractValueAsString(clause.value)}) {\n`); - clause.raises.forEach(raise => { - if (raise.condition === undefined) { - node.append(indent(2) + `result.push(concerns.${raise.concern.ref?.name});\n`); - } else { - node.append(indent(2) + `if (${extractJSCondition.fromExpression(raise.condition.expression)}) {\n`); - node.append(indent(3) + `result.push(concerns.${raise.concern.ref?.name});\n`); - node.append(indent(2) + "}\n"); - } - }) - node.append(indent(1) + "}\n"); - }); - - node.append(indent(1) + `return result;\n`); - node.append(`${indent(0)}}`); -} - -function generateDisableFunction(proposition: Proposition, node: CompositeGeneratorNode, baseIndent: string) { - const indent = (level: integer) => baseIndent + "\t".repeat(level); - if(proposition.disable === undefined) { - node.append(indent(1) + "return false;\n"); - return; - } - - proposition.disable.statements.forEach(statement => { - node.append(indent(1) + `if (${extractJSCondition.fromExpression(statement.condition.expression)}) {\n`); - node.append(indent(2) + `return "${statement.message}"\n`); - node.append(indent(1) + `}\n`); - }); - node.append(indent(1) + "return false;\n"); -} - -export function generateTweakables(propositions: Proposition[], node: CompositeGeneratorNode) { - const tweakables = propositions.filter(proposition => !isGiven(proposition)); - - node.append(`export const tweakables = [\n`); - tweakables.forEach(tweakable => { - node.append(`\ttweakable({\n`); - { - let defaultValue = tweakable.valueClauses.filter(clause => {return clause.default;})[0].value; - let outputListAsString = tweakable.valueClauses.map(clause => extractValueAsString(clause.value)).join(", "); - - node.append(`\t\tname: \`${tweakable.name}\`,\n`); - node.append(`\t\tinput: \`${tweakable.expression}\`,\n`); - node.append(`\t\toutput: [${outputListAsString}],\n`); - node.append(`\t\tdefault: ${extractValueAsString(defaultValue)},\n`); - - node.append(`\t\tconcern: `); - generateConcernFunction(tweakable, node, "\t\t"); - node.append(`,\n`); - - node.append(`\t\tdisabled: (get) => {\n`); - generateDisableFunction(tweakable, node, "\t\t"); - node.append(`\t\t},\n`); - } - node.append(`\t}),\n`) - }); - node.append(`];\n`); -} \ No newline at end of file diff --git a/src/generators/lab/util.ts b/src/generators/lab/util.ts deleted file mode 100644 index f2f53b95..00000000 --- a/src/generators/lab/util.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { readFileSync } from 'node:fs'; -import { OrExpression, AndExpression, Negation, Group, Statement, PropositionalExpression, LaboratoryInformation } from "../../language/generated/ast.js"; -import { LogicalExpressionExtractor, extractLaboratoryInformation, extractValueAsString, formattedStringToHTML } from "../../util/modelUtil.js"; - -export const extractJSCondition: LogicalExpressionExtractor = { - fromOrExpression: function (expression: OrExpression): string { - return `${extractJSCondition.fromExpression(expression.left)} || ${extractJSCondition.fromExpression(expression.right)}`; - }, - fromAndExpression: function (expression: AndExpression): string { - return `${extractJSCondition.fromExpression(expression.left)} && ${extractJSCondition.fromExpression(expression.right)}`; - }, - fromNegation: function (expression: Negation): string { - return `! ${extractJSCondition.fromExpression(expression.inner)}`; - }, - fromGroup: function (expression: Group): string { - return `(${extractJSCondition.fromExpression(expression.inner)})`; - }, - fromStatement: function (expression: Statement): string { - const reference = expression.reference.ref; - if (reference == undefined) - return ""; // This should never occur.... - - const equalTo = `${expression.negation ? "!" : "="}== ${extractValueAsString(expression.value)}`; - - switch (reference.$type) { - case 'Condition': - return `conditions.${reference.name}(get) ${equalTo}`; - case 'Proposition': - return `get('${reference.name}') ${equalTo}`; - } - }, - fromExpression: function (expression: PropositionalExpression): string { - switch (expression.$type) { - case 'OrExpression': - return extractJSCondition.fromOrExpression(expression as OrExpression); - case 'AndExpression': - return extractJSCondition.fromAndExpression(expression as AndExpression); - case 'Negation': - return extractJSCondition.fromNegation(expression as Negation); - case 'Group': - return extractJSCondition.fromGroup(expression as Group); - case 'Statement': - return extractJSCondition.fromStatement(expression as Statement); - } - } -}; - -function splitByStartAndEndMarker(input: string, markers: {START: string, END: string}): {BEFORE: string, AFTER: string} { - const splitByStartMarker = input.split(markers.START); - - return { - BEFORE: splitByStartMarker[0], - AFTER: splitByStartMarker[1].split(markers.END)[1] - }; -}; - -export type TemplateMarker = {START: string, END: string} -export function readTemplatedFile(templateFilePath: string, templateMarker: TemplateMarker): {prefix: string, postfix: string} { - const template: string = readFileSync(templateFilePath, `utf-8`); - const splitByConcernsMarkers = splitByStartAndEndMarker(template, templateMarker); - - return { - prefix: splitByConcernsMarkers.BEFORE, - postfix: splitByConcernsMarkers.AFTER - }; -} - -export type ExtractedWebLaboratoryInformation = { - title: string, - description: string, - icon: string | undefined, - format: string, - author: string | undefined, - version: string | undefined -} -const DEFAULT_WEB_LABORATORY_INFORMATION: ExtractedWebLaboratoryInformation = { - title: "Laboratory Title", - description: "

Laboratory description

", - icon: undefined, - format: "MD", - author: undefined, - version: undefined -} -export function extractLaboratoryInformationForWebWithDefaults(information: LaboratoryInformation | undefined): ExtractedWebLaboratoryInformation { - const extracted = extractLaboratoryInformation(information); - let result = JSON.parse(JSON.stringify(DEFAULT_WEB_LABORATORY_INFORMATION)); - - if (extracted.title !== undefined) result.title = extracted.title; - if (extracted.icon !== undefined) result.icon = extracted.icon; - if (extracted.format !== undefined) result.format = extracted.format; - if (extracted.author !== undefined) result.author = extracted.author; - if (extracted.version !== undefined) result.version = extracted.version; - if (extracted.description !== undefined) result.description = formattedStringToHTML(extracted.description, result.format); - - return result; -} \ No newline at end of file diff --git a/src/generators/optimizer/concerns.ts b/src/generators/optimizer/concerns.ts deleted file mode 100644 index 4fa1fe07..00000000 --- a/src/generators/optimizer/concerns.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { Concern } from "../../language/generated/ast.js"; -import { formattedStringToHTML } from "../../util/modelUtil.js"; -import { ExtractedWebLaboratoryInformation } from "./util.js"; - - -function generateConcernHtml(concern: Concern, default_format: string): string { - return `
⚠ ${concern.summary} - ${formattedStringToHTML(concern.description, default_format)} -
`; -} - -export function generateConcerns(concerns: Concern[], node: CompositeGeneratorNode, laboratoryInformation: ExtractedWebLaboratoryInformation) { - // Create JS-Object with concerns as members and string/html values (see original lab) - node.append(`export const concerns = {\n`); - - concerns.forEach(concern => { - node.append(`\t${concern.name}: html\`${generateConcernHtml(concern, laboratoryInformation.format)}\`,\n`); - }); - - node.append(`};\n`); -} \ No newline at end of file diff --git a/src/generators/optimizer/conditions.ts b/src/generators/optimizer/conditions.ts deleted file mode 100644 index 8afc29db..00000000 --- a/src/generators/optimizer/conditions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { Condition } from "../../language/generated/ast.js"; -import { extractJSCondition } from "./util.js"; - -export function generateConditions(conditions: Condition[], node: CompositeGeneratorNode) { - node.append(`const conditions = {\n`); - - conditions.forEach(condition => { - node.append(`\t${condition.name}: (get) => {\n`); - node.append(`\t\treturn ${extractJSCondition.fromExpression(condition.condition.expression)};\n`); - node.append(`\t},\n`); - }); - - node.append(`};\n`); -} diff --git a/src/generators/optimizer/logic.ts b/src/generators/optimizer/logic.ts deleted file mode 100644 index e847d6ca..00000000 --- a/src/generators/optimizer/logic.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { AndExpression, Group, Negation, OrExpression, PropositionalExpression, Statement } from "../../language/generated/ast.js"; -import { LogicalExpressionExtractor } from "../../util/modelUtil.js"; - -export type LConjunction = { - type: "and", - left: LExpression, - right: LExpression, -}; - -export type LDisjunction = { - type: "or", - left: LExpression, - right: LExpression, -}; - -export type LNegation = { - type: "not", - inner: LExpression, -}; - -export type LStatement = { - type: "statement", - proposition: string, - value: boolean | string, -}; - -export type LExpression = LConjunction | LDisjunction | LNegation | LStatement; - -export function propositionalToLogical(expression: PropositionalExpression): LExpression { - return extractLogicalExpression.fromExpression(expression); -} - -const extractLogicalExpression: LogicalExpressionExtractor = { - fromAndExpression: function (expression: OrExpression): LConjunction { - return { - type: "and", - left: extractLogicalExpression.fromExpression(expression.left), - right: extractLogicalExpression.fromExpression(expression.right) - } - }, - fromOrExpression: function (expression: AndExpression): LDisjunction { - return { - type: "or", - left: extractLogicalExpression.fromExpression(expression.left), - right: extractLogicalExpression.fromExpression(expression.right) - } - }, - fromNegation: function (expression: Negation): LNegation { - return { - type: "not", - inner: extractLogicalExpression.fromExpression(expression.inner) - } - }, - fromGroup: function (expression: Group): LExpression { - return extractLogicalExpression.fromExpression(expression.inner); - }, - fromStatement: function (expression: Statement): LExpression { - let ref = expression.reference.ref; - // ref cant really be undefined here unless there is a syntactical mistake in the input, then crashing is okay... - if (ref?.$type === undefined) { - throw new Error("Can't resolve references correctly."); - } - - // extract base statement - let baseStatement: LExpression; - if (ref?.$type === "Proposition") { - baseStatement = { - type: "statement", - proposition: ref.name, - value: expression.value - } - } else { - baseStatement = extractLogicalExpression.fromExpression(ref.condition.expression); - } - - // negate if necessary - if (expression.negation) { - return { - type: "not", - inner: baseStatement - } - } - - return baseStatement; - }, - fromExpression: function (expression: PropositionalExpression): LExpression { - switch (expression.$type) { - case 'OrExpression': - return extractLogicalExpression.fromOrExpression(expression as OrExpression); - case 'AndExpression': - return extractLogicalExpression.fromAndExpression(expression as AndExpression); - case 'Negation': - return extractLogicalExpression.fromNegation(expression as Negation); - case 'Group': - return extractLogicalExpression.fromGroup(expression as Group); - case 'Statement': - return extractLogicalExpression.fromStatement(expression as Statement); - } - } -} \ No newline at end of file diff --git a/src/generators/optimizer/main.ts b/src/generators/optimizer/main.ts deleted file mode 100644 index 14f9a2ba..00000000 --- a/src/generators/optimizer/main.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { existsSync, mkdirSync, copyFileSync, writeFileSync, appendFileSync } from 'node:fs'; -//import { workspace, Uri } from 'vscode'; // TODO: replace node:fs with workspace.fs -import { CompositeGeneratorNode, toString } from 'langium'; -import path from 'node:path'; -import { Model } from '../../language/generated/ast.js'; -import { generateConcerns } from './concerns.js'; -import { generateConditions } from './conditions.js'; -import { generateGivens, generateTweakables } from './propositions.js'; -import { extractLaboratoryInformationForWebWithDefaults, ExtractedWebLaboratoryInformation, readTemplatedFile } from './util.js'; -import { generateRaiseConditions } from './raiseConditions.js'; - -type TemplateMarker = { - START: string, - END: string -} - -const DATA_TEMPLATE_MARKER: TemplateMarker = { - START: "//???TEMPLATE-MARKER-START???", - END: "//???TEMPLATE-MARKER-END???" -}; - -const INDEX_TEMPLATE_MARKER: TemplateMarker = { - START: "", - END: "" -} - -const ROOT_FILES_TO_COPY: Array = [ - //"README.md", - //"LICENSE", - "lab.js", - "optimization.js" -]; -const RESOURCES_TO_COPY: Array = [ - "favicon.svg", - "github.png", - "htm_preact_standalone.js" -]; - -export function generateOptimizer(model: Model, outputDirectory: string, templateDirectory: string): string { - const outputResourcesPath = path.join(outputDirectory, "res"); - - // make sure Resources Folder exists - if (!existsSync(outputResourcesPath)) - mkdirSync(outputResourcesPath); - - // Copy static files to output (index.html, LICENSE, README.md, res/favicon.svg, res/github.png) - ROOT_FILES_TO_COPY.forEach(fileName => { - copyFileSync( - path.join(templateDirectory, fileName), - path.join(outputDirectory, fileName) - ); - }); - RESOURCES_TO_COPY.forEach(fileName => { - copyFileSync( - path.join(templateDirectory, fileName), - path.join(outputResourcesPath, fileName) - ); - }); - - // extract laboratory information from model - const laboratoryInformation = extractLaboratoryInformationForWebWithDefaults(model.laboratory); - - generateIndex( - model, - laboratoryInformation, - path.join(templateDirectory, "index.html"), - path.join(outputDirectory, "index.html") - ); - - generateDataJS( - model, - laboratoryInformation, - path.join(templateDirectory, "data.js"), - path.join(outputDirectory, "data.js") - ); - - return outputDirectory; -} - -function generateIndex(model: Model, laboratoryInformation: ExtractedWebLaboratoryInformation, indexTemplatePath: string, outputIndexPath: string): void { - const indexTemplate = readTemplatedFile(indexTemplatePath, INDEX_TEMPLATE_MARKER); - - // Clear index.html file - writeFileSync(outputIndexPath, ""); - - // 1. Write Prefix - appendFileSync(outputIndexPath, indexTemplate.prefix); - - // 2. Write Header Data - const iconString = (laboratoryInformation.icon == undefined) ? "undefined" : laboratoryInformation.icon; - const headerData: string = `${laboratoryInformation.title}\n\t`; - appendFileSync(outputIndexPath, headerData); - - // 3. Write Postfix - appendFileSync(outputIndexPath, indexTemplate.postfix); -} - -function generateDataJS(model: Model, laboratoryInformation: ExtractedWebLaboratoryInformation, labTemplatePath: string, outputJavaScript: string): void { - const labTemplate = readTemplatedFile(labTemplatePath, DATA_TEMPLATE_MARKER); - - // Clear lab.js file - writeFileSync(outputJavaScript, ""); - - // Create lab.js (by appending to file?) - // 1. Write Prefix - appendFileSync(outputJavaScript, labTemplate.prefix); - - // 2. Write Laboratory Information - const laboratoryInformationNode = new CompositeGeneratorNode(); - generateLaboratoryInformation(laboratoryInformation, laboratoryInformationNode) - appendFileSync(outputJavaScript, toString(laboratoryInformationNode)); - - // 3. Write Concerns - const concernsNode = new CompositeGeneratorNode(); - generateConcerns(model.concerns, concernsNode, laboratoryInformation); - appendFileSync(outputJavaScript, toString(concernsNode)) - - // 4. Write Conditions - const conditionsNode = new CompositeGeneratorNode(); - generateConditions(model.conditions, conditionsNode); - appendFileSync(outputJavaScript, toString(conditionsNode)); - - // 5. Write Givens - const givensNode = new CompositeGeneratorNode(); - generateGivens(model.propositions, givensNode); - appendFileSync(outputJavaScript, toString(givensNode)); - - // 6. Write Tweakables - const tweakablesNode = new CompositeGeneratorNode(); - generateTweakables(model.propositions, tweakablesNode); - appendFileSync(outputJavaScript, toString(tweakablesNode)); - - const raiseConditionsNode = new CompositeGeneratorNode(); - generateRaiseConditions(model, raiseConditionsNode); - appendFileSync(outputJavaScript, toString(raiseConditionsNode)); - - - // 7. Write Postfix - appendFileSync(outputJavaScript, labTemplate.postfix); -} - -function generateLaboratoryInformation(laboratoryInformation: ExtractedWebLaboratoryInformation, node: CompositeGeneratorNode) { - node.append("export const metaData = {\n"); - - const titleString = (laboratoryInformation.title == undefined) ? "undefined" : `"${laboratoryInformation.title}"`; - node.append(`\ttitle: ${titleString},\n`); - - const descriptionString = (laboratoryInformation.description == undefined) ? "undefined" : `${laboratoryInformation.description}`; - node.append(`\tdescriptionHtml: html\`${descriptionString}\`,\n`); - - const authorString = (laboratoryInformation.author == undefined) ? "undefined" : `"${laboratoryInformation.author}"`; - node.append(`\tauthor: ${authorString},\n`); - - const versionString = (laboratoryInformation.version == undefined) ? "undefined" : `"${laboratoryInformation.version}"`; - node.append(`\tversion: ${versionString},\n`); - - // TODO: extract from laboratory information (also add to laboratory information...) - const scipUrlString = "http://localhost:5000/optimize"; - node.append(`\tscipUrl: "${scipUrlString}",\n`); - - node.append("};\n"); -} \ No newline at end of file diff --git a/src/generators/optimizer/propositions.ts b/src/generators/optimizer/propositions.ts deleted file mode 100644 index bc1a5cc0..00000000 --- a/src/generators/optimizer/propositions.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { integer } from "vscode-languageserver"; -import { Proposition } from "../../language/generated/ast.js"; -import { extractJSCondition } from "./util.js"; -import { extractValueAsString } from "../../util/modelUtil.js"; - -function isGiven(proposition: Proposition) { - return proposition.valueClauses.length == 1; -} - -export function generateGivens(propositions: Proposition[], node: CompositeGeneratorNode) { - node.append(`export const givens = [\n`); - - propositions.filter(isGiven).forEach(given => { - let value = given.valueClauses[0].value; - node.append(`\t{ input: \`${given.expression}\`, output: ${extractValueAsString(value)} },\n`); - }); - - node.append(`];\n`); -} - -function generateConcernFunction(proposition: Proposition, node: CompositeGeneratorNode, baseIndent: string) { - const indent = (level: integer) => baseIndent + "\t".repeat(level); - - node.append(`(self, get) => {\n`); - node.append(indent(1) + `let result = [];\n`) - proposition.valueClauses.forEach(clause => { - node.append(indent(1) + `if (self === ${extractValueAsString(clause.value)}) {\n`); - clause.raises.forEach(raise => { - if (raise.condition === undefined) { - node.append(indent(2) + `result.push(concerns.${raise.concern.ref?.name});\n`); - } else { - node.append(indent(2) + `if (${extractJSCondition.fromExpression(raise.condition.expression)}) {\n`); - node.append(indent(3) + `result.push(concerns.${raise.concern.ref?.name});\n`); - node.append(indent(2) + "}\n"); - } - }) - node.append(indent(1) + "}\n"); - }); - - node.append(indent(1) + `return result;\n`); - node.append(`${indent(0)}}`); -} - -function generateDisableFunction(proposition: Proposition, node: CompositeGeneratorNode, baseIndent: string) { - const indent = (level: integer) => baseIndent + "\t".repeat(level); - if(proposition.disable === undefined) { - node.append(indent(1) + "return false;\n"); - return; - } - - proposition.disable.statements.forEach(statement => { - node.append(indent(1) + `if (${extractJSCondition.fromExpression(statement.condition.expression)}) {\n`); - node.append(indent(2) + `return "${statement.message}"\n`); - node.append(indent(1) + `}\n`); - }); - node.append(indent(1) + "return false;\n"); -} - -export function generateTweakables(propositions: Proposition[], node: CompositeGeneratorNode) { - const tweakables = propositions.filter(proposition => !isGiven(proposition)); - - node.append(`export const tweakables = [\n`); - tweakables.forEach(tweakable => { - node.append(`\ttweakable({\n`); - { - let defaultValue = tweakable.valueClauses.filter(clause => {return clause.default;})[0].value; - let outputListAsString = tweakable.valueClauses.map(clause => extractValueAsString(clause.value)).join(", "); - - node.append(`\t\tname: \`${tweakable.name}\`,\n`); - node.append(`\t\tinput: \`${tweakable.expression}\`,\n`); - node.append(`\t\toutput: [${outputListAsString}],\n`); - node.append(`\t\tdefault: ${extractValueAsString(defaultValue)},\n`); - - node.append(`\t\tconcern: `); - generateConcernFunction(tweakable, node, "\t\t"); - node.append(`,\n`); - - node.append(`\t\tdisabled: (get) => {\n`); - generateDisableFunction(tweakable, node, "\t\t"); - node.append(`\t\t},\n`); - } - node.append(`\t}),\n`) - }); - node.append(`];\n`); -} \ No newline at end of file diff --git a/src/generators/optimizer/raiseConditions.ts b/src/generators/optimizer/raiseConditions.ts deleted file mode 100644 index 2ad6eaa0..00000000 --- a/src/generators/optimizer/raiseConditions.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { CompositeGeneratorNode } from "langium"; -import { DisableClause, Model } from "../../language/generated/ast.js"; -import { LExpression, LStatement, propositionalToLogical } from "./logic.js"; - -export function generateRaiseConditions(model: Model, node: CompositeGeneratorNode) { - node.append("export const raiseConditions = {\n"); - - model.concerns.forEach(concern => { - let condition = generateDisjunction(extractRelatedConditions(model, concern.name)); - if (condition !== undefined) { - let simplified = simplifyCondition(condition); - node.append(`\t${concern.name}: ${JSON.stringify(simplified)},\n`); - } - }); - - node.append("};\n"); -} - -function extractRelatedConditions(model: Model, concernName: string): Array { - let result = Array(); - - model.propositions.forEach(proposition => { - proposition.valueClauses.forEach(valueClause => { - valueClause.raises - .filter(raise => (raise.concern.ref?.name === concernName)) - .forEach(raise => { - let valueStatement: LStatement = {type: "statement", proposition: proposition.name, value: valueClause.value}; - - let baseExpression: LExpression; - - if (raise.condition === undefined) { - // concern is always raised whenever the proposition is set to this value - baseExpression = valueStatement; - } else { - // concern is only raised when proposition is set to this value AND the condition holds - baseExpression = { - type: "and", - left: valueStatement, - right: propositionalToLogical(raise.condition.expression) - }; - } - - // Ensure the condition is only true when the proposition is not disabled - if (proposition.disable === undefined) { - result.push(baseExpression); - } else { - result.push({ - type: "and", - left: { - type: "not", - inner: lExpressionFromDisable(proposition.disable) - }, - right: baseExpression - }); - } - }) - }) - }); - - return result; -} - -function generateDisjunction(conditions: Array): LExpression | undefined{ - if (conditions.length === 0) { - // concern is never raised so we can signal to ignore this concern completely - return undefined; - } - if (conditions.length === 1) { - return conditions[0]; - } - - let result = conditions.pop(); - if (result === undefined) return undefined; - - while (conditions.length >= 1) { - let current = conditions.pop(); - if (current === undefined) return undefined; - result = { - type: "or", - left: current, - right: result - } - } - - return result; -} - -function simplifyCondition(condition: LExpression): LExpression { - // TODO: - return condition; -} - -function lExpressionFromDisable(disable: DisableClause): LExpression { - let condition = generateDisjunction( - disable.statements.map( - statement => (propositionalToLogical(statement.condition.expression)) - ) - ); - if (condition === undefined) { - throw new Error("Unexpected Error"); // This cant happen - } - - return condition; -} \ No newline at end of file diff --git a/src/generators/optimizer/util.ts b/src/generators/optimizer/util.ts deleted file mode 100644 index 5964e5fc..00000000 --- a/src/generators/optimizer/util.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { readFileSync } from 'node:fs'; -import { OrExpression, AndExpression, Negation, Group, Statement, PropositionalExpression, LaboratoryInformation } from "../../language/generated/ast.js"; -import { LogicalExpressionExtractor, extractLaboratoryInformation, extractValueAsString, formattedStringToHTML } from "../../util/modelUtil.js"; - -export const extractJSCondition: LogicalExpressionExtractor = { - fromOrExpression: function (expression: OrExpression): string { - return `${extractJSCondition.fromExpression(expression.left)} || ${extractJSCondition.fromExpression(expression.right)}`; - }, - fromAndExpression: function (expression: AndExpression): string { - return `${extractJSCondition.fromExpression(expression.left)} && ${extractJSCondition.fromExpression(expression.right)}`; - }, - fromNegation: function (expression: Negation): string { - return `! ${extractJSCondition.fromExpression(expression.inner)}`; - }, - fromGroup: function (expression: Group): string { - return `(${extractJSCondition.fromExpression(expression.inner)})`; - }, - fromStatement: function (expression: Statement): string { - const reference = expression.reference.ref; - if (reference == undefined) - return ""; // This should never occur.... - - const equalTo = `${expression.negation ? "!" : "="}== ${extractValueAsString(expression.value)}`; - - switch (reference.$type) { - case 'Condition': - return `conditions.${reference.name}(get) ${equalTo}`; - case 'Proposition': - return `get('${reference.name}') ${equalTo}`; - } - }, - fromExpression: function (expression: PropositionalExpression): string { - switch (expression.$type) { - case 'OrExpression': - return extractJSCondition.fromOrExpression(expression as OrExpression); - case 'AndExpression': - return extractJSCondition.fromAndExpression(expression as AndExpression); - case 'Negation': - return extractJSCondition.fromNegation(expression as Negation); - case 'Group': - return extractJSCondition.fromGroup(expression as Group); - case 'Statement': - return extractJSCondition.fromStatement(expression as Statement); - } - } -}; - -function splitByStartAndEndMarker(input: string, markers: TemplateMarker): {BEFORE: string, AFTER: string} { - const splitByStartMarker = input.split(markers.START); - - return { - BEFORE: splitByStartMarker[0], - AFTER: splitByStartMarker[1].split(markers.END)[1] - }; -}; - -export type TemplateMarker = {START: string, END: string} -export function readTemplatedFile(templateFilePath: string, templateMarker: TemplateMarker): {prefix: string, postfix: string} { - const template: string = readFileSync(templateFilePath, `utf-8`); - if (template.indexOf(templateMarker.START) === -1) - throw new Error(`Template file is missing START Marker. file: "${templateFilePath}", START Marker: "${templateMarker.START}"`); - if (template.indexOf(templateMarker.END) === -1) - throw new Error(`Template file is missing END Marker. file: "${templateFilePath}", END Marker: "${templateMarker.END}"`); - - const splitByConcernsMarkers = splitByStartAndEndMarker(template, templateMarker); - return { - prefix: splitByConcernsMarkers.BEFORE, - postfix: splitByConcernsMarkers.AFTER - }; -} - -export type ExtractedWebLaboratoryInformation = { - title: string, - description: string, - icon: string | undefined, - format: string, - author: string | undefined, - version: string | undefined -} -const DEFAULT_WEB_LABORATORY_INFORMATION: ExtractedWebLaboratoryInformation = { - title: "Laboratory Title", - description: "

Laboratory description

", - icon: undefined, - format: "MD", - author: undefined, - version: undefined -} -export function extractLaboratoryInformationForWebWithDefaults(information: LaboratoryInformation | undefined): ExtractedWebLaboratoryInformation { - const extracted = extractLaboratoryInformation(information); - // deep copy defaults - let result = JSON.parse(JSON.stringify(DEFAULT_WEB_LABORATORY_INFORMATION)); - - if (extracted.title !== undefined) result.title = extracted.title; - if (extracted.icon !== undefined) result.icon = extracted.icon; - if (extracted.format !== undefined) result.format = extracted.format; - if (extracted.author !== undefined) result.author = extracted.author; - if (extracted.version !== undefined) result.version = extracted.version; - if (extracted.description !== undefined) result.description = formattedStringToHTML(extracted.description, result.format); - - return result; -} \ No newline at end of file diff --git a/src/language/java-script-propositional-laboratory-format-module.ts b/src/language/java-script-propositional-laboratory-format-module.ts deleted file mode 100644 index 7459289d..00000000 --- a/src/language/java-script-propositional-laboratory-format-module.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { DefaultSharedModuleContext, LangiumServices, LangiumSharedServices, Module, PartialLangiumServices } from 'langium'; -import { createDefaultModule, createDefaultSharedModule, inject } from 'langium'; -import { JavaScriptPropositionalLaboratoryFormatGeneratedModule, JavaScriptPropositionalLaboratoryFormatGeneratedSharedModule } from './generated/module.js'; -import { JavaScriptPropositionalLaboratoryFormatValidator, registerValidationChecks } from './java-script-propositional-laboratory-format-validator.js'; - -/** - * Declaration of custom services - add your own service classes here. - */ -export type JavaScriptPropositionalLaboratoryFormatAddedServices = { - validation: { - JavaScriptPropositionalLaboratoryFormatValidator: JavaScriptPropositionalLaboratoryFormatValidator - } -} - -/** - * Union of Langium default services and your custom services - use this as constructor parameter - * of custom service classes. - */ -export type JavaScriptPropositionalLaboratoryFormatServices = LangiumServices & JavaScriptPropositionalLaboratoryFormatAddedServices - -/** - * Dependency injection module that overrides Langium default services and contributes the - * declared custom services. The Langium defaults can be partially specified to override only - * selected services, while the custom services must be fully specified. - */ -export const JavaScriptPropositionalLaboratoryFormatModule: Module = { - validation: { - JavaScriptPropositionalLaboratoryFormatValidator: () => new JavaScriptPropositionalLaboratoryFormatValidator() - } -}; - -/** - * Create the full set of services required by Langium. - * - * First inject the shared services by merging two modules: - * - Langium default shared services - * - Services generated by langium-cli - * - * Then inject the language-specific services by merging three modules: - * - Langium default language-specific services - * - Services generated by langium-cli - * - Services specified in this file - * - * @param context Optional module context with the LSP connection - * @returns An object wrapping the shared services and the language-specific services - */ -export function createJavaScriptPropositionalLaboratoryFormatServices(context: DefaultSharedModuleContext): { - shared: LangiumSharedServices, - JavaScriptPropositionalLaboratoryFormat: JavaScriptPropositionalLaboratoryFormatServices -} { - const shared = inject( - createDefaultSharedModule(context), - JavaScriptPropositionalLaboratoryFormatGeneratedSharedModule - ); - const JavaScriptPropositionalLaboratoryFormat = inject( - createDefaultModule({ shared }), - JavaScriptPropositionalLaboratoryFormatGeneratedModule, - JavaScriptPropositionalLaboratoryFormatModule - ); - shared.ServiceRegistry.register(JavaScriptPropositionalLaboratoryFormat); - registerValidationChecks(JavaScriptPropositionalLaboratoryFormat); - return { shared, JavaScriptPropositionalLaboratoryFormat }; -} diff --git a/src/language/java-script-propositional-laboratory-format-validator.ts b/src/language/java-script-propositional-laboratory-format-validator.ts deleted file mode 100644 index 8ccf63a9..00000000 --- a/src/language/java-script-propositional-laboratory-format-validator.ts +++ /dev/null @@ -1,193 +0,0 @@ -import type { ValidationAcceptor, ValidationChecks } from 'langium'; -//import type { JavaScriptPropositionalLaboratoryFormatAstType, Person } from './generated/ast.js'; -import { type JavaScriptPropositionalLaboratoryFormatAstType, Proposition, Model, Condition, LaboratoryInformation, Concern, Referenceable, Statement} from './generated/ast.js'; -import type { JavaScriptPropositionalLaboratoryFormatServices } from './java-script-propositional-laboratory-format-module.js'; -import { getAllUsedConcerns, getAllUsedReferenceables, getReferencablesInWhenCondition } from '../util/modelUtil.js'; - -/** - * Register custom validation checks. - */ -export function registerValidationChecks(services: JavaScriptPropositionalLaboratoryFormatServices) { - const registry = services.validation.ValidationRegistry; - const validator = services.validation.JavaScriptPropositionalLaboratoryFormatValidator; - const checks: ValidationChecks = { - Model: [ - validator.uniqueConcernIdentifiers, - validator.uniqueReferenceableIdentifiers, - validator.checkForUnusedConcerns, - validator.checkForUnusedConditions - ], - Proposition: [ - validator.propositionHasExactlyOneDefaultOrJustOneValue, - ], - Condition: [ - validator.noRecursionInConditions, - ], - LaboratoryInformation: [ - validator.noDuplicateFieldsInLaboratoryInformation - ], - Statement: [ - validator.statementReferencesValidValue - ] - }; - registry.register(checks, validator); -} - -/** - * Implementation of custom validations. - */ -export class JavaScriptPropositionalLaboratoryFormatValidator { - - uniqueConcernIdentifiers(model: Model, accept: ValidationAcceptor): void { - // create a set of visited functions - // and report an error when we see one we've already seen - const reported = new Set(); - model.concerns.forEach(concern => { - if (reported.has(concern.name)) { - accept('error', `Concern has non-unique name '${concern.name}'.`, {node: concern, property: 'name'}); - } - reported.add(concern.name); - }); - } - - uniqueReferenceableIdentifiers(model: Model, accept: ValidationAcceptor): void { - // create a set of visited functions - // and report an error when we see one we've already seen - const reported = new Map(); - model.conditions.forEach(condition => { - if (reported.has(condition.name)) { - // show error on current conditional - accept( - 'error', - `Condition has non-unique name '${condition.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - {node: condition, property: 'name'} - ); - // show error on original referenceable - let original = reported.get(condition.name); - accept( - 'error', - `Object has non-unique name '${original.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - {node: original, property: 'name'} - ); - } - reported.set(condition.name, condition); - }); - model.propositions.forEach(proposition => { - if (reported.has(proposition.name)) { - // show error on current proposition - accept( - 'error', - `Proposition has non-unique name '${proposition.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - {node: proposition, property: 'name'} - ); - // show error on original referenceable - let original = reported.get(proposition.name); - accept( - 'error', - `Object has non-unique name '${original.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - {node: original, property: 'name'} - ); - } - reported.set(proposition.name, proposition); - }); - } - - checkForUnusedConcerns(model: Model, accept: ValidationAcceptor): void { - const usedConcerns: Set = getAllUsedConcerns(model); - - model.concerns.forEach(concern => { - if (usedConcerns.has(concern)) - return; - accept('warning', 'Concern is defined, but never used.', {node: concern, property: 'name'}); - }); - } - - checkForUnusedConditions(model: Model, accept: ValidationAcceptor): void { - const usedReferenceables: Set = getAllUsedReferenceables(model); - - model.conditions.forEach(condition => { - if (usedReferenceables.has(condition)) - return; - accept('warning', 'Condition is defined, but never used.', {node: condition, property: 'name'}); - }); - } - - propositionHasExactlyOneDefaultOrJustOneValue(proposition: Proposition, accept: ValidationAcceptor): void { - // allow for singular value, that will be assumed default - if (proposition.valueClauses.length == 1 && !proposition.valueClauses[0].default) { - accept( - 'info', - `Singleton value ${proposition.valueClauses[0].value} of proposition ${proposition.name} will be assumed to be default value.`, - {node: proposition.valueClauses[0], property: 'default'} - ); - return; - } - - let foundDefault = false; - proposition.valueClauses.forEach(valueDescription => { - // first Default found - if (!foundDefault && valueDescription.default) { - foundDefault = true; - return; - } - - if (valueDescription.default) { - accept('error', `Proposition has multiple default values.`, {node: valueDescription, property: 'default'}); - return; - } - }); - if (!foundDefault) { - accept('error', `Proposition has no default value.`, {node: proposition, property: 'name'}) - return; - } - } - - noRecursionInConditions(condition: Condition, accept: ValidationAcceptor): void { - const name = condition.name; - const referenceablesInCondition = getReferencablesInWhenCondition(condition.condition); - - referenceablesInCondition.forEach(referenceable => { - if (referenceable.name === name) - accept('error', `Recursion is not allowed here.`, {node: condition, property: 'name'}); - }); - } - - noDuplicateFieldsInLaboratoryInformation(information: LaboratoryInformation, accept: ValidationAcceptor): void { - if (information.descriptions.length > 1) - accept('error', 'Multiple descriptions for one laboratory are not allowed.', {node: information}); - if (information.titles.length > 1) - accept('error', 'Multiple titles for one laboratory are not allowed.', {node: information}); - if (information.icons.length > 1) - accept('error', 'Multiple icons for one laboratory are not allowed.', {node: information}); - if (information.formats.length > 1) - accept('error', 'Multiple default formats for one laboratory are not allowed.', {node: information}); - if (information.authors.length > 1) - accept('error', 'Multiple authors for one laboratory are not allowed.', {node: information}); - if (information.versions.length > 1) - accept('error', 'Multiple versions for one laboratory are not allowed.', {node: information}); - } - - statementReferencesValidValue(statement: Statement, accept: ValidationAcceptor): void { - if (statement === undefined) return; - if (statement.value === undefined) return; - if (statement.reference === undefined) return; - if (statement.reference.ref === undefined) return; - - // Extract referenced referenceable - const referenceable = statement.reference.ref; - const value = statement.value; - - if (referenceable.$type === "Condition") { - if (typeof value === "boolean") return; - accept('error', 'Stated value is not a valid value of the referenced object.', {node: statement, property: 'value'}); - return; - } - - // referenceable is a Proposition - const proposition = referenceable as Proposition; - if (proposition.valueClauses === undefined) return; - const foundValue = proposition.valueClauses.map(clause => (clause.value)).find(defined => (defined === value)); - if (foundValue !== undefined) return; - accept('error', 'Stated value is not a valid value of the referenced object.', {node: statement, property: 'value'}); - } -} diff --git a/src/language/main.ts b/src/language/main.ts deleted file mode 100644 index b3543df8..00000000 --- a/src/language/main.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { startLanguageServer } from 'langium'; -import { NodeFileSystem } from 'langium/node'; -import { createConnection, ProposedFeatures } from 'vscode-languageserver/node.js'; -import { createJavaScriptPropositionalLaboratoryFormatServices } from './java-script-propositional-laboratory-format-module.js'; - -// Create a connection to the client -const connection = createConnection(ProposedFeatures.all); - -// Inject the shared services and language-specific services -const { shared } = createJavaScriptPropositionalLaboratoryFormatServices({ connection, ...NodeFileSystem }); - -// Start the language server with the shared services -startLanguageServer(shared); diff --git a/src/util/cli-util.ts b/src/util/cli-util.ts deleted file mode 100644 index c94a71b1..00000000 --- a/src/util/cli-util.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { AstNode, LangiumDocument, LangiumServices } from 'langium'; -import chalk from 'chalk'; -import {basename as pathBasename, extname as pathExtname, resolve as pathResolve, join as pathJoin, dirname as pathDirname} from 'node:path'; -import * as fs from 'node:fs'; -import { URI } from 'langium'; -import { JavaScriptPropositionalLaboratoryFormatLanguageMetaData } from '../language/generated/module.js'; - -export function getInputExtensionsAsSet(): Set { - return new Set(JavaScriptPropositionalLaboratoryFormatLanguageMetaData.fileExtensions); -} - -export function getInputExtensionsAsString(): string { - return JavaScriptPropositionalLaboratoryFormatLanguageMetaData.fileExtensions.join(', '); -} - -export async function extractDocument(fileName: string, services: LangiumServices): Promise { - const extensions = services.LanguageMetaData.fileExtensions; - if (!extensions.includes(pathExtname(fileName))) { - console.error(chalk.yellow(`Please choose a file with one of these extensions: ${extensions}.`)); - process.exit(1); - } - - if (!fs.existsSync(fileName)) { - console.error(chalk.red(`File ${fileName} does not exist.`)); - process.exit(1); - } - - const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(pathResolve(fileName))); - await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); - - const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); - if (validationErrors.length > 0) { - console.error(chalk.red('There are validation errors:')); - for (const validationError of validationErrors) { - console.error(chalk.red( - `line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]` - )); - } - process.exit(1); - } - - return document; -} - -export async function extractAstNode(fileName: string, services: LangiumServices): Promise { - return (await extractDocument(fileName, services)).parseResult?.value as T; -} - -interface FilePathData { - destination: string, - name: string -} - -export function extractDestinationAndName(filePath: string, destination: string | undefined): FilePathData { - filePath = pathBasename(filePath, pathExtname(filePath)).replace(/[.-]/g, ''); - return { - destination: destination ?? pathJoin(pathDirname(filePath), 'generated'), - name: pathBasename(filePath) - }; -} diff --git a/src/util/modelUtil.ts b/src/util/modelUtil.ts deleted file mode 100644 index 9cbd2726..00000000 --- a/src/util/modelUtil.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { toString } from 'langium'; -import { AndExpression, Concern, FormattedString, Group, LaboratoryInformation, Model, Negation, OrExpression, PropositionalExpression, Referenceable, Statement, WhenCondition } from '../language/generated/ast.js'; -import dedent from 'dedent-js'; -import { Marked } from '@ts-stack/markdown'; - -export type LogicalExpressionExtractor = { - fromExpression: Function, - fromOrExpression: Function, - fromAndExpression: Function, - fromNegation: Function, - fromGroup: Function, - fromStatement: Function -} - -const extractReferenceables: LogicalExpressionExtractor = { - fromExpression: function (expression: PropositionalExpression, output: Set): void { - if (expression === undefined) - return; - - switch (expression.$type) { - case 'OrExpression': - extractReferenceables.fromOrExpression(expression as OrExpression, output); - break; - case 'AndExpression': - extractReferenceables.fromAndExpression(expression as AndExpression, output); - break; - case 'Negation': - extractReferenceables.fromNegation(expression as Negation, output); - break; - case 'Group': - extractReferenceables.fromGroup(expression as Group, output); - break; - case 'Statement': - extractReferenceables.fromStatement(expression as Statement, output); - break; - } - }, - fromOrExpression: function (expression: OrExpression, output: Set): void { - extractReferenceables.fromExpression(expression.left, output); - extractReferenceables.fromExpression(expression.right, output); - }, - fromAndExpression: function (expression: AndExpression, output: Set): void { - extractReferenceables.fromExpression(expression.left, output); - extractReferenceables.fromExpression(expression.right, output); - }, - fromNegation: function (expression: Negation, output: Set): void { - extractReferenceables.fromExpression(expression.inner, output); - }, - fromGroup: function (expression: Group, output: Set): void { - extractReferenceables.fromExpression(expression.inner, output); - }, - fromStatement: function (statement: Statement, output: Set): void { - let reference = statement.reference.ref; - if (reference !== undefined) - output.add(reference); - }, -} - -export function getReferencablesInWhenCondition(condition: WhenCondition): Set { - let result = new Set(); - extractReferenceables.fromExpression(condition.expression, result); - return result; -} - -const extractStringFromExpression: LogicalExpressionExtractor = { - fromExpression: function (expression: PropositionalExpression): string { - if (expression === undefined) - return ""; - - switch (expression.$type) { - case 'OrExpression': - return extractStringFromExpression.fromOrExpression(expression as OrExpression); - case 'AndExpression': - return extractStringFromExpression.fromAndExpression(expression as AndExpression); - case 'Negation': - return extractStringFromExpression.fromNegation(expression as Negation); - case 'Group': - return extractStringFromExpression.fromGroup(expression as Group); - case 'Statement': - return extractStringFromExpression.fromStatement(expression as Statement); - } - }, - fromOrExpression: function (expression: OrExpression): string { - return extractStringFromExpression.fromExpression(expression.left) + " or " + extractStringFromExpression.fromExpression(expression.right); - }, - fromAndExpression: function (expression: AndExpression): string { - return extractStringFromExpression.fromExpression(expression.left) + " or " + extractStringFromExpression.fromExpression(expression.right); - }, - fromNegation: function (expression: Negation): string { - return "not " + extractStringFromExpression.fromExpression(expression.inner); - }, - fromGroup: function (expression: Group): string { - return "(" + extractStringFromExpression.fromExpression(expression.inner) + ")"; - }, - fromStatement: function (statement: Statement): string { - return statement.reference.$refText + ` is${statement.negation ? " not" : ""} ` + extractValueAsString(statement.value); - - } -} - -export function getStringFromWhenCondition(condition: WhenCondition): string { - return extractStringFromExpression.fromExpression(condition.expression); -} - - -export function getAllUsedConcerns(model: Model): Set { - let result = new Set(); - - model.propositions.forEach(proposition => { - proposition.valueClauses.forEach(valueClause => { - valueClause.raises.forEach(raisingConcern => { - if (raisingConcern.concern?.ref != undefined) - result.add(raisingConcern.concern.ref); - }); - }); - }); - - return result; -} - -export function getAllUsedReferenceables(model: Model): Set { - let result = new Set(); - - model.propositions.forEach(proposition => { - proposition.valueClauses.forEach(valueClause => { - valueClause.raises.forEach(raisingConcern => { - if (raisingConcern.condition == undefined) - return; - getReferencablesInWhenCondition(raisingConcern.condition).forEach(referenceable => { - result.add(referenceable); - }); - }); - }); - - if (proposition.disable === undefined) - return; - - proposition.disable.statements.forEach(disableStatement => { - getReferencablesInWhenCondition(disableStatement.condition).forEach(referenceable => { - result.add(referenceable); - }); - }); - }); - - return result; -} - -export function extractValueAsString(value: string | boolean): string { - return (typeof value) === "string" ? `"${value}"` : toString(value); -} - -export function formattedStringToHTML(formattedString: FormattedString, default_format: string = "MD"): string { - // Extract format - let format = formattedString.format; - if (format === undefined) - format = default_format; - - // Process multiline string - const preprocessed = dedent(formattedString.contents); - - switch (format) { - case "HTML": - return preprocessed; - case "MD": - return Marked.parse(preprocessed); - default: // This should never be reached, unless something wrong is passed into default_format - return Marked.parse(preprocessed); - } -} - -export type ExtractedLaboratoryInformation = { - title: string | undefined, - description: FormattedString | undefined, - icon: string | undefined, - format: string | undefined, - author: string | undefined, - version: string | undefined -} -const DEFAULT_LABORATORY_INFORMATION: ExtractedLaboratoryInformation = { - title: undefined, - description: undefined, - icon: undefined, - format: undefined, - author: undefined, - version: undefined -} -export function extractLaboratoryInformation(information: LaboratoryInformation | undefined): ExtractedLaboratoryInformation { - let result: ExtractedLaboratoryInformation = JSON.parse(JSON.stringify(DEFAULT_LABORATORY_INFORMATION)); - if (information === undefined) return result; - - if (information.titles.length > 0) - result.title = information.titles[0]; - if (information.descriptions.length > 0) - result.description = information.descriptions[0]; - if (information.icons.length > 0) - result.icon = information.icons[0]; - if (information.formats.length > 0) - result.format = information.formats[0]; - if (information.authors.length > 0) - result.author = information.authors[0]; - if (information.versions.length > 0) - result.version = information.versions[0]; - - return result; -} diff --git a/templates/laboratory-template/LICENSE b/templates/laboratory-template/LICENSE deleted file mode 100644 index 6bcfa6c5..00000000 --- a/templates/laboratory-template/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Ashley Claymore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/templates/laboratory-template/README.md b/templates/laboratory-template/README.md deleted file mode 100644 index cc396f3e..00000000 --- a/templates/laboratory-template/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Record Tuple Laboratory - -https://acutmore.github.io/record-tuple-laboratory/ - -Work in progress. Please feel free to [raise an issue](https://github.com/acutmore/record-tuple-laboratory/issues). diff --git a/templates/laboratory-template/data.js b/templates/laboratory-template/data.js deleted file mode 100644 index d502ff91..00000000 --- a/templates/laboratory-template/data.js +++ /dev/null @@ -1,40 +0,0 @@ -import { html } from "https://unpkg.com/htm/preact/standalone.module.js"; - -/** - * # Tweakables - * name: a unique string to identify the tweakable (used in searches) - * input: a JS snippet - * output: a string if this is 'given', or an Array of design options - * disabled: a non-pure function that returns a string if this options is not currently available - * concern: a non-pure function that returns a string if there is a concern with the design - * - * @template {string|boolean} T - * @param t {{name: string, input: string, output: readonly T[], concern : ((self:T) => any), default: T, disabled?: Function }} - */ -function tweakable({name, input, output, concern, default: _default, disabled}) { - return { - name, - input, - output, - concern: (get) => concern(get(name), get), - default: _default, - disabled - }; -} - - -//???TEMPLATE-MARKER-START??? - -export const metaData = { - titel: "", - descriptionHtml: html``, - author: "", - version: "", -} - -const concerns = {}; - -export const givens = []; -export const tweakables = []; - -//???TEMPLATE-MARKER-END??? \ No newline at end of file diff --git a/templates/laboratory-template/favicon.svg b/templates/laboratory-template/favicon.svg deleted file mode 100644 index 3e6b72c4..00000000 --- a/templates/laboratory-template/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - 🔬 - diff --git a/templates/laboratory-template/github.png b/templates/laboratory-template/github.png deleted file mode 100644 index 8b25551a97921681334176ee143b41510a117d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1714 zcmaJ?X;2eq7*4oFu!ne{XxAht2qc?8LXr|_LPCfTpaBK7K$c{I0Ld=NLIOeuC;@2) zZ$K%a)k+m-s0>xHmKxL%0V&0TRzzznhgyqrIC$F)0{WwLXLrBvd*^wc_uSc%h%m9E z{W5z3f#4_!7RvAyFh6!S_*<8qJ%KOIm?#E|L=rJQq=gB5C6WLG5;c?r%V0>EmEH#X z5eSwPRa6WXBMs#$5H%GtW2go-in9p>zW@UYDNNWc^XOXZQ? z1QjEV00I#$3^1wQUJ8&-2UsjB-G|9y(LDhMNN3PM{APL4eYi{(m*ERcUnJa{R+-3^ z34^A6;U^v`8N*O6ji%S@sd{fJqD`XFIUJ5zgTe5^5nj414F(y!G&=H(f)Lgzv?>%+ zAsWD}2qhpH7>|TU`X&W6IxDNuO_vET7|j5oG&&VDr!)hUO8+0KR?nh!m<)a!?|%yG zqOwq!CWCcIhE{<$E|F|@g>nP6FoYr6C<8>D?ID9%&5J(4oSbR1I^byW*g@__U z4QsF&uJSEcFeleM3~ChjEQGbHOjsGDMbyAl(p=Ttv9RaVo8~I#js@@Y9C^_2U})yn zzSHU%6FxuY?d;&65MyR({^lU*3$z$ZllDb(o&<7d;A_`h2U+3~BJ2Hv`{W}KEU801#cv_B|9Cm!ynR{S`AMsSn z;7E=B;mb!wx$L;S>yGXG^6=&WlQn9$s?&L%Y1D8TI^MlKB1DqsEng$>f4=xYWBoPI z_S1p!sJ#d2?YI4kPA{k}Eby?F=f-J9zIc`YDl^pzjVm~9ebE?Hn?t0Nx+la|D0MB; z9)2xv1G>a1|A9kQ>~DV<=X3-4yC&n!m8-3K#P z{X@0zRuQsy$+N ziSCoLJU{Z$nQy4A4Y5UJ07$5FA~qL2%Q+cLaqDU?Lz3?=BC5;Nk6BbTmmceEaM>-Z zi>O&-dSE=%ex;vcvCOk{*JQ5^_4M z4lW7%l9IqY(z7pV(?I@@8=KPFO82)O{VDI18-*d-k$YmI^XiuPs_LuFw<^ZcD}yP5 c*NrbeloN*74g`U%%F6r~k%+>C^#XapzmV0H-2eap diff --git a/templates/laboratory-template/index.html b/templates/laboratory-template/index.html deleted file mode 100644 index bbc19ea7..00000000 --- a/templates/laboratory-template/index.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - Record and Tuple Laboratory - - - - - - - - diff --git a/templates/laboratory-template/lab.js b/templates/laboratory-template/lab.js deleted file mode 100644 index 5561611f..00000000 --- a/templates/laboratory-template/lab.js +++ /dev/null @@ -1,237 +0,0 @@ -// @ts-check -// @ts-expect-error -import { html, render } from "https://unpkg.com/htm/preact/standalone.module.js"; - -let appLoaded = false; -let paintScheduled = true; -const paintSync = () => { - if (!appLoaded) return; - render(html`<${App} />`, document.body); - paintScheduled = false; -}; -const schedulePaint = () => { - if (paintScheduled) return; - paintScheduled = true; - Promise.resolve().then(paintSync); -}; - -/** - * The state. Which selection has been made for the inputs that have a choice of outputs - * @type {Map} - */ -const selections = new Map(); - -/** @type {typeof selections['set']} */ -const setSelection = (name, output) => { - const match = tweakables.find((v) => v.name === name); - if (match) { - if (Array.isArray(match.output) && match.output.includes(/** @type {never} */ (output))) { - if (selections.get(name) !== output) { - selections.set(name, output); - if (appLoaded) { - location.hash = ""; - schedulePaint(); - } - } - } - } - return selections; -}; - - -/** @param tweakableName {string} */ -const get = (tweakableName) => selections.get(tweakableName); - -import { metaData, givens, tweakables } from "./data.js"; - -function setToDefaults() { - for (const { name, default: _default } of tweakables) { - setSelection(name, _default); - } -} -setToDefaults(); - -const design = [...givens, ...tweakables]; - -// ------------------------------------------------------------------------------------------------ - -const urlLoadingIssues = (function attemptLoadFromURL() { - const issues = []; - try { - const urlData = location.hash; - if (!urlData) { - return []; - } - const tweakableKeys = new Map(tweakables.map((t) => [t.name, t])); - let data; - try { - let b64 = urlData.slice(1); - b64 += Array(((4 - (b64.length % 4)) % 4) + 1).join('='); - b64 = b64.replace(/\-/g, '+').replace(/\_/g, '/'); - data = JSON.parse(atob(b64)); - } catch (err) { - // fallback to old url style - data = JSON.parse(decodeURI(urlData.slice(1)).replace(/%23/g, '#')); - } - for (const [key, value] of Object.entries(data)) { - if (!tweakableKeys.has(key)) { - issues.push(`Unknown item in url: '${key}'`); - } - setSelection(key, value); - tweakableKeys.delete(key); - } - for (const [unusedKey, t] of tweakableKeys) { - if (t.disabled?.()) continue; - issues.push(`'${unusedKey}' was not set by the URL`); - } - } catch (e) { - console.error(e); - } - return issues; -})(); - -function shuffle() { - location.hash = ""; - for (const { name, output } of tweakables) { - Array.isArray(output) && - setSelection(name, output[Math.floor(Math.random() * output.length)]); - } - schedulePaint(); -} - -function App() { - return html` -

- ${metaData.title} ${metaData.version == undefined ? "" : `(v${metaData.version})`} -

- ${ - metaData.author == undefined ? "" : html` -

- by ${metaData.author} -

- ` - } -
-
- ${metaData.descriptionHtml} -
-
- ${urlLoadingIssues.length > 0 - ? html` -
    - ${urlLoadingIssues.map((issue) => html`
  • ${issue}
  • `)} -
- ` - : false} -

- - -

- - ${design.map((c) => { - const disabled = "disabled" in c ? c.disabled?.(get) ?? false : false; - //const currentValue = get(c); - const concerns = "concern" in c ? c.concern?.(get) ?? false : false; - const attrs = disabled ? { class: "disabled", title: disabled } : {}; - return html` - - - - - - `; - })} -
${c.input}
<${Selection} ...${c} disabled=${disabled} /> - ${disabled - ? html`
- - ${disabled} -
` - : concerns - ? concerns - : ""} -
-
-
- <${JSONOutput} /> -
-
- <${JSONInput} /> -
-
- `; -} - -function Selection({ name, output, disabled }) { - if (Array.isArray(output)) { - return html` - - `; - } - return JSON.stringify(output); -} - -function getStateAsObject() { - return Object.fromEntries( - tweakables.filter(t => !(t.disabled?.(get) ?? false)).map(t => [t.name, get(t.name)]) - ); -} - -function JSONOutput() { - return html` - or click the JSON to copy that to the clipboard -
 copyText(e.target)}>${
-			JSON.stringify(getStateAsObject(), undefined, 2)
-		}
- `; -} - -function JSONInput() { - /** @type {HTMLTextAreaElement} */ - let textArea; - return html` - - - `; -} - -async function saveURL() { - let encoded = `${btoa(JSON.stringify(getStateAsObject()))}`; - encoded = encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); - location.hash = encoded; - - await navigator.clipboard.writeText(location.toString()); - alert("Text copied to clipboard"); -} - -async function copyText(element) { - await navigator.clipboard.writeText(element.innerText); - alert("Text copied to clipboard"); -} - -appLoaded = true; -paintSync(); diff --git a/templates/optimizer-template/LICENSE b/templates/optimizer-template/LICENSE deleted file mode 100644 index 6bcfa6c5..00000000 --- a/templates/optimizer-template/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Ashley Claymore - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/templates/optimizer-template/README.md b/templates/optimizer-template/README.md deleted file mode 100644 index cc396f3e..00000000 --- a/templates/optimizer-template/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Record Tuple Laboratory - -https://acutmore.github.io/record-tuple-laboratory/ - -Work in progress. Please feel free to [raise an issue](https://github.com/acutmore/record-tuple-laboratory/issues). diff --git a/templates/optimizer-template/data.js b/templates/optimizer-template/data.js deleted file mode 100644 index f34cb4df..00000000 --- a/templates/optimizer-template/data.js +++ /dev/null @@ -1,39 +0,0 @@ -import { html } from "./res/htm_preact_standalone.js"; - -/** - * # Tweakables - * name: a unique string to identify the tweakable (used in searches) - * input: a JS snippet - * output: a string if this is 'given', or an Array of design options - * disabled: a non-pure function that returns a string if this options is not currently available - * concern: a non-pure function that returns a string if there is a concern with the design - * - * @template {string|boolean} T - * @param t {{name: string, input: string, output: readonly T[], concern : ((self:T) => any), default: T, disabled?: Function }} - */ -function tweakable({name, input, output, concern, default: _default, disabled}) { - return { - name, - input, - output, - concern: (get) => concern(get(name), get), - default: _default, - disabled - }; -} - - -//???TEMPLATE-MARKER-START??? -export const metaData = { - title: "Records and Tuples Laboratory 🔬", - descriptionHtml: html`

🏗 Work in progress - raise issue

-`, - author: "Ashley Claymore", - version: "2", -}; -export const concerns = {}; -const conditions = {}; -export const givens = []; -export const tweakables = []; -export const raiseConditions = {}; -//???TEMPLATE-MARKER-END??? diff --git a/templates/optimizer-template/favicon.svg b/templates/optimizer-template/favicon.svg deleted file mode 100644 index 3e6b72c4..00000000 --- a/templates/optimizer-template/favicon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - 🔬 - diff --git a/templates/optimizer-template/github.png b/templates/optimizer-template/github.png deleted file mode 100644 index 8b25551a97921681334176ee143b41510a117d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1714 zcmaJ?X;2eq7*4oFu!ne{XxAht2qc?8LXr|_LPCfTpaBK7K$c{I0Ld=NLIOeuC;@2) zZ$K%a)k+m-s0>xHmKxL%0V&0TRzzznhgyqrIC$F)0{WwLXLrBvd*^wc_uSc%h%m9E z{W5z3f#4_!7RvAyFh6!S_*<8qJ%KOIm?#E|L=rJQq=gB5C6WLG5;c?r%V0>EmEH#X z5eSwPRa6WXBMs#$5H%GtW2go-in9p>zW@UYDNNWc^XOXZQ? z1QjEV00I#$3^1wQUJ8&-2UsjB-G|9y(LDhMNN3PM{APL4eYi{(m*ERcUnJa{R+-3^ z34^A6;U^v`8N*O6ji%S@sd{fJqD`XFIUJ5zgTe5^5nj414F(y!G&=H(f)Lgzv?>%+ zAsWD}2qhpH7>|TU`X&W6IxDNuO_vET7|j5oG&&VDr!)hUO8+0KR?nh!m<)a!?|%yG zqOwq!CWCcIhE{<$E|F|@g>nP6FoYr6C<8>D?ID9%&5J(4oSbR1I^byW*g@__U z4QsF&uJSEcFeleM3~ChjEQGbHOjsGDMbyAl(p=Ttv9RaVo8~I#js@@Y9C^_2U})yn zzSHU%6FxuY?d;&65MyR({^lU*3$z$ZllDb(o&<7d;A_`h2U+3~BJ2Hv`{W}KEU801#cv_B|9Cm!ynR{S`AMsSn z;7E=B;mb!wx$L;S>yGXG^6=&WlQn9$s?&L%Y1D8TI^MlKB1DqsEng$>f4=xYWBoPI z_S1p!sJ#d2?YI4kPA{k}Eby?F=f-J9zIc`YDl^pzjVm~9ebE?Hn?t0Nx+la|D0MB; z9)2xv1G>a1|A9kQ>~DV<=X3-4yC&n!m8-3K#P z{X@0zRuQsy$+N ziSCoLJU{Z$nQy4A4Y5UJ07$5FA~qL2%Q+cLaqDU?Lz3?=BC5;Nk6BbTmmceEaM>-Z zi>O&-dSE=%ex;vcvCOk{*JQ5^_4M z4lW7%l9IqY(z7pV(?I@@8=KPFO82)O{VDI18-*d-k$YmI^XiuPs_LuFw<^ZcD}yP5 c*NrbeloN*74g`U%%F6r~k%+>C^#XapzmV0H-2eap diff --git a/templates/optimizer-template/htm_preact_standalone.js b/templates/optimizer-template/htm_preact_standalone.js deleted file mode 100644 index ded68898..00000000 --- a/templates/optimizer-template/htm_preact_standalone.js +++ /dev/null @@ -1 +0,0 @@ -var e,n,_,t,o,r,u,l={},i=[],c=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function s(e,n){for(var _ in n)e[_]=n[_];return e}function f(e){var n=e.parentNode;n&&n.removeChild(e)}function a(n,_,t){var o,r,u,l={};for(u in _)"key"==u?o=_[u]:"ref"==u?r=_[u]:l[u]=_[u];if(arguments.length>2&&(l.children=arguments.length>3?e.call(arguments,2):t),"function"==typeof n&&null!=n.defaultProps)for(u in n.defaultProps)void 0===l[u]&&(l[u]=n.defaultProps[u]);return p(n,l,o,r,null)}function p(e,t,o,r,u){var l={type:e,props:t,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==u?++_:u};return null!=n.vnode&&n.vnode(l),l}function h(e){return e.children}function d(e,n){this.props=e,this.context=n}function v(e,n){if(null==n)return e.__?v(e.__,e.__.__k.indexOf(e)+1):null;for(var _;n0?p(m.type,m.props,m.key,null,m.__v):m)){if(m.__=_,m.__b=_.__b+1,null===(y=H[a])||y&&m.key==y.key&&m.type===y.type)H[a]=void 0;else for(d=0;d=t.__.length&&t.__.push({}),t.__[e]}function G(e){return R=1,z(ie,e)}function z(e,n,_){var t=j(L++,2);return t.t=e,t.__c||(t.__=[_?_(n):ie(void 0,n),function(e){var n=t.t(t.__[0],e);t.__[0]!==n&&(t.__=[n,t.__[1]],t.__c.setState({}))}],t.__c=N),t.__}function J(e,_){var t=j(L++,3);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__H.__h.push(t))}function K(e,_){var t=j(L++,4);!n.__s&&le(t.__H,_)&&(t.__=e,t.__H=_,N.__h.push(t))}function Q(e){return R=5,Y(function(){return{current:e}},[])}function X(e,n,_){R=6,K(function(){"function"==typeof e?e(n()):e&&(e.current=n())},null==_?_:_.concat(e))}function Y(e,n){var _=j(L++,7);return le(_.__H,n)&&(_.__=e(),_.__H=n,_.__h=e),_.__}function Z(e,n){return R=8,Y(function(){return e},n)}function ee(e){var n=N.context[e.__c],_=j(L++,9);return _.c=e,n?(null==_.__&&(_.__=!0,n.sub(N)),n.props.value):e.__}function ne(e,_){n.useDebugValue&&n.useDebugValue(_?_(e):e)}function _e(e){var n=j(L++,10),_=G();return n.__=e,N.componentDidCatch||(N.componentDidCatch=function(e){n.__&&n.__(e),_[1](e)}),[_[0],function(){_[1](void 0)}]}function te(){I.forEach(function(e){if(e.__P)try{e.__H.__h.forEach(re),e.__H.__h.forEach(ue),e.__H.__h=[]}catch(_){e.__H.__h=[],n.__e(_,e.__v)}}),I=[]}n.__b=function(e){N=null,O&&O(e)},n.__r=function(e){V&&V(e),L=0;var n=(N=e.__c).__H;n&&(n.__h.forEach(re),n.__h.forEach(ue),n.__h=[])},n.diffed=function(e){q&&q(e);var _=e.__c;_&&_.__H&&_.__H.__h.length&&(1!==I.push(_)&&W===n.requestAnimationFrame||((W=n.requestAnimationFrame)||function(e){var n,_=function(){clearTimeout(t),oe&&cancelAnimationFrame(n),setTimeout(e)},t=setTimeout(_,100);oe&&(n=requestAnimationFrame(_))})(te)),N=void 0},n.__c=function(e,_){_.some(function(e){try{e.__h.forEach(re),e.__h=e.__h.filter(function(e){return!e.__||ue(e)})}catch(t){_.some(function(e){e.__h&&(e.__h=[])}),_=[],n.__e(t,e.__v)}}),B&&B(e,_)},n.unmount=function(e){$&&$(e);var _=e.__c;if(_&&_.__H)try{_.__H.__.forEach(re)}catch(e){n.__e(e,_.__v)}};var oe="function"==typeof requestAnimationFrame;function re(e){var n=N;"function"==typeof e.__c&&e.__c(),N=n}function ue(e){var n=N;e.__c=e.__(),N=n}function le(e,n){return!e||e.length!==n.length||n.some(function(n,_){return n!==e[_]})}function ie(e,n){return"function"==typeof n?n(e):n}var ce=function(e,n,_,t){var o;n[0]=0;for(var r=1;r=5&&((o||!e&&5===t)&&(u.push(t,0,o,_),t=6),e&&(u.push(t,e,0,_),t=6)),o=""},i=0;i"===n?(t=1,o=""):o=n+o[0]:r?n===r?r="":o+=n:'"'===n||"'"===n?r=n:">"===n?(l(),t=1):t&&("="===n?(t=5,_=o,o=""):"/"===n&&(t<5||">"===e[i][c+1])?(l(),3===t&&(u=u[0]),t=u,(u=u[0]).push(2,0,t),t=0):" "===n||"\t"===n||"\n"===n||"\r"===n?(l(),t=2):o+=n),3===t&&"!--"===o&&(t=4,u=u[0])}return l(),u}(e)),n),arguments,[])).length>1?n:n[0]}.bind(a);export{a as h,fe as html,M as render,d as Component,F as createContext,G as useState,z as useReducer,J as useEffect,K as useLayoutEffect,Q as useRef,X as useImperativeHandle,Y as useMemo,Z as useCallback,ee as useContext,ne as useDebugValue,_e as useErrorBoundary}; \ No newline at end of file diff --git a/templates/optimizer-template/index.html b/templates/optimizer-template/index.html deleted file mode 100644 index 918929f4..00000000 --- a/templates/optimizer-template/index.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - Records and Tuples Laboratory 🔬 - - - - - - - - diff --git a/templates/optimizer-template/lab.js b/templates/optimizer-template/lab.js deleted file mode 100644 index ef3529b3..00000000 --- a/templates/optimizer-template/lab.js +++ /dev/null @@ -1,576 +0,0 @@ -// @ts-check -import { html, render } from "./res/htm_preact_standalone.js"; -import { metaData, givens, tweakables, concerns, raiseConditions } from "./data.js"; -import { constructOptimizerInput } from "./optimization.js"; - - -let appLoaded = false; -let paintScheduled = true; -const paintSync = () => { - if (!appLoaded) return; - render(html`<${App} />`, document.body); - paintScheduled = false; -}; -const schedulePaint = () => { - if (paintScheduled) return; - paintScheduled = true; - Promise.resolve().then(paintSync); -}; - -/** - * The state. Which selection has been made for the inputs that have a choice of outputs - * @type {Map} - */ -const selections = new Map(); - -/** @type {typeof selections['set']} */ -const setSelection = (name, output) => { - const match = tweakables.find((v) => v.name === name); - if (match) { - if (Array.isArray(match.output) && match.output.includes(/** @type {never} */ (output))) { - if (selections.get(name) !== output) { - selections.set(name, output); - if (appLoaded) { - location.hash = ""; - schedulePaint(); - } - } - } - } - return selections; -}; - - -/** @param tweakableName {string} */ -const get = (tweakableName) => selections.get(tweakableName); - -function setToDefaults() { - for (const { name, default: _default } of tweakables) { - setSelection(name, _default); - } -} -setToDefaults(); - -const design = [...givens, ...tweakables]; - -// ------------------------------------------------------------------------------------------------ - -const urlLoadingIssues = (function attemptLoadFromURL() { - const issues = []; - try { - const urlData = location.hash; - if (!urlData) { - return []; - } - const tweakableKeys = new Map(tweakables.map((t) => [t.name, t])); - let data; - try { - let b64 = urlData.slice(1); - b64 += Array(((4 - (b64.length % 4)) % 4) + 1).join('='); - b64 = b64.replace(/\-/g, '+').replace(/\_/g, '/'); - data = JSON.parse(atob(b64)); - } catch (err) { - // fallback to old url style - data = JSON.parse(decodeURI(urlData.slice(1)).replace(/%23/g, '#')); - } - for (const [key, value] of Object.entries(data)) { - if (!tweakableKeys.has(key)) { - issues.push(`Unknown item in url: '${key}'`); - } - setSelection(key, value); - tweakableKeys.delete(key); - } - for (const [unusedKey, t] of tweakableKeys) { - if (t.disabled?.()) continue; - issues.push(`'${unusedKey}' was not set by the URL`); - } - } catch (e) { - console.error(e); - } - return issues; -})(); - -function shuffle() { - location.hash = ""; - for (const { name, output } of tweakables) { - Array.isArray(output) && - setSelection(name, output[Math.floor(Math.random() * output.length)]); - } - schedulePaint(); -} - -function openPage(pageName) { - // Hide all elements with class="tabcontent" by default */ - var i, tabcontent; - tabcontent = document.getElementsByClassName("tabcontent"); - for (i = 0; i < tabcontent.length; i++) { - // @ts-ignore - tabcontent[i].style.display = "none"; - } - - // Show the specific tab content - let selectedPage = document.getElementById(pageName); - if (selectedPage !== null) { - selectedPage.style.display = "block"; - } -} - -function App() { - return html` -

- ${metaData.title} ${metaData.version == undefined ? "" : `(v${metaData.version})`} [Optimize] -

- ${ - metaData.author == undefined ? "" : html` -

- by ${metaData.author} -

- ` - } -
-
- ${metaData.descriptionHtml} -
-
- ${urlLoadingIssues.length > 0 - ? html` -
    - ${urlLoadingIssues.map((issue) => html`
  • ${issue}
  • `)} -
- ` - : false} - - - - - -
- ${experimentContent()} -
-
- ${weightsContent()} -
-
- ${optimizeContent()} -
-
- ${debugContent()} -
- `; - // https://www.w3schools.com/howto/howto_js_full_page_tabs.asp -} - -function Selection({ name, output, disabled }) { - if (Array.isArray(output)) { - return html` - - `; - } - return JSON.stringify(output); -} - -function getStateAsObject() { - return Object.fromEntries( - tweakables.filter(t => !(t.disabled?.(get) ?? false)).map(t => [t.name, get(t.name)]) - ); -} - -function JSONOutput() { - return html` - or click the JSON to copy that to the clipboard -
 copyText(e.target)}>${
-			JSON.stringify(getStateAsObject(), undefined, 2)
-		}
- `; -} - -function JSONInput() { - /** @type {HTMLTextAreaElement} */ - let textArea; - return html` - - - `; -} - -async function saveURL() { - let encoded = `${btoa(JSON.stringify(getStateAsObject()))}`; - encoded = encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); - location.hash = encoded; - - await navigator.clipboard.writeText(location.toString()); - alert("Text copied to clipboard"); -} - -async function copyText(element) { - await navigator.clipboard.writeText(element.innerText); - alert("Text copied to clipboard"); -} - -/** - * The state of currently selected weights for every concern - * @type {Map} - */ -const selectedWeights = new Map(); -function setDefaultWeights() { - Object.keys(concerns).forEach((concernName) => { - selectedWeights.set(concernName, 1.0); - }); -} -setDefaultWeights(); - -function experimentContent() { - return html` -

Experiment

- ${urlLoadingIssues.length > 0 - ? html` -
    - ${urlLoadingIssues.map((issue) => html`
  • ${issue}
  • `)} -
- ` - : false} -

- - -

- - ${design.map((c) => { - const disabled = "disabled" in c ? c.disabled?.(get) ?? false : false; - //const currentValue = get(c); - const concerns = "concern" in c ? c.concern?.(get) ?? false : false; - const attrs = disabled ? { class: "disabled", title: disabled } : {}; - return html` - - - - - - `; - })} -
${c.input}
<${Selection} ...${c} disabled=${disabled} /> - ${disabled - ? html`
- - ${disabled} -
` - : concerns - ? concerns - : ""} -
-
-
- <${JSONOutput} /> -
-
- <${JSONInput} /> -
-
- ` -} - -function weightsContent() { - return html` -

Weights

- - ${Object.keys(raiseConditions).map((concernName) => { - return html` - - - - - ` - })} -
- weightChanged(concernName)} id="${concernName}_weight"/> - ${concerns[concernName]}
- ` -} - -function weightChanged(concernName) { - let selector = document.getElementById(concernName + "_weight"); - if (selector === null) return; - - // @ts-ignore - let newValue = parseFloat(selector.value); - selectedWeights.set(concernName, newValue); -} - -function optimizeContent() { - return html` -

Optimize

- -
- ` -} - -function debugContent() { - - return html` -

Debug

-
- Raise Conditions -
- - ${Object.keys(raiseConditions).map((concernName) => { - return html` - - - - - ` - })} -
${concernName}${toStringRaiseCondition(raiseConditions[concernName])}
-
-
-
- Optimizer Test - -
-
- Objective Function -
-
-
- Variables -
-
-
- Constraints -
-
-
- Reverse Variable Map -
-
-
- Raw Optimizer Results -
-
-
-
- `; -} - -function optimizeAction() { - let outputElement = document.getElementById("debugOptimizerResult"); - - // @ts-ignore - outputElement.innerHTML = "Computing..."; - - let reversibleInput = constructOptimizerInput( - tweakables, - raiseConditions, - selectedWeights - ); - - // TODO: remove debug - { - let debugObjective = document.getElementById("debugObjectiveFunction"); - let debugVar = document.getElementById("debugVariables"); - let debugConstraints = document.getElementById("debugConstraints"); - let debugReverse = document.getElementById("debugReverseVariableMap"); - - //console.log(reversibleInput); - - // @ts-ignore - debugObjective.innerHTML = ` -

${reversibleInput.optimizerInput.objective}

- `; - - // @ts-ignore - debugVar.innerHTML = ` -

#Variables = ${reversibleInput.optimizerInput.variables.length}

- - ${reversibleInput.optimizerInput.variables.map((variableName) => { - return ``; - }).join("")} -
${variableName}
- `; - - // @ts-ignore - debugConstraints.innerHTML = ` -

#Constraints = ${reversibleInput.optimizerInput.constraints.length}

- - ${reversibleInput.optimizerInput.constraints.map((constraint) => { - return ``; - }).join("")} -
${constraint}
- `; - - // @ts-ignore - debugReverse.innerHTML = ` -

Issues

- - ${Array.from(reversibleInput.variableMeaningMap.concerns.keys()).map((key) => { - return ` - - - - - `; - }).join("")} -
${key}${reversibleInput.variableMeaningMap.concerns.get(key)}
-

Tweakables

- - ${Array.from(reversibleInput.variableMeaningMap.propositions.keys()).map((key) => { - return `` + Object.keys(reversibleInput.variableMeaningMap.propositions.get(key)).map((value) => { - return ``; - }).join("") + ""; - }).join("")} -
${key}${value}${reversibleInput.variableMeaningMap.propositions.get(key)[value]}
- `; - } - - fetch(`${metaData.scipUrl}?input=${encodeApiInput(reversibleInput.optimizerInput)}`) - .then(response => response.json()) - .then(data => { - // @ts-ignore - outputElement.innerHTML = "YAY"; - switch (data.status) { - case "error": - throw new Error("An Error occurred while solving the request."); - case "success": - showOptimizerResults(JSON.parse(data.result), reversibleInput.variableMeaningMap); - break; - } - }) - .catch(error => { - // @ts-ignore - outputElement.innerHTML = "ERROR"; - console.log(error) - }) -} - -function showOptimizerResults(result, variableMeaningMap) { - // console.log(result) - - { // TODO: Remove debug - let outputElement = document.getElementById("debugOptimizerResult"); - let representation = ` - - - - - - ${Object.keys(result).map((variable) => { - return ` - - - - - ` - }).join("") - } -
VariableValue
${variable}${result[variable]}
- `; - // @ts-ignore - outputElement.innerHTML = representation; - } - - let outputElement = document.getElementById("optimizeResults"); - - // @ts-ignore - outputElement.innerHTML = ` -

Settings

- ${generateOptimizedPropositionSettings(result, variableMeaningMap)} -

Raised Issues

- ${generateOptimizedRaisedConcerns(result, variableMeaningMap)} - `; -} - -function generateOptimizedPropositionSettings(result, variableMeaningMap) { - return ` - - - - - - - ${ - tweakables.map((tweakable) => { - let propositionName = tweakable.name; - let propositionExpression = tweakable.input; - let propositionValueVariables = variableMeaningMap.propositions.get(propositionName); - - let propositionValue = Object.keys(propositionValueVariables) - .filter((value) => result[propositionValueVariables[value]] == 1)[0]; - - return ` - - - - - - `; - }).join("") - } -
Tweakable IDTweakable ExpressionValue
${propositionName}
${propositionExpression}
${propositionValue}
- `; -} - - -function generateOptimizedRaisedConcerns(result, variableMeaningMap) { - return ` - - ${ - Object.keys(concerns) - .filter((concernName) => result[variableMeaningMap.concerns.get(concernName)] == 1) - .map((concernName) => { - return `` - }).join("")} -
${concernName}
- `; -} - -function encodeApiInput(jsonObject) { - // TODO: base 64 encode - //return btoa(JSON.stringify(jsonObject)) - return encodeURIComponent(JSON.stringify(jsonObject)); -} - -function toStringRaiseCondition(condition) { - switch (condition.type) { - case "statement": - return `${condition.proposition} is ${condition.value}`; - case "not": - return `not (${toStringRaiseCondition(condition.inner)})`; - case "or": - return `(${toStringRaiseCondition(condition.left)}) or (${toStringRaiseCondition(condition.right)})`; - case "and": - return `(${toStringRaiseCondition(condition.left)}) and (${toStringRaiseCondition(condition.right)})`; - } -} - -appLoaded = true; -paintSync(); - -// Get the element with id="defaultOpen" and click on it -let defaulPageButton = document.getElementById("defaultOpen"); -if (defaulPageButton !== null) { - defaulPageButton.click(); -} - diff --git a/templates/optimizer-template/optimization.js b/templates/optimizer-template/optimization.js deleted file mode 100644 index 3e158f00..00000000 --- a/templates/optimizer-template/optimization.js +++ /dev/null @@ -1,224 +0,0 @@ -/** - * @typedef {Object} OptimizerInput - * @property {string} objective - * @property {Array} variables - * @property {Array} constraints - */ - - -/** - * @typedef {Object} VariableMeaningMap - * @property {Map} concerns mapping concern ids to variable names - * @property {Map} propositions maps proposition ids to objects with fields for every possible value with their variable - */ - -/** - * @typedef {Object} ReversibleOptimizerInput - * @property {OptimizerInput} optimizerInput - * @property {VariableMeaningMap} variableMeaningMap - */ - -/** - * - * @param {string} variablePrefix - * @param {Generator} indexGenerator - * @yields {string} the next variable name - */ -function* indexedVariableNameGenerator(variablePrefix, indexGenerator) { - for (const index of indexGenerator) { - yield variablePrefix + index; - } - return; -} - -/** - * - * @param {integer} start - * @param {integer} step - * @yields {integer} - */ -function* infiniteRangeGenerator(start, step=1) { - let index = start; - while (true) { - yield index; - index += step; - } -} - -/** - * @param {OptimizerInput} input - * @param {string} variablePrefix - * @yields {string} - */ -function* standardVariableGenerator(input, variablePrefix) { - let varGen = indexedVariableNameGenerator(variablePrefix, infiniteRangeGenerator(1, 1)); - - for (const variable of varGen) { - input.variables.push(variable); - yield variable; - } -} - -/** - * @param {Map} weights - * @param {Array} tweakables - * @param {Object} raiseConditions - * @returns {ReversibleOptimizerInput} - */ -export function constructOptimizerInput(tweakables, raiseConditions, weights) { - let input = { - objective: "", - variables: [], - constraints: [] - } - - let map = { - concerns: new Map(), - propositions: new Map() - } - - extractBasePropositionValues(input, map, tweakables); - extractRaiseVariables(input, map, weights); - constructConstraintsForTweakableValues(input, map, tweakables); - constructConstraintsForAllRaises(input, map, raiseConditions); - constructObjectiveFunction(input, map, weights); - - return { - optimizerInput: input, - variableMeaningMap: map - }; -} - - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Map} weights - */ -function extractRaiseVariables(input, map, weights) { - let varGen = standardVariableGenerator(input, 'r'); - - weights.forEach((value, key) => { - let variableName = varGen.next().value; - - map.concerns.set(key, variableName); - }) -} - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Map} weights - */ -function constructObjectiveFunction(input, map, weights) { - input.objective = Array.from(weights.keys()).map((key) => { - if (weights.get(key) === 1) return map.concerns.get(key); - - return `${weights.get(key)}*${map.concerns.get(key)}`; - }).join("+"); -} - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Array} tweakables - */ -function extractBasePropositionValues(input, map, tweakables) { - let varGen = standardVariableGenerator(input, 'x'); - - tweakables.forEach((tweakable) => { - let valueVariables = {}; - tweakable.output.forEach((value) => { - let variableName = varGen.next().value; - - valueVariables[value] = variableName; - }); - map.propositions.set(tweakable.name, valueVariables); - }); -} - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Array} tweakables - */ -function constructConstraintsForTweakableValues(input, map, tweakables) { - tweakables.forEach((tweakable) => { - let sum = Object.keys(map.propositions.get(tweakable.name)) - .map((value) => map.propositions.get(tweakable.name)[value]) - .join("+"); - - input.constraints.push(sum + " == 1"); - }); -} - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Object} raiseConditions - */ -function constructConstraintsForAllRaises(input, map, raiseConditions) { - let varGen = standardVariableGenerator(input, 'z'); - - Object.keys(raiseConditions).forEach((concernName) => { - let finalVariable = constructRaiseConstraints(input, map, raiseConditions[concernName], varGen); - - // This final constraint connects the raise variable r_i to the final variable z_j - // TODO: Remove unnecessary final variable and connect directly to raise variable - let raiseVariable = map.concerns.get(concernName); - - input.constraints.push(`${finalVariable}-${raiseVariable} == 0`); - }); -} - -/** - * - * @param {OptimizerInput} input - * @param {VariableMeaningMap} map - * @param {Object} condition - * @param {Generator} varGen - * @returns {string} the variable that represents the truth value of the condition - */ -function constructRaiseConstraints(input, map, condition, varGen) { - switch (condition.type) { - case "or": { - let z = varGen.next().value; - let a = constructRaiseConstraints(input, map, condition.left, varGen); - let b = constructRaiseConstraints(input, map, condition.right, varGen); - - input.constraints.push(`${z}-${a}-${b} <= 0`); - input.constraints.push(`${a}-${z} <= 0`); - input.constraints.push(`${b}-${z} <= 0`); - - return z; - } - case "and": { - let z = varGen.next().value; - let a = constructRaiseConstraints(input, map, condition.left, varGen); - let b = constructRaiseConstraints(input, map, condition.right, varGen); - - input.constraints.push(`${a}+${b}-${z} <= 1`); - input.constraints.push(`${z}-${a} <= 0`); - input.constraints.push(`${z}-${b} <= 0`); - - return z; - } - case "not": { - let z = varGen.next().value; - let a = constructRaiseConstraints(input, map, condition.inner, varGen); - - input.constraints.push(`-${a}-${z} <= -1`); - input.constraints.push(`${a}+${z} <= 1`); - - return z; - } - case "statement": { - return map.propositions.get(condition.proposition)[condition.value]; - } - } -} \ No newline at end of file From 48b97968fa1a48a43520dd8ba7939121cc1fdd9d Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 16:11:45 +0100 Subject: [PATCH 08/36] feat(lib): cleanup, implement serializable intermediate format --- lib/lab/ast.ts | 112 +++++++++++++++++++++++++ lib/lab/index.ts | 99 ++++++++++++++++++++++ lib/language/jspl-validator.ts | 149 ++------------------------------- lib/language/utils.ts | 137 ++++++++++++++++++++++++++++++ 4 files changed, 357 insertions(+), 140 deletions(-) create mode 100644 lib/lab/ast.ts create mode 100644 lib/lab/index.ts create mode 100644 lib/language/utils.ts diff --git a/lib/lab/ast.ts b/lib/lab/ast.ts new file mode 100644 index 00000000..7b13c0a5 --- /dev/null +++ b/lib/lab/ast.ts @@ -0,0 +1,112 @@ +import { + AndExpression, + Group as GroupExpression, + Negation as NegationExpression, + OrExpression, + PropositionalExpression, + Statement as StatementExpression, +} from "../language/generated/ast"; +import { LogicalExpressionExtractor } from "../language/utils"; + +export interface Binary +{ + left: AstNode; + right: AstNode; + op: "or" | "and"; +} + +export interface Lookup +{ + left: string; + $left: "condition" | "proposition"; + right: string | boolean; + op: "eq" | "neq"; +} + +export interface Unary +{ + value: AstNode; + op: "not"; +} + +export interface Group +{ + inner: AstNode; +} + +export type AstNode = Binary | Unary | Group | Lookup; + +export const buildAst: LogicalExpressionExtractor = { + fromOrExpression: function(expression: OrExpression) + { + return { + left: buildAst.fromExpression(expression.left), + right: buildAst.fromExpression(expression.right), + op: "or", + }; + }, + fromAndExpression: function(expression: AndExpression) + { + return { + left: buildAst.fromExpression(expression.left), + right: buildAst.fromExpression(expression.right), + op: "and", + }; + }, + fromNegation: function(expression: NegationExpression) + { + return { + value: buildAst.fromExpression(expression.inner), + op: "not", + }; + }, + fromGroup: function(expression: GroupExpression) + { + return { inner: buildAst.fromExpression(expression.inner) }; + }, + fromStatement: function(expression: StatementExpression) + { + const reference = expression.reference.ref; + + if (!reference) + { + throw "oh no!"; + } + + const op = expression.negation ? "neq" : "eq"; + + switch (reference.$type) + { + case "Condition": + return { + op, + left: reference.name, + $left: "condition", + right: expression.value, + }; + case "Proposition": + return { + op, + left: reference.name, + $left: "proposition", + right: expression.value, + }; + } + }, + fromExpression: function(expression: PropositionalExpression) + { + switch (expression.$type) + { + case "OrExpression": + return buildAst.fromOrExpression(expression as OrExpression); + case "AndExpression": + return buildAst.fromAndExpression(expression as AndExpression); + case "Negation": + return buildAst.fromNegation(expression as NegationExpression); + case "Group": + return buildAst.fromGroup(expression as GroupExpression); + case "Statement": + return buildAst.fromStatement(expression as StatementExpression); + } + }, +}; diff --git a/lib/lab/index.ts b/lib/lab/index.ts new file mode 100644 index 00000000..ec27bbfb --- /dev/null +++ b/lib/lab/index.ts @@ -0,0 +1,99 @@ +import { Concern, Model } from "../language/generated/ast"; + +import { AstNode, buildAst } from "./ast"; +import { extractModel } from "../model"; + +export type Value = string | boolean; + +export interface Given +{ + value: Value; + expression: string; +} + +export interface Condition +{ + name: string; + value: AstNode; +} + +export interface TweakableConcern +{ + value: Value; + raises: { name?: string; expression?: AstNode }[]; +} + +export interface Tweakable +{ + name: string; + expression: string; + output: Value[]; + default: Value; + concerns: TweakableConcern[]; +} + +export interface Laboratory +{ + title?: string; + description?: string; + + version?: string; + authors?: string[]; + + givens: Given[]; + concerns: Concern[]; + + conditions: Condition[]; + tweakables: Tweakable[]; +} + +// TODO: Cleanup +export function createLab({ laboratory, concerns, propositions, conditions }: Model): Laboratory +{ + return { + title: laboratory?.titles[0] ?? "Unknown", + authors: laboratory?.authors, + description: laboratory?.descriptions[0].contents ?? "Unknown", + version: laboratory?.versions[0] ?? "v1", + concerns, + givens: propositions.filter(x => x.valueClauses.length === 1).map(x => + { + const val = x.valueClauses[0]; + return { expression: x.expression, value: `${val}` }; + }), + tweakables: propositions.filter(x => x.valueClauses.length !== 1).map(x => + { + return { + name: x.name, + expression: x.expression, + output: x.valueClauses.map(i => i.value), + default: x.valueClauses.find(y => y.default)!.value, + concerns: x.valueClauses.map(i => ({ + value: i.value, + raises: i.raises.map(r => ({ + name: r.concern.ref?.name, + expression: r.condition?.expression + ? buildAst.fromExpression(r.condition.expression) + : undefined, + })), + })), + }; + }), + conditions: conditions.map(cond => ({ + name: cond.name, + value: buildAst.fromExpression(cond.condition.expression), + })), + }; +} + +export async function parseLab(input: string) +{ + const model = await extractModel(input); + + if (model.isErr()) + { + throw model.error; + } + + return createLab(model.value); +} diff --git a/lib/language/jspl-validator.ts b/lib/language/jspl-validator.ts index 0dab0075..0cf3ebe7 100644 --- a/lib/language/jspl-validator.ts +++ b/lib/language/jspl-validator.ts @@ -1,140 +1,9 @@ import type { ValidationAcceptor, ValidationChecks } from "langium"; -import type { JSPLFormatServices } from "./jspl-format-module"; - -import { - AndExpression, - Concern, - Condition, - Group, - type JSPLAstType, - LaboratoryInformation, - Model, - Negation, - OrExpression, - Proposition, - PropositionalExpression, - Referenceable, - Statement, -} from "./generated/ast"; - -const extractReferenceables = { - from: function(expression: PropositionalExpression) - { - const output = new Set(); - extractReferenceables.fromExpression(expression, output); - return output; - }, - fromExpression: function(expression: PropositionalExpression, output: Set) - { - if (expression === undefined) - { - return; - } - switch (expression.$type) - { - case "OrExpression": - extractReferenceables.fromOrExpression(expression as OrExpression, output); - break; - case "AndExpression": - extractReferenceables.fromAndExpression(expression as AndExpression, output); - break; - case "Negation": - extractReferenceables.fromNegation(expression as Negation, output); - break; - case "Group": - extractReferenceables.fromGroup(expression as Group, output); - break; - case "Statement": - extractReferenceables.fromStatement(expression as Statement, output); - break; - } - }, - fromOrExpression: function(expression: OrExpression, output: Set) - { - extractReferenceables.fromExpression(expression.left, output); - extractReferenceables.fromExpression(expression.right, output); - }, - fromAndExpression: function(expression: AndExpression, output: Set) - { - extractReferenceables.fromExpression(expression.left, output); - extractReferenceables.fromExpression(expression.right, output); - }, - fromNegation: function(expression: Negation, output: Set) - { - extractReferenceables.fromExpression(expression.inner, output); - }, - fromGroup: function(expression: Group, output: Set) - { - extractReferenceables.fromExpression(expression.inner, output); - }, - fromStatement: function(statement: Statement, output: Set) - { - const { ref } = statement.reference; +import { type JSPLFormatServices } from "./jspl-format-module"; +import { extractReferenceables, getAllUsedConcerns, getAllUsedReferenceables } from "./utils"; +import { Condition, type JSPLAstType, LaboratoryInformation, Model, Proposition, Statement } from "./generated/ast"; - if (ref === undefined) - { - return; - } - - output.add(ref); - }, -}; - -export function getAllUsedConcerns(model: Model) -{ - const result = new Set(); - - for (const proposition of model.propositions) - { - for (const clause of proposition.valueClauses) - { - // TODO: Can concern be undefined? - clause.raises.map(x => x.concern?.ref) - .filter(x => x !== undefined) - .forEach(result.add); - } - } - - return result; -} - -export function getAllUsedReferenceables(model: Model) -{ - const result = new Set(); - - for (const prop of model.propositions) - { - for (const clause of prop.valueClauses) - { - for (const concern of clause.raises) - { - if (!concern.condition) - { - continue; - } - - extractReferenceables.from(concern.condition.expression).forEach(result.add); - } - } - - if (!prop.disable) - { - continue; - } - - for (const stmt of prop.disable.statements) - { - extractReferenceables.from(stmt.condition.expression).forEach(result.add); - } - } - - return result; -} - -/** - * Register custom validation checks. - */ export function registerValidationChecks({ validation }: JSPLFormatServices) { const { ValidationRegistry: registry, JSPLFormatValidator: validator } = validation; @@ -272,7 +141,7 @@ export class JSPLFormatValidator }); } - if (defaults.length !== 1) + if (defaults.length === 1) { return; } @@ -332,23 +201,23 @@ export class JSPLFormatValidator if (statement.reference === undefined) return; if (statement.reference.ref === undefined) return; - // Extract referenced referenceable const referenceable = statement.reference.ref; const value = statement.value; - if (referenceable.$type === "Condition") + if (referenceable.$type === "Condition" && typeof value !== "boolean") { - if (typeof value === "boolean") return; - accept("error", "Stated value is not a valid value of the referenced object.", { + return accept("error", "Stated value is not a valid value of the referenced object.", { node: statement, property: "value", }); + } else if (referenceable.$type === "Condition") + { return; } const proposition = referenceable as Proposition; - if (!proposition.valueClauses || !proposition.valueClauses.some(x => x.value === value)) + if (!proposition.valueClauses || proposition.valueClauses.some(x => x.value === value)) { return; } diff --git a/lib/language/utils.ts b/lib/language/utils.ts new file mode 100644 index 00000000..99c45424 --- /dev/null +++ b/lib/language/utils.ts @@ -0,0 +1,137 @@ +import { + AndExpression, + Concern, + Group, + Model, + Negation, + OrExpression, + PropositionalExpression, + Referenceable, + Statement, +} from "./generated/ast"; + +export type LogicalExpressionExtractor = { + fromExpression: (expr: PropositionalExpression, ...state: Ts) => T; + fromOrExpression: (expr: OrExpression, ...state: Ts) => T; + fromAndExpression: (expr: AndExpression, ...state: Ts) => T; + fromNegation: (expr: Negation, ...state: Ts) => T; + fromGroup: (expr: Group, ...state: Ts) => T; + fromStatement: (expr: Statement, ...state: Ts) => T; +}; + +export const extractReferenceables: LogicalExpressionExtractor]> & { + from: (expr: PropositionalExpression) => Set; +} = { + from: (expression: PropositionalExpression) => + { + const output = new Set(); + extractReferenceables.fromExpression(expression, output); + return output; + }, + fromExpression: (expression: PropositionalExpression, output: Set) => + { + if (expression === undefined) + { + return; + } + + switch (expression.$type) + { + case "OrExpression": + extractReferenceables.fromOrExpression(expression as OrExpression, output); + break; + case "AndExpression": + extractReferenceables.fromAndExpression(expression as AndExpression, output); + break; + case "Negation": + extractReferenceables.fromNegation(expression as Negation, output); + break; + case "Group": + extractReferenceables.fromGroup(expression as Group, output); + break; + case "Statement": + extractReferenceables.fromStatement(expression as Statement, output); + break; + } + }, + fromOrExpression: (expression: OrExpression, output: Set) => + { + extractReferenceables.fromExpression(expression.left, output); + extractReferenceables.fromExpression(expression.right, output); + }, + fromAndExpression: (expression: AndExpression, output: Set) => + { + extractReferenceables.fromExpression(expression.left, output); + extractReferenceables.fromExpression(expression.right, output); + }, + fromNegation: (expression: Negation, output: Set) => + { + extractReferenceables.fromExpression(expression.inner, output); + }, + fromGroup: (expression: Group, output: Set) => + { + extractReferenceables.fromExpression(expression.inner, output); + }, + fromStatement: (statement: Statement, output: Set) => + { + const { ref } = statement.reference; + + if (ref === undefined) + { + return; + } + + output.add(ref); + }, +}; + +export function getAllUsedConcerns(model: Model) +{ + const result = new Set(); + + for (const proposition of model.propositions) + { + for (const clause of proposition.valueClauses) + { + // TODO: Can concern be undefined? + clause.raises.map(x => x.concern?.ref) + .filter(x => x !== undefined) + .forEach(item => result.add(item)); + } + } + + return result; +} + +export function getAllUsedReferenceables(model: Model) +{ + const result = new Set(); + + for (const prop of model.propositions) + { + for (const clause of prop.valueClauses) + { + for (const concern of clause.raises) + { + if (!concern.condition) + { + continue; + } + + extractReferenceables.from(concern.condition.expression).forEach(item => result.add(item)); + } + } + + if (!prop.disable) + { + continue; + } + + for (const stmt of prop.disable.statements) + { + extractReferenceables.from(stmt.condition.expression).forEach(item => result.add(item)); + } + } + + return result; +} From 61b484c5da34fe6b6f12f7573c403dedcbaa366e Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 31 Oct 2025 16:20:18 +0100 Subject: [PATCH 09/36] refactor(lib): dont throw --- lib/lab/ast.ts | 8 +------- lib/lab/index.ts | 11 +++-------- lib/model.ts | 6 ++---- lib/utils.ts | 4 ++++ 4 files changed, 10 insertions(+), 19 deletions(-) create mode 100644 lib/utils.ts diff --git a/lib/lab/ast.ts b/lib/lab/ast.ts index 7b13c0a5..b0f1a05a 100644 --- a/lib/lab/ast.ts +++ b/lib/lab/ast.ts @@ -66,13 +66,7 @@ export const buildAst: LogicalExpressionExtractor = { }, fromStatement: function(expression: StatementExpression) { - const reference = expression.reference.ref; - - if (!reference) - { - throw "oh no!"; - } - + const reference = expression.reference.ref!; const op = expression.negation ? "neq" : "eq"; switch (reference.$type) diff --git a/lib/lab/index.ts b/lib/lab/index.ts index ec27bbfb..c38befd1 100644 --- a/lib/lab/index.ts +++ b/lib/lab/index.ts @@ -2,6 +2,7 @@ import { Concern, Model } from "../language/generated/ast"; import { AstNode, buildAst } from "./ast"; import { extractModel } from "../model"; +import { Res } from "../utils"; export type Value = string | boolean; @@ -86,14 +87,8 @@ export function createLab({ laboratory, concerns, propositions, conditions }: Mo }; } -export async function parseLab(input: string) +export async function parseLab(input: string): Promise> { const model = await extractModel(input); - - if (model.isErr()) - { - throw model.error; - } - - return createLab(model.value); + return model.map(createLab); } diff --git a/lib/model.ts b/lib/model.ts index 1e72c4fb..63414f4a 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -1,12 +1,10 @@ -import { Diagnostic } from "vscode-languageserver"; import { AstNode, EmptyFileSystem, LangiumDocument, LangiumServices, URI } from "langium"; import { type Model } from "./language/generated/ast"; import { createJSPLFormatServices } from "./language/jspl-format-module"; -import { err, ok, Result } from "neverthrow"; - -type Res = Result; +import { Res } from "./utils"; +import { err, ok } from "neverthrow"; export async function extractDocument( content: string, diff --git a/lib/utils.ts b/lib/utils.ts new file mode 100644 index 00000000..751086bd --- /dev/null +++ b/lib/utils.ts @@ -0,0 +1,4 @@ +import { Result } from "neverthrow"; +import { Diagnostic } from "vscode-languageserver"; + +export type Res = Result; From 02c0d4a6290d2335b57b28f5fa3689feee3af9c0 Mon Sep 17 00:00:00 2001 From: Curve Date: Sun, 2 Nov 2025 01:31:28 +0100 Subject: [PATCH 10/36] refactor(lib): restructure ast, serializer `disable` --- lib/lab/ast.ts | 58 ++++++++++++++++++++++++++++++++---------------- lib/lab/index.ts | 12 ++++++---- lib/model.ts | 25 ++++++++++++++++----- 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/lib/lab/ast.ts b/lib/lab/ast.ts index b0f1a05a..4ffda6ea 100644 --- a/lib/lab/ast.ts +++ b/lib/lab/ast.ts @@ -1,3 +1,4 @@ +import { Value } from "."; import { AndExpression, Group as GroupExpression, @@ -10,61 +11,72 @@ import { LogicalExpressionExtractor } from "../language/utils"; export interface Binary { + $type: "binary"; left: AstNode; right: AstNode; - op: "or" | "and"; + op: "or" | "and" | "eq" | "neq"; } export interface Lookup { - left: string; - $left: "condition" | "proposition"; - right: string | boolean; - op: "eq" | "neq"; + $type: "lookup"; + what: string; + type: "condition" | "proposition"; } export interface Unary { + $type: "unary"; value: AstNode; op: "not"; } export interface Group { + $type: "group"; inner: AstNode; } -export type AstNode = Binary | Unary | Group | Lookup; +export interface Literal +{ + $type: "literal"; + value: Value; +} + +export type AstNode = Binary | Unary | Group | Lookup | Literal; export const buildAst: LogicalExpressionExtractor = { - fromOrExpression: function(expression: OrExpression) + fromOrExpression: (expression: OrExpression) => { return { left: buildAst.fromExpression(expression.left), right: buildAst.fromExpression(expression.right), op: "or", + $type: "binary", }; }, - fromAndExpression: function(expression: AndExpression) + fromAndExpression: (expression: AndExpression) => { return { left: buildAst.fromExpression(expression.left), right: buildAst.fromExpression(expression.right), op: "and", + $type: "binary", }; }, - fromNegation: function(expression: NegationExpression) + fromNegation: (expression: NegationExpression) => { return { value: buildAst.fromExpression(expression.inner), op: "not", + $type: "unary", }; }, - fromGroup: function(expression: GroupExpression) + fromGroup: (expression: GroupExpression) => { - return { inner: buildAst.fromExpression(expression.inner) }; + return { inner: buildAst.fromExpression(expression.inner), $type: "group" }; }, - fromStatement: function(expression: StatementExpression) + fromStatement: (expression: StatementExpression) => { const reference = expression.reference.ref!; const op = expression.negation ? "neq" : "eq"; @@ -74,20 +86,28 @@ export const buildAst: LogicalExpressionExtractor = { case "Condition": return { op, - left: reference.name, - $left: "condition", - right: expression.value, + left: { + $type: "lookup", + what: reference.name, + type: "condition", + }, + right: { $type: "literal", value: expression.value }, + $type: "binary", }; case "Proposition": return { op, - left: reference.name, - $left: "proposition", - right: expression.value, + left: { + $type: "lookup", + what: reference.name, + type: "proposition", + }, + right: { $type: "literal", value: expression.value }, + $type: "binary", }; } }, - fromExpression: function(expression: PropositionalExpression) + fromExpression: (expression: PropositionalExpression) => { switch (expression.$type) { diff --git a/lib/lab/index.ts b/lib/lab/index.ts index c38befd1..ab0807f2 100644 --- a/lib/lab/index.ts +++ b/lib/lab/index.ts @@ -21,7 +21,7 @@ export interface Condition export interface TweakableConcern { value: Value; - raises: { name?: string; expression?: AstNode }[]; + raises: { name: string; expression?: AstNode }[]; } export interface Tweakable @@ -30,6 +30,7 @@ export interface Tweakable expression: string; output: Value[]; default: Value; + disable?: AstNode[]; concerns: TweakableConcern[]; } @@ -59,8 +60,8 @@ export function createLab({ laboratory, concerns, propositions, conditions }: Mo concerns, givens: propositions.filter(x => x.valueClauses.length === 1).map(x => { - const val = x.valueClauses[0]; - return { expression: x.expression, value: `${val}` }; + const { value } = x.valueClauses[0]; + return { expression: x.expression, value }; }), tweakables: propositions.filter(x => x.valueClauses.length !== 1).map(x => { @@ -72,12 +73,15 @@ export function createLab({ laboratory, concerns, propositions, conditions }: Mo concerns: x.valueClauses.map(i => ({ value: i.value, raises: i.raises.map(r => ({ - name: r.concern.ref?.name, + name: r.concern.ref!.name, expression: r.condition?.expression ? buildAst.fromExpression(r.condition.expression) : undefined, })), })), + disable: x.disable + ? x.disable.statements.map(stmt => buildAst.fromExpression(stmt.condition.expression)) + : undefined, }; }), conditions: conditions.map(cond => ({ diff --git a/lib/model.ts b/lib/model.ts index 63414f4a..3625001c 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -7,11 +7,11 @@ import { Res } from "./utils"; import { err, ok } from "neverthrow"; export async function extractDocument( - content: string, + input: string, services: LangiumServices, ): Promise>> { - const document = services.shared.workspace.LangiumDocumentFactory.fromString(content, URI.file("tmp.jspl")); + const document = services.shared.workspace.LangiumDocumentFactory.fromString(input, URI.file("tmp.jspl")); await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); @@ -23,13 +23,26 @@ export async function extractDocument( return ok(document); } -export async function extractAstNode(fileName: string, services: LangiumServices): Promise> +export async function extractAstNode(input: string, services: LangiumServices): Promise> { - return (await extractDocument(fileName, services)).andThen(doc => ok(doc.parseResult?.value as T)); + const document = await extractDocument(input, services); + + if (document.isErr()) + { + return err(document.error); + } + + const { parseResult } = document.value; + + if (!parseResult) + { + return err([]); + } + + return ok(parseResult.value as T); } export function extractModel(input: string): Promise> { - const services = createJSPLFormatServices(EmptyFileSystem).JSPLFormat; - return extractAstNode(input, services); + return extractAstNode(input, createJSPLFormatServices(EmptyFileSystem).JSPLFormat); } From 8bae1335642ecea980b79cd32053894e28c783ac Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:28:46 +0100 Subject: [PATCH 11/36] refactor(lib): remove formatting, expect markdown --- lib/language/jspl-converter.ts | 17 +++++++++++++++++ lib/language/jspl-format-module.ts | 4 ++++ lib/language/jspl-validator.ts | 4 ---- lib/language/jspl.langium | 14 ++------------ 4 files changed, 23 insertions(+), 16 deletions(-) create mode 100644 lib/language/jspl-converter.ts diff --git a/lib/language/jspl-converter.ts b/lib/language/jspl-converter.ts new file mode 100644 index 00000000..1a29289e --- /dev/null +++ b/lib/language/jspl-converter.ts @@ -0,0 +1,17 @@ +import { CstNode, DefaultValueConverter } from "langium"; + +export class JSPLValueConverter extends DefaultValueConverter +{ + convert(input: string, cstNode: CstNode) + { + const rtn = super.convert(input, cstNode); + + // Trim (multiline) strings to ensure proper Markdown formatting + if (typeof rtn === "string") + { + return rtn.split("\n").map(item => item.trim()).join("\n"); + } + + return rtn; + } +} diff --git a/lib/language/jspl-format-module.ts b/lib/language/jspl-format-module.ts index 85077066..63f70dff 100644 --- a/lib/language/jspl-format-module.ts +++ b/lib/language/jspl-format-module.ts @@ -11,6 +11,7 @@ import { import { JSPLFormatGeneratedModule, JSPLGeneratedSharedModule } from "./generated/module"; import { JSPLFormatValidator, registerValidationChecks } from "./jspl-validator"; +import { JSPLValueConverter } from "./jspl-converter"; /** * Declaration of custom services - add your own service classes here. @@ -41,6 +42,9 @@ export const JSPLFormatModule: Module< validation: { JSPLFormatValidator: () => new JSPLFormatValidator(), }, + parser: { + ValueConverter: () => new JSPLValueConverter(), + }, }; /** diff --git a/lib/language/jspl-validator.ts b/lib/language/jspl-validator.ts index 0cf3ebe7..6c192562 100644 --- a/lib/language/jspl-validator.ts +++ b/lib/language/jspl-validator.ts @@ -179,10 +179,6 @@ export class JSPLFormatValidator { accept("error", "Multiple icons for one laboratory are not allowed.", { node: information }); } - if (information.formats.length > 1) - { - accept("error", "Multiple default formats for one laboratory are not allowed.", { node: information }); - } if (information.authors.length > 1) { accept("error", "Multiple authors for one laboratory are not allowed.", { node: information }); diff --git a/lib/language/jspl.langium b/lib/language/jspl.langium index 0a1c7b3a..1b0a9dce 100644 --- a/lib/language/jspl.langium +++ b/lib/language/jspl.langium @@ -14,28 +14,19 @@ entry Model: // Terminals terminal BOOLEAN returns boolean: /True|False|true|false/; -terminal ML_STRING_FORMAT returns string: /MD|HTML/; terminal ID: /[_a-zA-Z][\w_]*/; -//terminal INT returns number: /[0-9]+/; -//terminal CODE_STRING: /`(\\.|[^`\\])*`/; terminal STRING: /"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/; hidden terminal WS: /\s+/; hidden terminal ML_COMMENT: /\/\*[\s\S]*?\*\//; hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; -FormattedString: - (format=ML_STRING_FORMAT)? contents=STRING -; - - LaboratoryInformation: "laboratory" "{" ( // allow only one field to be used multiple times via validators ("title" titles+=STRING) - | ("description" descriptions+=FormattedString) + | ("description" descriptions+=STRING) | ("icon" icons+=STRING) - | ("format" formats+=ML_STRING_FORMAT) | ("author" authors+=STRING) | ("version" versions+=STRING) )* @@ -46,7 +37,7 @@ LaboratoryInformation: Concern: "issue" name=ID "{" "summary" summary=STRING - "description" description=FormattedString + "description" description=STRING "}" ; @@ -100,7 +91,6 @@ DisableClause: Proposition: "tweakable" name=ID "{" "expression" expression=STRING - //"default" valueDescription+=ValueDescription // how can I get this value to also show up in the list of ALL value descriptions? (valueClauses+=ValueClause)+ (disable=DisableClause)? "}" From fc413cdece4541e609ba6969b838a70309ca29f6 Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:32:04 +0100 Subject: [PATCH 12/36] feat: initial web frontend --- index.html | 16 + lib/lab/ast.ts | 126 -- lib/lab/index.ts | 98 - lib/model.ts | 2 +- package-lock.json | 2534 ---------------------- package.json | 174 +- pnpm-lock.yaml | 3857 ++++++++++++++++++++++++++++++++++ postcss.config.cjs | 14 + src/components/lab.tsx | 149 ++ src/components/markdown.tsx | 17 + src/main.tsx | 45 + src/pages/editor.tsx | 44 + src/parser/index.ts | 139 ++ src/parser/utils.ts | 89 + src/style/index.css | 17 + src/utils/monaco.ts | 103 + src/vite-env.d.ts | 1 + src/worker/specalt-server.ts | 19 + tsconfig.json | 36 +- tsconfig.node.json | 10 + vite.config.ts | 19 + 21 files changed, 4610 insertions(+), 2899 deletions(-) create mode 100644 index.html delete mode 100644 lib/lab/ast.ts delete mode 100644 lib/lab/index.ts delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.cjs create mode 100644 src/components/lab.tsx create mode 100644 src/components/markdown.tsx create mode 100644 src/main.tsx create mode 100644 src/pages/editor.tsx create mode 100644 src/parser/index.ts create mode 100644 src/parser/utils.ts create mode 100644 src/style/index.css create mode 100644 src/utils/monaco.ts create mode 100644 src/vite-env.d.ts create mode 100644 src/worker/specalt-server.ts create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/index.html b/index.html new file mode 100644 index 00000000..8db6e0f0 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + + + SpecAlt + + +
+ + + diff --git a/lib/lab/ast.ts b/lib/lab/ast.ts deleted file mode 100644 index 4ffda6ea..00000000 --- a/lib/lab/ast.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Value } from "."; -import { - AndExpression, - Group as GroupExpression, - Negation as NegationExpression, - OrExpression, - PropositionalExpression, - Statement as StatementExpression, -} from "../language/generated/ast"; -import { LogicalExpressionExtractor } from "../language/utils"; - -export interface Binary -{ - $type: "binary"; - left: AstNode; - right: AstNode; - op: "or" | "and" | "eq" | "neq"; -} - -export interface Lookup -{ - $type: "lookup"; - what: string; - type: "condition" | "proposition"; -} - -export interface Unary -{ - $type: "unary"; - value: AstNode; - op: "not"; -} - -export interface Group -{ - $type: "group"; - inner: AstNode; -} - -export interface Literal -{ - $type: "literal"; - value: Value; -} - -export type AstNode = Binary | Unary | Group | Lookup | Literal; - -export const buildAst: LogicalExpressionExtractor = { - fromOrExpression: (expression: OrExpression) => - { - return { - left: buildAst.fromExpression(expression.left), - right: buildAst.fromExpression(expression.right), - op: "or", - $type: "binary", - }; - }, - fromAndExpression: (expression: AndExpression) => - { - return { - left: buildAst.fromExpression(expression.left), - right: buildAst.fromExpression(expression.right), - op: "and", - $type: "binary", - }; - }, - fromNegation: (expression: NegationExpression) => - { - return { - value: buildAst.fromExpression(expression.inner), - op: "not", - $type: "unary", - }; - }, - fromGroup: (expression: GroupExpression) => - { - return { inner: buildAst.fromExpression(expression.inner), $type: "group" }; - }, - fromStatement: (expression: StatementExpression) => - { - const reference = expression.reference.ref!; - const op = expression.negation ? "neq" : "eq"; - - switch (reference.$type) - { - case "Condition": - return { - op, - left: { - $type: "lookup", - what: reference.name, - type: "condition", - }, - right: { $type: "literal", value: expression.value }, - $type: "binary", - }; - case "Proposition": - return { - op, - left: { - $type: "lookup", - what: reference.name, - type: "proposition", - }, - right: { $type: "literal", value: expression.value }, - $type: "binary", - }; - } - }, - fromExpression: (expression: PropositionalExpression) => - { - switch (expression.$type) - { - case "OrExpression": - return buildAst.fromOrExpression(expression as OrExpression); - case "AndExpression": - return buildAst.fromAndExpression(expression as AndExpression); - case "Negation": - return buildAst.fromNegation(expression as NegationExpression); - case "Group": - return buildAst.fromGroup(expression as GroupExpression); - case "Statement": - return buildAst.fromStatement(expression as StatementExpression); - } - }, -}; diff --git a/lib/lab/index.ts b/lib/lab/index.ts deleted file mode 100644 index ab0807f2..00000000 --- a/lib/lab/index.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { Concern, Model } from "../language/generated/ast"; - -import { AstNode, buildAst } from "./ast"; -import { extractModel } from "../model"; -import { Res } from "../utils"; - -export type Value = string | boolean; - -export interface Given -{ - value: Value; - expression: string; -} - -export interface Condition -{ - name: string; - value: AstNode; -} - -export interface TweakableConcern -{ - value: Value; - raises: { name: string; expression?: AstNode }[]; -} - -export interface Tweakable -{ - name: string; - expression: string; - output: Value[]; - default: Value; - disable?: AstNode[]; - concerns: TweakableConcern[]; -} - -export interface Laboratory -{ - title?: string; - description?: string; - - version?: string; - authors?: string[]; - - givens: Given[]; - concerns: Concern[]; - - conditions: Condition[]; - tweakables: Tweakable[]; -} - -// TODO: Cleanup -export function createLab({ laboratory, concerns, propositions, conditions }: Model): Laboratory -{ - return { - title: laboratory?.titles[0] ?? "Unknown", - authors: laboratory?.authors, - description: laboratory?.descriptions[0].contents ?? "Unknown", - version: laboratory?.versions[0] ?? "v1", - concerns, - givens: propositions.filter(x => x.valueClauses.length === 1).map(x => - { - const { value } = x.valueClauses[0]; - return { expression: x.expression, value }; - }), - tweakables: propositions.filter(x => x.valueClauses.length !== 1).map(x => - { - return { - name: x.name, - expression: x.expression, - output: x.valueClauses.map(i => i.value), - default: x.valueClauses.find(y => y.default)!.value, - concerns: x.valueClauses.map(i => ({ - value: i.value, - raises: i.raises.map(r => ({ - name: r.concern.ref!.name, - expression: r.condition?.expression - ? buildAst.fromExpression(r.condition.expression) - : undefined, - })), - })), - disable: x.disable - ? x.disable.statements.map(stmt => buildAst.fromExpression(stmt.condition.expression)) - : undefined, - }; - }), - conditions: conditions.map(cond => ({ - name: cond.name, - value: buildAst.fromExpression(cond.condition.expression), - })), - }; -} - -export async function parseLab(input: string): Promise> -{ - const model = await extractModel(input); - return model.map(createLab); -} diff --git a/lib/model.ts b/lib/model.ts index 3625001c..fe660047 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -11,7 +11,7 @@ export async function extractDocument( services: LangiumServices, ): Promise>> { - const document = services.shared.workspace.LangiumDocumentFactory.fromString(input, URI.file("tmp.jspl")); + const document = services.shared.workspace.LangiumDocumentFactory.fromString(input, URI.file("/tmp/input.jspl")); await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 19981042..00000000 --- a/package-lock.json +++ /dev/null @@ -1,2534 +0,0 @@ -{ - "name": "jspl-javascript-propositional-laboratory", - "version": "0.6.2", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "jspl-javascript-propositional-laboratory", - "version": "0.6.2", - "license": "SEE LICENSE IN LICENSE.txt", - "dependencies": { - "@ts-stack/markdown": "^1.5.0", - "chalk": "~5.3.0", - "commander": "~11.0.0", - "dedent-js": "^1.0.1", - "langium": "~2.1.0", - "vscode-languageclient": "~9.0.1", - "vscode-languageserver": "~9.0.1" - }, - "bin": { - "java-script-propositional-laboratory-format-cli": "bin/cli.js" - }, - "devDependencies": { - "@types/node": "~16.18.41", - "@types/vscode": "~1.67.0", - "@typescript-eslint/eslint-plugin": "~6.4.1", - "@typescript-eslint/parser": "~6.4.1", - "concurrently": "~8.2.1", - "esbuild": "^0.19.12", - "eslint": "~8.47.0", - "langium-cli": "~2.1.0", - "typescript": "~5.1.6" - }, - "engines": { - "node": ">=16.0.0", - "vscode": "^1.67.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@ts-stack/markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@ts-stack/markdown/-/markdown-1.5.0.tgz", - "integrity": "sha512-ntVX2Kmb2jyTdH94plJohokvDVPvp6CwXHqsa9NVZTK8cOmHDCYNW0j6thIadUVRTStJhxhfdeovLd0owqDxLw==", - "dependencies": { - "tslib": "^2.3.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.71", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.71.tgz", - "integrity": "sha512-ARO+458bNJQeNEFuPyT6W+q9ULotmsQzhV3XABsFSxEvRMUYENcBsNAHWYPlahU+UHa5gCVwyKT1Z3f1Wwr26Q==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/vscode": { - "version": "1.67.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.67.0.tgz", - "integrity": "sha512-GH8BDf8cw9AC9080uneJfulhSa7KHSMI2s/CyKePXoGNos9J486w2V4YKoeNUqIEkW4hKoEAWp6/cXTwyGj47g==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", - "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.4.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", - "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "date-fns": "^2.30.0", - "lodash": "^4.17.21", - "rxjs": "^7.8.1", - "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", - "supports-color": "^8.1.1", - "tree-kill": "^1.2.2", - "yargs": "^17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": "^14.13.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/dedent-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", - "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "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" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", - "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/langium": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/langium/-/langium-2.1.3.tgz", - "integrity": "sha512-/WN1xHoNBg0mi1Jp9ydMFSHIv8Jhq7K+0stNVURdoG4NgZx4/06AfNeeixmmU8X842wBl9gFZJP5O93Ge5Oasw==", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/langium-cli": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/langium-cli/-/langium-cli-2.1.0.tgz", - "integrity": "sha512-Gbj4CvfAc1gP/6ihxikd2Je95j1FWjXZu8bbji2/t2vQ6kEP+vs9Fx7kSGOM0AbU/hjZfy6E35bJPOdwsiyqTA==", - "dev": true, - "dependencies": { - "chalk": "~5.3.0", - "commander": "~11.0.0", - "fs-extra": "~11.1.1", - "jsonschema": "~1.4.1", - "langium": "~2.1.0", - "langium-railroad": "~2.1.0", - "lodash": "~4.17.21" - }, - "bin": { - "langium": "bin/langium.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/langium-railroad": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/langium-railroad/-/langium-railroad-2.1.0.tgz", - "integrity": "sha512-2IeAIUSTQzbDjNnJA+0ql8tyN/mhCSN4FS50Mo9LOtLj523qUEBwHflDmCiOGZzW9iZdni6NXJgh8nLqjhTlDw==", - "dev": true, - "dependencies": { - "langium": "~2.1.0", - "railroad-diagrams": "~1.0.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", - "dev": true - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", - "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", - "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", - "dependencies": { - "minimatch": "^5.1.0", - "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.5" - }, - "engines": { - "vscode": "^1.82.0" - } - }, - "node_modules/vscode-languageclient/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/vscode-languageclient/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", - "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index 1ec79ea4..56e8a041 100644 --- a/package.json +++ b/package.json @@ -1,124 +1,54 @@ { - "name": "jspl-javascript-propositional-laboratory", - "displayName": "JSPL: JavaScript Propositional Laboratory", - "description": "Support for writing JavaScript Proposal Laboratories", - "version": "0.7.4", - "publisher": "PhilippRiemer", - "license": "SEE LICENSE IN LICENSE.txt", - "icon": "icon.png", - "galleryBanner": { - "color": "#232323", - "theme": "dark" - }, - "repository": { - "type": "git", - "url": "https://github.com/bldl/jspl" - }, - "bugs": { - "url": "https://github.com/bldl/jspl/issues" - }, - "homepage": "https://github.com/bldl/jspl", - "categories": ["Programming Languages"], - "type": "module", - "scripts": { - "build": "tsc -b tsconfig.json && node esbuild.mjs", - "watch": "concurrently -n tsc,esbuild -c blue,yellow \"tsc -b tsconfig.json --watch\" \"node esbuild.mjs --watch\"", - "lint": "eslint src --ext ts", - "langium:generate": "langium generate", - "langium:watch": "langium generate --watch", - "vscode:prepublish": "npm run build && npm run lint && npm run esbuild-base", - "esbuild-base": "esbuild ./src/extension/main.ts --bundle --outfile=out/main.js --external:vscode --format=cjs --platform=node" - }, - "dependencies": { - "@ts-stack/markdown": "^1.5.0", - "chalk": "~5.3.0", - "commander": "~11.0.0", - "dedent-js": "^1.0.1", - "langium": "~2.1.0", - "vscode-languageclient": "~9.0.1", - "vscode-languageserver": "~9.0.1" - }, - "devDependencies": { - "@types/node": "~16.18.41", - "@types/vscode": "~1.67.0", - "@typescript-eslint/eslint-plugin": "~6.4.1", - "@typescript-eslint/parser": "~6.4.1", - "concurrently": "~8.2.1", - "dprint": "^0.50.2", - "esbuild": "^0.19.12", - "eslint": "~8.47.0", - "langium-cli": "~2.1.0", - "typescript": "~5.1.6" - }, - "engines": { - "vscode": "^1.67.0", - "node": ">=16.0.0" - }, - "contributes": { - "languages": [ - { - "id": "java-script-propositional-laboratory-format", - "aliases": [ - "JavaScript Propositional Laboratory Format", - "java-script-propositional-laboratory-format" - ], - "extensions": [ - ".jspl" - ], - "configuration": "./language-configuration.json" - } - ], - "grammars": [ - { - "language": "java-script-propositional-laboratory-format", - "scopeName": "source.java-script-propositional-laboratory-format", - "path": "syntaxes/java-script-propositional-laboratory-format.tmLanguage.json" - } - ], - "commands": [ - { - "command": "jspl.generate-webpage", - "title": "JSPL: Generate Laboratory Webpage" - }, - { - "command": "jspl.generate-graphviz", - "title": "JSPL: Generate Graphviz Visualization" - }, - { - "command": "jspl.generate-json", - "title": "JSPL: Generate JSON Representation" - }, - { - "command": "jspl.generate-optimizer", - "title": "JSPL: Generate Optimizer (Experimental)" - } - ], - "menus": { - "commandPalette": [ - { - "command": "jspl.generate-webpage", - "when": "editorLangId == java-script-propositional-laboratory-format" - }, - { - "command": "jspl.generate-graphviz", - "when": "editorLangId == java-script-propositional-laboratory-format" - }, - { - "command": "jspl.generate-json", - "when": "editorLangId == java-script-propositional-laboratory-format" - }, - { - "command": "jspl.generate-optimizer", - "when": "editorLangId == java-script-propositional-laboratory-format" - } - ] - } - }, - "activationEvents": [ - "onLanguage:java-script-propositional-laboratory-format" - ], - "main": "./out/extension/main.cjs", - "bin": { - "java-script-propositional-laboratory-format-cli": "./bin/cli.js" - } + "name": "jspl", + "description": "The JavaScript Language Proposal Laboratory", + "version": "1.0.0", + "repository": { + "type": "git", + "url": "https://github.com/bldl/jspl" + }, + "bugs": { + "url": "https://github.com/bldl/jspl/issues" + }, + "homepage": "https://github.com/bldl/jspl", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "langium:generate": "langium generate -f config/langium.json" + }, + "type": "module", + "dependencies": { + "@codingame/esbuild-import-meta-url-plugin": "^1.0.3", + "@codingame/monaco-vscode-editor-api": "^22.1.3", + "@codingame/monaco-vscode-files-service-override": "^22.1.3", + "@mantine/core": "^8.3.6", + "@tabler/icons-react": "^3.35.0", + "@typefox/monaco-editor-react": "^7.2.0", + "monaco-languageclient": "^10.2.0", + "neverthrow": "^8.2.0", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "react-markdown": "^10.1.0", + "vscode": "npm:@codingame/monaco-vscode-extension-api@^22.1.3", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1" + }, + "devDependencies": { + "@types/emscripten": "^1.41.5", + "@types/react": "^19.2.2", + "@types/react-dom": "^19.2.2", + "@types/vscode": "^1.105.0", + "@vitejs/plugin-react": "^5.1.0", + "dprint": "^0.50.2", + "langium": "~2.1.0", + "langium-cli": "~2.1.0", + "postcss": "^8.5.6", + "postcss-preset-mantine": "^1.18.0", + "postcss-simple-vars": "^7.0.1", + "typescript": "^5.9.3", + "vite": "^7.1.12" + }, + "engines": { + "vscode": "^1.67.0", + "node": ">=16.0.0" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..275eb17b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3857 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@codingame/esbuild-import-meta-url-plugin': + specifier: ^1.0.3 + version: 1.0.3 + '@codingame/monaco-vscode-editor-api': + specifier: ^22.1.3 + version: 22.1.3 + '@codingame/monaco-vscode-files-service-override': + specifier: ^22.1.3 + version: 22.1.3 + '@mantine/core': + specifier: ^8.3.6 + version: 8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@tabler/icons-react': + specifier: ^3.35.0 + version: 3.35.0(react@19.2.0) + '@typefox/monaco-editor-react': + specifier: ^7.2.0 + version: 7.2.0 + monaco-languageclient: + specifier: ^10.2.0 + version: 10.2.0 + neverthrow: + specifier: ^8.2.0 + version: 8.2.0 + react: + specifier: ^19.2.0 + version: 19.2.0 + react-dom: + specifier: ^19.2.0 + version: 19.2.0(react@19.2.0) + react-markdown: + specifier: ^10.1.0 + version: 10.1.0(@types/react@19.2.2)(react@19.2.0) + vscode: + specifier: npm:@codingame/monaco-vscode-extension-api@^22.1.3 + version: '@codingame/monaco-vscode-extension-api@22.1.3' + vscode-languageclient: + specifier: ^9.0.1 + version: 9.0.1 + vscode-languageserver: + specifier: ^9.0.1 + version: 9.0.1 + devDependencies: + '@types/emscripten': + specifier: ^1.41.5 + version: 1.41.5 + '@types/react': + specifier: ^19.2.2 + version: 19.2.2 + '@types/react-dom': + specifier: ^19.2.2 + version: 19.2.2(@types/react@19.2.2) + '@types/vscode': + specifier: ^1.105.0 + version: 1.105.0 + '@vitejs/plugin-react': + specifier: ^5.1.0 + version: 5.1.0(vite@7.1.12(sugarss@5.0.1(postcss@8.5.6))) + dprint: + specifier: ^0.50.2 + version: 0.50.2 + langium: + specifier: ~2.1.0 + version: 2.1.3 + langium-cli: + specifier: ~2.1.0 + version: 2.1.0 + postcss: + specifier: ^8.5.6 + version: 8.5.6 + postcss-preset-mantine: + specifier: ^1.18.0 + version: 1.18.0(postcss@8.5.6) + postcss-simple-vars: + specifier: ^7.0.1 + version: 7.0.1(postcss@8.5.6) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + vite: + specifier: ^7.1.12 + version: 7.1.12(sugarss@5.0.1(postcss@8.5.6)) + +packages: + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@chevrotain/cst-dts-gen@11.0.3': + resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} + + '@chevrotain/gast@11.0.3': + resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} + + '@chevrotain/regexp-to-ast@11.0.3': + resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} + + '@chevrotain/types@11.0.3': + resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} + + '@chevrotain/utils@11.0.3': + resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} + + '@codingame/esbuild-import-meta-url-plugin@1.0.3': + resolution: {integrity: sha512-SAIOsWZteIWYAk04BCqQ+ugu8KiJm8EplQbMvxJl905uZv3r+21+XjtGg/zzrbxlVAY1cP+hGAG7z7sBPmy63w==} + + '@codingame/monaco-vscode-05a2a821-e4de-5941-b7f9-bbf01c09f229-common@22.1.3': + resolution: {integrity: sha512-0c87HXlQCVKVU3eslACzwkp1zWlIAu/zSHnb/GEDHRRnVmuzxC/kPCezBQzH/hXtOxKYhS43SbPWoq+w6UzTnw==} + + '@codingame/monaco-vscode-08d1b4da-daf2-5f0d-8c50-ca6a6986c50f-common@22.1.3': + resolution: {integrity: sha512-g+hXUrygeJtftwZLHc9WmwWJ+1tE9DXQuJiv+ZYN4XWTynx+vJzgNCizzGM0fxEWVBkX/Aomo0Kyfk0wB5ABSg==} + + '@codingame/monaco-vscode-0c06bfba-d24d-5c4d-90cd-b40cefb7f811-common@22.1.3': + resolution: {integrity: sha512-YnmNByQBPVuAdPn08aIDbI8MqI+1+NlzkNUrxnb/n5A8sy0QDiXE7m3h53119KS4tYcUyBCFQFJ5dDDq4BOVOg==} + + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common@22.1.3': + resolution: {integrity: sha512-YA6DmYznJCL4kUn1maDU8NADX7roktf9gKpAoUSKnVt1VfWCrPWAMwjKTg5Fgfbetjg7mx+MJ5eqnQsDR/UU8A==} + + '@codingame/monaco-vscode-1021b67c-93e5-5c78-a270-cbdb2574d980-common@22.1.3': + resolution: {integrity: sha512-+MLxAzMCcZbEiUCT3hb6zoHUMC5JwO8qvKAtsNtZw08Le1B8humYXoNPdfGVlp2edvtsDc9SGQLSpbKaqwC8JQ==} + + '@codingame/monaco-vscode-15626ec7-b165-51e1-8caf-7bcc2ae9b95a-common@22.1.3': + resolution: {integrity: sha512-SRs5WmJaB33MLdpdtfQu7vUukhbyTQrvkmAkJkLthcG574CRwA99EEVMHP2Sa4+vu+76zruGiuNL3GS0MrUgcA==} + + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common@22.1.3': + resolution: {integrity: sha512-Dz/r4FsGA1/8BK3i2YWPvIPUgdW7zibdqhgvqSV2rqbibf1LtvfOkBrVqiLtc1v7xMtthkTJzk4tJcS7mh2IiQ==} + + '@codingame/monaco-vscode-1b4486de-4fe4-59c4-9e6d-34f265ff6625-common@22.1.3': + resolution: {integrity: sha512-Q/xs4Z2iXGSxOIspbRj0iX3bG3cn77nZ0utTy0ypYiKhcS54XrBw7QCd1jyg3VbyHCLwIBmRGzlOq3o8k5z8Kg==} + + '@codingame/monaco-vscode-23aade48-f094-5c08-9555-97fc9cca96c9-common@22.1.3': + resolution: {integrity: sha512-yNYY6LZJTwQq1r80Bfiwi2HjrJ41SrAvR441O486cGx1a9mDlICcVtReIIuG+neZ6Ntfu7gPbn3r/GyjQNBTcA==} + + '@codingame/monaco-vscode-249dc928-1da3-51c1-82d0-45e0ba9d08a1-common@22.1.3': + resolution: {integrity: sha512-nQjcuaPt1Q6i8VJ+lImm7uIeTFaW73XhHWRA9Ai+ACRoHNE/VyGsie/gqaJ2VzLFCf6SJWhhnrKwz2y4IsB+vw==} + + '@codingame/monaco-vscode-256d5b78-0649-50e9-8354-2807f95f68f4-common@22.1.3': + resolution: {integrity: sha512-c4vMAZd3G4lcKpR9qZlAzWjoqGjukrXPg6T0/GpZruBxYFLzTjm46Y5XYIX5o2f4O96N4esZn4mlNvIKTpvblQ==} + + '@codingame/monaco-vscode-2a22c7b4-b906-5914-8cd1-3ed912fb738f-common@22.1.3': + resolution: {integrity: sha512-xZZmP+wB0LkCrmqI3z18Y698IZO+uAw8dEhbjYSIAIUkdN+kjFhN14/WCexBUHLzQWwKSDf2YK6Da1EBCAzr0Q==} + + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common@22.1.3': + resolution: {integrity: sha512-PSOKF9cwvdiv9y3ujEtRWQgf0fbeOLAU6MFoUV9lpPJkp+rbx5oeLxuMMQma6Wc4d8EN0mGKvK0v9quutyfscQ==} + + '@codingame/monaco-vscode-2f06fe84-148e-5e6b-a7ca-c7989c5f128a-common@22.1.3': + resolution: {integrity: sha512-UMt+64C8uzID/mswiv+hUYSt3/ZLKnLFAw0s2ilDEM2Xhp3ahQlB2wN0H0p4vhcdp0FAZKwrqltlYLan/WoA1w==} + + '@codingame/monaco-vscode-3109a756-1f83-5d09-945b-9f0fcad928f0-common@22.1.3': + resolution: {integrity: sha512-0qwiyqJjL+l+722Jiyn0lUiXKICQPoxqwPBKJwEfy51wLYhyKAh/cFS91l6nnER653JPKI2B0bRzyJvhbukBGw==} + + '@codingame/monaco-vscode-33833ac7-3af3-5e9d-8fb9-11838d852c59-common@22.1.3': + resolution: {integrity: sha512-ETD4WmcFXzpbexUIMgCLxJ4r9gf51VSdzyUVLOlTYp/kDfepZ3WrO3iEFLPu1QSlQ6IfHyfLI6PHDDJxJvIMUQ==} + + '@codingame/monaco-vscode-37b3b402-09f5-5f69-89ef-ce30559f63cc-common@22.1.3': + resolution: {integrity: sha512-Nmiu8BomY9/huSG6jkDLNmmPhklDjVwqe964NDZ6o3n3TcIf5j0HEW9G+V1HrJBbDQPhTDXPOC5092uWNvRf0Q==} + + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common@22.1.3': + resolution: {integrity: sha512-b07xHxdEjtAyeaCgxC+YAHE3Lm30bhCOSP9Rvtug7CQtNVbU+beCg0uL14zuQJV1+sF75R8o70Hnz4Px1qCGFw==} + + '@codingame/monaco-vscode-422642f2-7e3a-5c1c-9e1e-1d3ef1817346-common@22.1.3': + resolution: {integrity: sha512-jFWNIvngmjXRutWBrrT9opfi5VmcBZiEdOHMgd4la5WLKVtrYwIbxvKxuafUs3RsJWhvACWpzKrbR96e2nU18Q==} + + '@codingame/monaco-vscode-494be54c-bd37-5b3c-af70-02f086e28768-common@22.1.3': + resolution: {integrity: sha512-RYC3pDqjgCt1xkBwKeKIIgnJJF81acBbb7Gb+sgbao4N3BjGC3QiB7rTbFu2bWMzsSfXTvcWNpdfr9zMqFxheg==} + + '@codingame/monaco-vscode-4a316137-39d1-5d77-8b53-112db3547c1e-common@22.1.3': + resolution: {integrity: sha512-xcMelnPhce9rq6UWo7bpuhR7oiczbKq70/qjPAemEhTsVfT7GbjwXI/noKp66rnrhdg/0HbA5VHh7JpFSxpWAA==} + + '@codingame/monaco-vscode-4a3ac544-9a61-534c-88df-756262793ef7-common@22.1.3': + resolution: {integrity: sha512-cN9rJRnUYjBAH1WeC88YWe0yCerTxXgyV+dEJb7Ei4ueV4IT2zvRvoW6WmF8ZG6qLgIspeM63WHrUdNNytaI/A==} + + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common@22.1.3': + resolution: {integrity: sha512-aLhiEyvBtSUVj+5fZCpboVAksKzk0Kw6rqFKTOIDA4dclC6Lqt0P8RmwkIx/+TyBYfJY6EAzXJqlKMlyKJDAcw==} + + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common@22.1.3': + resolution: {integrity: sha512-/+YihhYwxUSVYyWj7i2WNbff4G3Tp5JRQoaZgDPDlVW13bHnCWF6/6TlgA1Ai4BNtd9mi4A8CyMyXvAUIoVBvw==} + + '@codingame/monaco-vscode-5084de40-f866-5cb5-9d9b-33a10f6f235d-common@22.1.3': + resolution: {integrity: sha512-jr504SgqL/ycNJubeGmTx9UkIHiK0tq2Lp5G1mfJOCf1HzJwZsDfkhEZ7eJq2CxKAW3M4Q0r+irBFgFhZmKxVg==} + + '@codingame/monaco-vscode-51e7513d-a395-525d-b226-639aa8c6cc2d-common@22.1.3': + resolution: {integrity: sha512-yvb6/5t3op59bEv+5kqFlDPNWxji3gMS1uIRmQyMdveznnC2THP4mYT0VgcGj5//hULTyt1L/meeZs+LVBJCbg==} + + '@codingame/monaco-vscode-523730aa-81e6-55d7-9916-87ad537fe087-common@22.1.3': + resolution: {integrity: sha512-cxrXW/hZBkKyMbRHepKmY0vlbdwLT9fSH+/qTNRijQs+ydMxH3dvx3PG37hEeJefFbGkLrhOj/6/scJYdVIxAg==} + + '@codingame/monaco-vscode-5452e2b7-9081-5f95-839b-4ab3544ce28f-common@22.1.3': + resolution: {integrity: sha512-H0Q6MQBIOXV/1kGGHRnPv0ZSnTaYcKfCQarAPX6HZfig6jaiX68a/TqU0TlsbbXb7wd9PDb/GSaFPCMMT7dyhA==} + + '@codingame/monaco-vscode-571c8352-7953-5038-9f09-e03bb6219a0e-common@22.1.3': + resolution: {integrity: sha512-i119uNoS+4M5VuBDUB9BdlzHpiP7P1aLtNh51z0tRtmumpxcQI9Q2gF3HGdhoDTHJvntSeMIr+waOSyBAyLIxg==} + + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common@22.1.3': + resolution: {integrity: sha512-PzWAjywMdZUd+0chldTdSMHHczTbNDixbzmi1paPavNLl1ciPkID4/GaW4m35/0DLiq4bNDdHNpDL/r+jmFW0g==} + + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common@22.1.3': + resolution: {integrity: sha512-MLilGBeFRvAmb82Dfhfnv89SuMJBodaGix25hXFgQFwNOkC3zpuM9YWsV2jNvd9tYZHJbxw49HGSBE/ul7h8vQ==} + + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common@22.1.3': + resolution: {integrity: sha512-p0+SrpN9PPX7bO6St7QI3vHIqk8pD++AB184F9g3SAiUlkHvyaqpI9CCHI12tht1ovdFIhT610vqvu/VfSrMew==} + + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common@22.1.3': + resolution: {integrity: sha512-DY4XRzH2dIEIfqUmpCVduRit8iecm6QZ+RJfjHf+loewi78vSLfTWei7j82GeZ3pKIsbiXKhYamtpt2eSTLsEw==} + + '@codingame/monaco-vscode-6845754f-e617-5ed9-8aaa-6ca3653a9532-common@22.1.3': + resolution: {integrity: sha512-cyhRExWqObm/b/jMreSQg20R5QWpNk/SI9cQM+eUflZ9XSHP+k/lLdmF/Xy8c3STy3Vuf0WVAfj6RO2grmT+Yg==} + + '@codingame/monaco-vscode-6980eeab-47bb-5a48-8e15-32caf0785565-common@22.1.3': + resolution: {integrity: sha512-uVAvAuY+d26+CgY58D7pJSvCLu3stcn2I5Sp+a0w4R1xLFPei+EiyLsYgMs0tioQiKT0GUS2YxGW0hNF0a6vUg==} + + '@codingame/monaco-vscode-6bf85d7b-e6e3-54e9-9bc1-7e08d663f0f6-common@22.1.3': + resolution: {integrity: sha512-/6K8A7SA1RHrgxq2shrh2gRZhuSQdGQOq0siweNYl0vsT+mQ2ECsyUhw2r5edTbH9ZanJ5AahnmgjDvez0cyAA==} + + '@codingame/monaco-vscode-6db1b967-5327-5c5c-8c17-bd92774c0fb2-common@22.1.3': + resolution: {integrity: sha512-dVxjtqBtKf3EGq+Geqjs6XwgamdtSifuB2+DlfsjMCINWtLUFvZPQ94geLc5awX8xh/yOdhPagz/OdhrpgD2Ug==} + + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common@22.1.3': + resolution: {integrity: sha512-y9gotKf5OryrHSIcb9JySwhI64vgW9afc3qkJzc30ju+17PUUqwpNybuHJ+gb6npp9Lk2sO2vmTYB5xSuHJT8A==} + + '@codingame/monaco-vscode-7869cfe8-f42c-5721-9f2b-7d04a6a41f16-common@22.1.3': + resolution: {integrity: sha512-EIBEr3Tu727XC1WE2mZjZZbJFjEQT6ItZxc2HdhS3T4/GpQW5mJTn+j80uhgb/XdlSl0KgNXMe3Gt9oIrev0vw==} + + '@codingame/monaco-vscode-7969284a-1a12-5148-9750-fcf9656a693f-common@22.1.3': + resolution: {integrity: sha512-ZESgnLaRcTtGbNwfrYBTzNehT/Ndlmt1UliJ4cCit5AfXYBYnpDyMzGlyttRr+YZTCmvoaXKtGi3ueYqOdGguw==} + + '@codingame/monaco-vscode-7f39b6f1-3542-5430-8760-0f404d7a7cee-common@22.1.3': + resolution: {integrity: sha512-wObhPDFXRU5jS8I9zX7yQnTyDXltrDszbdLdic9tFZ1B6N/N0UW51+W0ZG4tcbeWmv8/pHWUObne+3BM+hyVXw==} + + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common@22.1.3': + resolution: {integrity: sha512-hu0A73nvjXIP7qVF3p/yXas++sauganvPL9u8H7NLwurbxbA1pHKHS82Zo5dElm5Rgo9B8UlF5sY4uXFY/Dvmw==} + + '@codingame/monaco-vscode-897bebad-39df-57cb-8a57-36a271d038be-common@22.1.3': + resolution: {integrity: sha512-BfMqAjwLJWiYEmEfOKr7HpKmaDRFuFQj5DCgNW6kET4m61h2fic0WGdMQ4i/Iqkj+nI2GV5MfJo6itdi8AGI9Q==} + + '@codingame/monaco-vscode-89a82baf-8ded-5b2f-b8af-e5fbd72dc5ad-common@22.1.3': + resolution: {integrity: sha512-zAqhcJIl9i7jpM1FNeRG8GiApHf094gpvdvTEhEpiX9NVz7b8w8pi/KtlapSbx3uKwi22t5CYMhU9jnhjemQdA==} + + '@codingame/monaco-vscode-8ccb7637-50ea-5359-97bf-00015d7fe567-common@22.1.3': + resolution: {integrity: sha512-NHQdoIhw0r6u9qpzPOmAgockXYPIan/V/v/APSHjVIEPOUIM5A1yjr3JmErtdSTshaO9RJ9jSdJ8SzsZXUFkCw==} + + '@codingame/monaco-vscode-96e83782-7f38-572e-8787-02e981f1c54f-common@22.1.3': + resolution: {integrity: sha512-SYXiCHDcfdo0Iwgq4OYevnqGds3okRmxaUKy21jIUbJgXNGFU8IFrVGQDCxuPSvVIJCgXtbMOUICQJ3JCAC+7A==} + + '@codingame/monaco-vscode-9a1a5840-af83-5d07-a156-ba32a36c5c4b-common@22.1.3': + resolution: {integrity: sha512-H7i08rJYcWAXZFBYbrlnnSB92Juy4tKD+ntxh4H3XxFDPi86dHVO4rgG0YJcdfLzEaW3ll5aRG+DqbXfdnyHAQ==} + + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common@22.1.3': + resolution: {integrity: sha512-1cj4ogXskXGVEUoLRnzrDNKpoTidEHp1Ue1Px/y6Kz2pQrsM6f9k6whlbtDQI1BZmPRIchaUVh6eFdVeDSmHcQ==} + + '@codingame/monaco-vscode-9c84f943-bcb5-5bcf-92a6-91f66a732f26-common@22.1.3': + resolution: {integrity: sha512-4ZrgInAXAvAW1ww5NzlKf9oG6EK2RDuXDNjk2+nLb5zPqTW7UXZMldCIQr+h/Jqc/JR8u1G0Y2OdWSg/x2Lm1Q==} + + '@codingame/monaco-vscode-9d0168a3-519b-57f3-9bcc-89efc41f951a-common@22.1.3': + resolution: {integrity: sha512-tUoPn9h2H92jSDQjwPabQgTjK4mBHTJXoz3DzMhQt4+13qU/I/N87Q/I9imbCpxUk6fmRuzOZMC1QfYS4zF8Pg==} + + '@codingame/monaco-vscode-9ee79c1a-3f03-568b-8eac-b02513a98b68-common@22.1.3': + resolution: {integrity: sha512-14gx8eohGh0cai8JaZZZq8GAFG/IE0GBgiMQ2gRM8MJSBpSBzTwOccYdZxyKn9pMSVDSbRs4YQT1OjyH0eptHg==} + + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common@22.1.3': + resolution: {integrity: sha512-wTsUzxdLY7w7pRbZAdvgvGZ0SF25GR8LaCBLFz8QxeozxXRixgJlWij1t8PWIm0wQyzqLSRfKqwFZ8utQHO8Pw==} + + '@codingame/monaco-vscode-a175bd1a-4858-5944-9ae5-fb73305dcb13-common@22.1.3': + resolution: {integrity: sha512-eQb0siPIqgPwu2CYVDKjcSgS1oTSIpZOnfm4h3+Xgt6KOQWHs7JXW1SXd1RWw6IroLzlNEECCLyW2VnOu4GPMQ==} + + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common@22.1.3': + resolution: {integrity: sha512-K3EHgqQnbeKYQ23eU3EnTSc2D8gyfhInBByI8eL+0/oFjLigklWZcaiXkUD4LUvLFwfR6U8dQOldqE8egEcLbw==} + + '@codingame/monaco-vscode-a3eaa464-944c-5b8f-8886-213068ba4897-common@22.1.3': + resolution: {integrity: sha512-D0If3qw1dwAIWfYbFZhuv+Szo7Qi3dshBO0ZT1ynWPDpuDYIe9lYJvZ9Bw6Nltrh8Er2Sb1rpYldnGCmQ8dg5Q==} + + '@codingame/monaco-vscode-a654b07e-8806-5425-b124-18f03ba8e11a-common@22.1.3': + resolution: {integrity: sha512-5pqxCVTvEQLctiazBF0QfwbRTFG4ylbhSKxv4wBQYeKox494bZdlWm1m7C/wipaXRw2lxMrxrQ4RbkNFAr6zvA==} + + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common@22.1.3': + resolution: {integrity: sha512-dqUMsIBMtzeRJtu0oLB431PdarNKEuGQv33RuDS3t0akA0hJCgLr+jhf0rZuYLtZf3cc4u3zRXyxPLDsuWZy0w==} + + '@codingame/monaco-vscode-a9da9abe-278d-5ce6-9418-99c7c07c5c37-common@22.1.3': + resolution: {integrity: sha512-sK7WXI+Esovdh5npuQUxxpPbvylfH6YVfIDPRJEbDwIWx5X4z9zFxa4ExXdKGQ3qVD5+kvS4XuLsXDwjngramw==} + + '@codingame/monaco-vscode-abed5a84-8a82-5f84-9412-88a736235bae-common@22.1.3': + resolution: {integrity: sha512-B9cx/GtvDYi1y5xLEs5ZTkuHUExiVBisTReVcsNeC7SPuNIfHvTW4dKRZfo3TCMKGFEzPad0EMYtBRaE8ksamA==} + + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common@22.1.3': + resolution: {integrity: sha512-8ym8tASO+hW+xqWkFOedKF/8bJJhrHZa1Ae/5eUgeIiBTWe+UGHoOGHav1KBYgga/AD7l9rU5L3T15zgPXkM5A==} + + '@codingame/monaco-vscode-api@22.1.3': + resolution: {integrity: sha512-86CHh6xhJxmYr39EcsLTmRgScMBYlCXmmlJ5ck4kOVI8b5A7UBxHz741mQLYhDTZiwaxD/eWexSTEY0mkP0jNg==} + + '@codingame/monaco-vscode-b6d52a6d-8c8e-51f5-bcd2-1722295e31d9-common@22.1.3': + resolution: {integrity: sha512-JbtOzmg3PYbnMiSNv+t/XFVrUVUM7GPNu7wP1ubBREW1uHOp2MlEQuHQmR1btrz0Tt3mdEwMMt8lKpiA3URqdg==} + + '@codingame/monaco-vscode-b994942c-360d-5b68-8a33-77d4bde6b714-common@22.1.3': + resolution: {integrity: sha512-w0W/J7YOrHJgeS/bujEIXE0hO/qK5eSJvJ8PbHrpEHSBS/F9AW9g09dfZ92q5FBAmClqJggbuwTp8Q13PoraeQ==} + + '@codingame/monaco-vscode-base-service-override@22.1.3': + resolution: {integrity: sha512-Ugul+i4Uc9wPoPHCnMKFf9odEaCRc6XX7a2RPqwPps3ASMjX5Hnv3LcxfG430E8Ew4MANdcg4bn3WhdwkQkKQg==} + + '@codingame/monaco-vscode-bba55be6-41a2-50cd-a3cc-8bafa35bfa89-common@22.1.3': + resolution: {integrity: sha512-zUBuCsRpuNtpl4SdJZ3QpaICgu8Sg1FMwvnffPqWf5ULF4Z+WQ4ZejVS9wlUzcjSPZk/PGL+CC8tHQePzWNnEA==} + + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common@22.1.3': + resolution: {integrity: sha512-DC/NMYOzz4SG6Gh5gPTZT4DWPvAnFi3rNz+DWiCwLz99RpqixZcmvMmuLK/LlOGHkpnPUtNM5tgRecAHa21GRA==} + + '@codingame/monaco-vscode-bd0792ac-6043-5ec3-a41a-54ccb922a1f4-common@22.1.3': + resolution: {integrity: sha512-rLwvU+M/rTgX+0lVyirh9or0dK6MmNAN1NS2eO0x5wSYYfJu9+S56XgQwS3EusGSgEPpTmLcfhGsVXC+zUD/GA==} + + '@codingame/monaco-vscode-be143a32-d60a-5489-a1d2-c83ea7eff6bf-common@22.1.3': + resolution: {integrity: sha512-YfPzxpdkOwxDdqo7wAAB0ThnAy5p0z1OcrMUpnTnFwRls7sGQ1HN12aqwy1Wj2G2n+q66JiXlPpum63VcOEVCQ==} + + '@codingame/monaco-vscode-bf94ddb5-e436-506a-9763-5ab86b642508-common@22.1.3': + resolution: {integrity: sha512-MPirZG3mZSF+eli5nqquG/RcQgR2dqm08JMPuKuI0GV11X7J6Ikdx+oI7LMgGXmKWMumL35+UBNjabLK/urfNg==} + + '@codingame/monaco-vscode-bulk-edit-service-override@22.1.3': + resolution: {integrity: sha512-KKrhvymtK4EPyKuAlHZXU3kT430ZagOKtBCOX/1OTFwSUu/wgxE11CEf9E8IeT6vlpN7AVl4XV1l2qARfq6E0Q==} + + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common@22.1.3': + resolution: {integrity: sha512-rOzfeOtT5Hgo865BjLTsAiHUHOvS6yR24Vt/EKZ8aQgb5MUTuN2oWc1G+SPLqFkxuKC3Q8VnEKLmyDnixyinJw==} + + '@codingame/monaco-vscode-ce7c734f-7712-563c-9335-d7acb43306af-common@22.1.3': + resolution: {integrity: sha512-NHd3Mje20oDX9szi6c8J9nkaWyWDcfWoHDtVOr1ughYAq2tmFZfNRrvaozDrlWFm/BvLaNrAhWpwGmnnHV5SRw==} + + '@codingame/monaco-vscode-cea4d01f-6526-5c2f-8b09-b168fead499f-common@22.1.3': + resolution: {integrity: sha512-eGry/ePtJuy85xJnIts3hAcxQHh+QREDpE2OGs44o03jT5z+n8/RSDzUuLp/8/It5WrXadPYThZUAENA/5sKhQ==} + + '@codingame/monaco-vscode-configuration-service-override@22.1.3': + resolution: {integrity: sha512-iKVTZrW1bxDtWAzpGWEYpxUWsw5M88NmCav5ozf9thv232E9xU9dHt0hOCfnbO2FkgU6bml1yF6c2uckwCyd1g==} + + '@codingame/monaco-vscode-d26a96d3-122c-5a3d-a04d-deb5ff0f19c0-common@22.1.3': + resolution: {integrity: sha512-ieXf2YH3W/99Tif0KD69p7g0lcP6G9rmZPdsEMKY2+D3mkkqpoHEdG+jNa07xtt+yt8peAbk+H/xYm1sTK9hdw==} + + '@codingame/monaco-vscode-d481a59e-259c-524e-bee1-76483d75d3a1-common@22.1.3': + resolution: {integrity: sha512-s31SgYY9/m9cJfkAgPL1zP+XVyXV7it7OcOL7YnVsOH1XfCwE9M/N4oqEVDFPK26Qaf2SVW3f93E86tJ1Wp8VA==} + + '@codingame/monaco-vscode-d609a7d3-bf87-551a-884f-550a8b327ec5-common@22.1.3': + resolution: {integrity: sha512-1KrqhxiOANLDxGs8rh+pEESfb3hjcPazwm6lATCCeOmLfCUf1ERyx6w0G3B6l8eiJl6LjNlb2ycircwWbw/j7A==} + + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common@22.1.3': + resolution: {integrity: sha512-oa8GszjEzaicTtSbebITf3lpnuh1o+QXV1ss4ZUMGA9Gy9t793N3zve6hTDD+VLK1fM4V1WQEQrzS2LUfODgDQ==} + + '@codingame/monaco-vscode-d987325e-3e05-53aa-b9ff-6f97476f64db-common@22.1.3': + resolution: {integrity: sha512-ygy3kRGtKzWA3iiskuzSPv7WOlNBWcQInIwW9h1td2e/Te7V4gbCzTprWbZR6qLGxVefqydsPtXLEqy9poN2vw==} + + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common@22.1.3': + resolution: {integrity: sha512-XJ2gL9Q4tELVoCIDWyU7L4Mu6GJSu1R0Yi3I3Vf03gfYA4Fb9ptcqgGaBo0X95iUiOF6DNNvgeVka58ZsBiv/w==} + + '@codingame/monaco-vscode-e39a1c8f-7892-5d9b-9987-7b10b79e1a0a-common@22.1.3': + resolution: {integrity: sha512-3bFMoq1BD9IQ63a8LQhLQ5tf2Kg6ThZXCFlU4KodNrM0XphqadYihSgGTyUp3fjVbeKnthweZ7IjdahAz05ljA==} + + '@codingame/monaco-vscode-e59ecb8c-db32-5324-8fe4-cf9921fd92b8-common@22.1.3': + resolution: {integrity: sha512-vXbFt20CAf7qfwnrYlAOEm9PDRVGLiUt5xsS7KoHvinGX4BJYIowAwqvvQ9SY5hZ4m7dlTq0bSmRAcf+DftsJQ==} + + '@codingame/monaco-vscode-e72c94ca-257a-5b75-8b68-5a5fa3c18255-common@22.1.3': + resolution: {integrity: sha512-segvvxPd6smZxs4/H2zgTOpOnnJKx6SQqb5C7mn2siKi1sjeRw0440L8Zs8CbWjwe3uTigqXATkEnbdGrsPGnQ==} + + '@codingame/monaco-vscode-eb7d5efd-2e60-59f8-9ba4-9a8ae8cb2957-common@22.1.3': + resolution: {integrity: sha512-PrcFwsmEU0tHqyRNvZNULYlqGsS3LgdoA7NVuZM0As5gBS3zBlYzh/Sdz3dNYvPkCQevoOPuzU2LUrqWIe15zw==} + + '@codingame/monaco-vscode-eba0b9b3-174c-5dae-9867-a37810ca1808-common@22.1.3': + resolution: {integrity: sha512-gTL/STI3saWscNxISghUaU9r6SZuTdet6bBshiNuuN93JmxDHDtxNN+0zXIncr6cFItms6supnzRvC+reQAY5A==} + + '@codingame/monaco-vscode-eda30bac-0984-5b42-9362-c68996b85232-common@22.1.3': + resolution: {integrity: sha512-A+1eHciPL+BT4HKBVr4suTK5adqE7h9lEEMm/TmecuVlX2BmGHn62qWq20UxJUyXaEJyuU+lIvsUikAbV1POUg==} + + '@codingame/monaco-vscode-editor-api@22.1.3': + resolution: {integrity: sha512-C8k/+/rQPjf/0lk/QsR66IUW1zf+/GdNmXuDQZhFfiV2LuNaalSUCv0ZSafHyE+ZIY3jZX4k4UflSWCyxoDo+A==} + + '@codingame/monaco-vscode-editor-service-override@22.1.3': + resolution: {integrity: sha512-X52G0qRWDlyAyq3pPQd1ew4dqpnasqju1YlTtwmJGHdwj6bz7lgDKL8R3ejcc812qkZ+wpFsWEz+KQ1Z4+cOgg==} + + '@codingame/monaco-vscode-environment-service-override@22.1.3': + resolution: {integrity: sha512-zg3S6tG16Zhlv/hKK1d559IlZgi63yOo1Dqit5aQre+Y1w15rtBF5wuqjzqOfsbW0qlqs3ZkwUxZHipU6RorAg==} + + '@codingame/monaco-vscode-extension-api@22.1.3': + resolution: {integrity: sha512-/Ouhf/lHqJA7SegBck9H/s5Tkl2p0DGpZhqDgZmkXA8BwXQhd+PxvJQL5L6+QTIV2xx95feH1ZYLm/hZbKGaqQ==} + + '@codingame/monaco-vscode-extensions-service-override@22.1.3': + resolution: {integrity: sha512-ev99LW1+06Mf7DA3Te5W0KCGHJdQPrdhsKgjqL0mlBMncS+8ZLs2y4Jbu9MuRtb33u0kbvRxTZOfSza1vI25vg==} + + '@codingame/monaco-vscode-f1bbc6d3-6129-583c-a2ba-c80b832993d2-common@22.1.3': + resolution: {integrity: sha512-4mWTe1SBb+10+YreF/V0JDr3rHLzAHHyBqosZLfheXRv5AVVXCRzuVXcTzSeMp2KdNyvHQq8EJoPtU8NXXgwWw==} + + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common@22.1.3': + resolution: {integrity: sha512-qVbVZ/BWBq31qciMyDjafm73fe/HmTuAf5FFcKorba6lCmq76UE5GBZVhI1fq9klII4GPgw0CvJbvVdePkj63A==} + + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common@22.1.3': + resolution: {integrity: sha512-wjg4Lo/TDosn4KRs3uLcpYkFEgcVjszY1Fxv3WXVAxv1HvklGeFJ4BtvfCPXHb9zUonk5FVb8cOw2LHUwc9gtw==} + + '@codingame/monaco-vscode-ff9fa663-eae3-5274-8573-c2b918871e4b-common@22.1.3': + resolution: {integrity: sha512-kdt04j2I92aPj8WmX/XP/ods3du4e9eRqh+z4ekPPMDxPbOaosHztvewIHwnOOZ/VTYA6Btr4lEJTpwNa+NvSA==} + + '@codingame/monaco-vscode-files-service-override@22.1.3': + resolution: {integrity: sha512-yFm/u4in5I7AVYpVcSBsXu3uEKJTL6ogayrBbbzL8Xb25BTH6/iH43UZFHVqXjwN7aRBv7eS6p4LImRIZwVMvA==} + + '@codingame/monaco-vscode-host-service-override@22.1.3': + resolution: {integrity: sha512-93JwTgISEVdTRzZBGvk1roYzoNkO3I+VogTo30ACyNsbxJQ7cP1OdSFJV24NFx/wk9/g9eBcYqpcn61Wy9g9cQ==} + + '@codingame/monaco-vscode-keybindings-service-override@22.1.3': + resolution: {integrity: sha512-9GhCUga0EtkR7pLlenXsWYKONyG96ej3nHW5Xc+lT5TznlvrbqKhnbDsWY6iYhVlopLV2JCWRFmJIZawfkClLg==} + + '@codingame/monaco-vscode-language-pack-cs@22.1.3': + resolution: {integrity: sha512-0UohboUu+jH08zeTMNYtnlwOa8ThuQwD9uJMJSCyq7wbKHBtN1bLfbAutw6KvFwybNoYJodv2sxFMvtUnSqfzA==} + + '@codingame/monaco-vscode-language-pack-de@22.1.3': + resolution: {integrity: sha512-lkOjS5WKhp91+q4y3Zc5Z9HuMWkPz8VX2VeJL538d6QmDz6iJDotsiy//XCY6g1sTvRbRlkxdogshGyoISAEQA==} + + '@codingame/monaco-vscode-language-pack-es@22.1.3': + resolution: {integrity: sha512-aMYmhGxKb1kh74CzrigWxN9VBmze9p99EP3RKcbL0gQe2FHNSMp5RlrJF3IxD5Ck354iQe+k2nin0FsTjnPlsw==} + + '@codingame/monaco-vscode-language-pack-fr@22.1.3': + resolution: {integrity: sha512-ZHJgu6028gqyKndaTUos7MbStyqmZ7T8A9IFEMMoZtN51+8sGSxFF9GGvNLxuzQftZTxLMG4n2SnStIu5obm7w==} + + '@codingame/monaco-vscode-language-pack-it@22.1.3': + resolution: {integrity: sha512-uNJ1diJGFgYP99REu4NfCWtbhyDwFDn7vX6pUNHG93dlAdoDQcM3AT2TRV6hpLLXWxT20Vhs+xRsYU5hkyEJrQ==} + + '@codingame/monaco-vscode-language-pack-ja@22.1.3': + resolution: {integrity: sha512-7WqbgEM29A9pK8fqha34qOTXJ9/mBoa5nCs+Df7JYfN9cEXhwXSxErzPlrtiljX25CDPirXp3Lkkoi2R0d2vYA==} + + '@codingame/monaco-vscode-language-pack-ko@22.1.3': + resolution: {integrity: sha512-WyRF1+rZ2OMfDGAouCvoXtxMcQ4MpQzp5U3uHkpbFT2zH8s8Vsk2Jb7tZ/D6UHf0XulQLL3yNYPeZbvkoPD/Og==} + + '@codingame/monaco-vscode-language-pack-pl@22.1.3': + resolution: {integrity: sha512-N6Pw3aivYrwA19Aj0qAz5jS0G0oJg3jAMj8iLdeFoVlyl6E6Fozd6RC4vB5KAzIXpVFtcOc0oO8lMcDdVWewtA==} + + '@codingame/monaco-vscode-language-pack-pt-br@22.1.3': + resolution: {integrity: sha512-kDf6WRuVD5DLl35CXseI8sgwVFGsuegaGD9t8AyQLV3f5eQyWhzrANi8mHZnefGVjiwcmfHv5kICLXffoygukA==} + + '@codingame/monaco-vscode-language-pack-qps-ploc@22.1.3': + resolution: {integrity: sha512-0Y+KOs+GS2dncIPuQA3CRK525uKelnzM6bARETJHtFDovHQYNj6cBf1+DEFdVo0HL+UXh0xae+Ks9wof7SpwJw==} + + '@codingame/monaco-vscode-language-pack-ru@22.1.3': + resolution: {integrity: sha512-AMXhiPLcwCpareq8pVA05oQGHq0AKylfSw9vn63dlenx7LNjcay/NlWl92IydswJ8MbPrTRRMgfEge2dxRH/Og==} + + '@codingame/monaco-vscode-language-pack-tr@22.1.3': + resolution: {integrity: sha512-Z1rjbbltz45zkZpHL/2doysZO0HZtbM49NGWXkKMyZV5DBCTTvoAan1iQchVWcJn9HH4XBB0+Mx2UFnnshXLJQ==} + + '@codingame/monaco-vscode-language-pack-zh-hans@22.1.3': + resolution: {integrity: sha512-p582msr7sjw5nT2ICDq49gOm2UfZlF7xtUYMVBNmPvTnyl58GlJTbbp6VqZVRhkkyyiZneMmaxdTaK/ZwUyxug==} + + '@codingame/monaco-vscode-language-pack-zh-hant@22.1.3': + resolution: {integrity: sha512-0SVtX6iLykQc2DYNPRyRaF3QZ8B+63jOxLBF2CH3JVk6BJSxqEKnjx7NwW2cL2ME5vNQrBe5C5EgKj32UmGRjg==} + + '@codingame/monaco-vscode-languages-service-override@22.1.3': + resolution: {integrity: sha512-l1E1964HQOiFltCLvSUSb3gJ1xL4tgKNF9hyU9HnYqaJMm8ma2R/V8QrNE+LTsVLLiICXw8UUsXjZZ9odxjZlw==} + + '@codingame/monaco-vscode-layout-service-override@22.1.3': + resolution: {integrity: sha512-iGTqOF0tNvR29WLGAxErcK8ZR7JJg6Qd76Oh/7MfmVE7nSO2HuoRzgyJFO0oEA1+uL3WRBhc+oVXLeEq0Wq6ZQ==} + + '@codingame/monaco-vscode-localization-service-override@22.1.3': + resolution: {integrity: sha512-xk6Huw29vmM30X7OaBn6NMKltkiBa+aw2ighHOeZxV0A4j0R4cMaD8pAKDq1xIWFve5cyHIpdfie8LTEnGCzcg==} + + '@codingame/monaco-vscode-log-service-override@22.1.3': + resolution: {integrity: sha512-V5yO0s9U62pE7rvpONiywulAqlg5oMuoeTi2M/79Y9he4MbAokpH4Wq3BIg5suwrDuvtzQa8mcx3LMaWhftiwQ==} + + '@codingame/monaco-vscode-model-service-override@22.1.3': + resolution: {integrity: sha512-KgejX5PJR2uCh+APIT9SBcYnGo27YkgW7Lfju8x7mrSrrHokMnGswTbTDy8al+mBar3bhXJiYHXBcYYPzyfhLw==} + + '@codingame/monaco-vscode-monarch-service-override@22.1.3': + resolution: {integrity: sha512-YNOekrO1DShaY8Bb95p2KhTmQfjQREaYZSu+VOcsmIZ0rmTFK7sUACEdkKRl0IsvmtvFH+AkCBj8lw39v6bBDw==} + + '@codingame/monaco-vscode-quickaccess-service-override@22.1.3': + resolution: {integrity: sha512-hoPjhikj/9fKCnOivAH0XK55A60HL5Z56UykHbhHw+XNoz8ky4ArXhupGHQ9VmRz4u6EXCWTFjl+FjyocGkD7g==} + + '@codingame/monaco-vscode-textmate-service-override@22.1.3': + resolution: {integrity: sha512-8jSkH2W538xxuLxPFMy/h5DoMwO7zWno74aflekWXMHPVFXOrI7vtBq7gP2m+PUTldwWAPDbOt/x+kZxsrv5yg==} + + '@codingame/monaco-vscode-theme-defaults-default-extension@22.1.3': + resolution: {integrity: sha512-ohkEK+13PWGLfTtgjHFwvMonzF8jWlP9w2R1cpp9s+MbKrjwrDG41iADZwz5sKmqAen3t7xQwJwM1A9Id0t5OA==} + + '@codingame/monaco-vscode-theme-service-override@22.1.3': + resolution: {integrity: sha512-yPe6GYhcJnVwYtw71Btr3F+B0HEX+PiNWo6Zh1FDwsG9fqQPJ1AFKNQ4RV3OmgcMYYiRxCJPr0azLiJFp1q6ig==} + + '@codingame/monaco-vscode-view-banner-service-override@22.1.3': + resolution: {integrity: sha512-eQxIcLmECY8QlSpuy7kPfd2nfI5abjEGPc5KGKjKqLRZTHtn3cUWBbzOKQ2QR5b4gDdZoVdfAH9KAM3zwnUqXQ==} + + '@codingame/monaco-vscode-view-common-service-override@22.1.3': + resolution: {integrity: sha512-brWJdvLRmxpI5dWXAnL6JOSj3WbODabO5SelC5JzvbY0X2Pls7EzfsfvunS6Hs4tpShRKK8YBMo+SLkzwvjtWg==} + + '@codingame/monaco-vscode-view-status-bar-service-override@22.1.3': + resolution: {integrity: sha512-9eknqf/2hcF0Aw9WMf4sxl4Fvmp1peqZd+nr5cVy52gfJa2vxoAvSsb2SoQAKMKgZJ16rW9wcwVRlWMB89CXEA==} + + '@codingame/monaco-vscode-view-title-bar-service-override@22.1.3': + resolution: {integrity: sha512-zANP9IrHpaOG5sGpnczS6V2Bfz3KnX7/0lrZ2m+9avTE2lU0X9lgVH1cMNLAET3WGy9EQRhb5nbRTrkMp5sVBw==} + + '@codingame/monaco-vscode-views-service-override@22.1.3': + resolution: {integrity: sha512-qLO/LoL33pOCykAmGKfZWt/Q26YUXNwgKHFb7gztkKVRBXbaLg0u4sGiDJw2BPjxFACkRQG/bEN5q4jWl6izSg==} + + '@codingame/monaco-vscode-workbench-service-override@22.1.3': + resolution: {integrity: sha512-Z2fpiT63oqXSFyq8auby0hVGTvlOkdTtVQLtYEkBhb2MZvL116EL/X7RDnzdb9LmNGfTueqIhBQPiVxaUMH7eg==} + + '@dprint/darwin-arm64@0.50.2': + resolution: {integrity: sha512-4d08INZlTxbPW9LK9W8+93viN543/qA2Kxn4azVnPW/xCb2Im03UqJBz8mMm3nJZdtNnK3uTVG3ib1VW+XJisw==} + cpu: [arm64] + os: [darwin] + + '@dprint/darwin-x64@0.50.2': + resolution: {integrity: sha512-ZXWPBwdLojhdBATq+bKwJvB7D8bIzrD6eR/Xuq9UYE7evQazUiR069d9NPF0iVuzTo6wNf9ub9SXI7qDl11EGA==} + cpu: [x64] + os: [darwin] + + '@dprint/linux-arm64-glibc@0.50.2': + resolution: {integrity: sha512-marxQzRw8atXAnaawwZHeeUaaAVewrGTlFKKcDASGyjPBhc23J5fHPUPremm8xCbgYZyTlokzrV8/1rDRWhJcw==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-arm64-musl@0.50.2': + resolution: {integrity: sha512-oGDq44ydzo0ZkJk6RHcUzUN5sOMT5HC6WA8kHXI6tkAsLUkaLO2DzZFfW4aAYZUn+hYNpQfQD8iGew0sjkyLyg==} + cpu: [arm64] + os: [linux] + + '@dprint/linux-riscv64-glibc@0.50.2': + resolution: {integrity: sha512-QMmZoZYWsXezDcC03fBOwPfxhTpPEyHqutcgJ0oauN9QcSXGji9NSZITMmtLz2Ki3T1MIvdaLd1goGzNSvNqTQ==} + cpu: [riscv64] + os: [linux] + + '@dprint/linux-x64-glibc@0.50.2': + resolution: {integrity: sha512-KMeHEzb4teQJChTgq8HuQzc+reRNDnarOTGTQovAZ9WNjOtKLViftsKWW5HsnRHtP5nUIPE9rF1QLjJ/gUsqvw==} + cpu: [x64] + os: [linux] + + '@dprint/linux-x64-musl@0.50.2': + resolution: {integrity: sha512-qM37T7H69g5coBTfE7SsA+KZZaRBky6gaUhPgAYxW+fOsoVtZSVkXtfTtQauHTpqqOEtbxfCtum70Hz1fr1teg==} + cpu: [x64] + os: [linux] + + '@dprint/win32-arm64@0.50.2': + resolution: {integrity: sha512-kuGVHGoxLwssVDsodefUIYQRoO2fQncurH/xKgXiZwMPOSzFcgUzYJQiyqmJEp+PENhO9VT1hXUHZtlyCAWBUQ==} + cpu: [arm64] + os: [win32] + + '@dprint/win32-x64@0.50.2': + resolution: {integrity: sha512-N3l9k31c3IMfVXqL0L6ygIhJFvCIrfQ+Z5Jph6RnCcBO6oDYWeYhAv/qBk1vLsF2y/e79TKsR1tvaEwnrQ03XA==} + cpu: [x64] + os: [win32] + + '@esbuild/aix-ppc64@0.25.11': + resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.11': + resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.11': + resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.11': + resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.11': + resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.11': + resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.11': + resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.11': + resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.11': + resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.11': + resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.11': + resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.11': + resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.11': + resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.11': + resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.11': + resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.11': + resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.11': + resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.11': + resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.11': + resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.11': + resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.11': + resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.11': + resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.11': + resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.11': + resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.11': + resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.11': + resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/react-dom@2.1.6': + resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.27.16': + resolution: {integrity: sha512-9O8N4SeG2z++TSM8QA/KTeKFBVCNEz/AGS7gWPJf6KFRzmRWixFRnCnkPHRDwSVZW6QPDO6uT0P2SpWNKCc9/g==} + peerDependencies: + react: '>=17.0.0' + react-dom: '>=17.0.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mantine/core@8.3.6': + resolution: {integrity: sha512-paTl+0x+O/QtgMtqVJaG8maD8sfiOdgPmLOyG485FmeGZ1L3KMdEkhxZtmdGlDFsLXhmMGQ57ducT90bvhXX5A==} + peerDependencies: + '@mantine/hooks': 8.3.6 + react: ^18.x || ^19.x + react-dom: ^18.x || ^19.x + + '@mantine/hooks@8.3.6': + resolution: {integrity: sha512-liHfaWXHAkLjJy+Bkr29UsCwAoDQ/a64WrM67lksx8F0qqyjR5RQH8zVlhuOjdpQnwtlUkE/YiTvbJiPcoI0bw==} + peerDependencies: + react: ^18.x || ^19.x + + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} + + '@rollup/rollup-android-arm-eabi@4.52.5': + resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.52.5': + resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.52.5': + resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.52.5': + resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.52.5': + resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.52.5': + resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.52.5': + resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.52.5': + resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.52.5': + resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.52.5': + resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.52.5': + resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.52.5': + resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} + cpu: [x64] + os: [win32] + + '@tabler/icons-react@3.35.0': + resolution: {integrity: sha512-XG7t2DYf3DyHT5jxFNp5xyLVbL4hMJYJhiSdHADzAjLRYfL7AnjlRfiHDHeXxkb2N103rEIvTsBRazxXtAUz2g==} + peerDependencies: + react: '>= 16' + + '@tabler/icons@3.35.0': + resolution: {integrity: sha512-yYXe+gJ56xlZFiXwV9zVoe3FWCGuZ/D7/G4ZIlDtGxSx5CGQK110wrnT29gUj52kEZoxqF7oURTk97GQxELOFQ==} + + '@typefox/monaco-editor-react@7.2.0': + resolution: {integrity: sha512-Ua5WU+GQmXl1KKm2fbLFjBQRMMgNxAOcUkTH0Th+XzobQ70fRsS9/7kkeSQMlAgCwveeibFmGHOQKtibFN3uQw==} + engines: {node: '>=20.10.0', npm: '>=10.2.3'} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/emscripten@1.41.5': + resolution: {integrity: sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/react-dom@19.2.2': + resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.2': + resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@types/vscode@1.105.0': + resolution: {integrity: sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vitejs/plugin-react@5.1.0': + resolution: {integrity: sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + + '@vscode/iconv-lite-umd@0.7.0': + resolution: {integrity: sha512-bRRFxLfg5dtAyl5XyiVWz/ZBPahpOpPrNYnnHpOpUZvam4tKH35wdhP4Kj6PbM0+KdliOsPzbGWpkxcdpNB/sg==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + baseline-browser-mapping@2.8.21: + resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} + hasBin: true + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001752: + resolution: {integrity: sha512-vKUk7beoukxE47P5gcVNKkDRzXdVofotshHwfR9vmpeFKxmI5PBpgOMC18LUJUA/DvJ70Y7RveasIBraqsyO/g==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chevrotain-allstar@0.3.1: + resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} + peerDependencies: + chevrotain: ^11.0.0 + + chevrotain@11.0.3: + resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.0.0: + resolution: {integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==} + engines: {node: '>=16'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dompurify@3.2.7: + resolution: {integrity: sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==} + + dprint@0.50.2: + resolution: {integrity: sha512-+0Fzg+17jsMMUouK00/Fara5YtGOuE76EAJINHB8VpkXHd0n00rMXtw/03qorOgz23eo8Y0UpYvNZBJJo3aNtw==} + hasBin: true + + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} + + esbuild@0.25.11: + resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + html-url-attributes@3.0.1: + resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} + + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + jschardet@3.1.4: + resolution: {integrity: sha512-/kmVISmrwVwtyYU40iQUOp3SUPk2dhNCMsZBQX0R1/jZ8maaXJ/oZIzUOiyOqcgtLnETFKYChbJ5iDC/eWmFHg==} + engines: {node: '>=0.1.90'} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + + langium-cli@2.1.0: + resolution: {integrity: sha512-Gbj4CvfAc1gP/6ihxikd2Je95j1FWjXZu8bbji2/t2vQ6kEP+vs9Fx7kSGOM0AbU/hjZfy6E35bJPOdwsiyqTA==} + engines: {node: '>=16.0.0'} + hasBin: true + + langium-railroad@2.1.0: + resolution: {integrity: sha512-2IeAIUSTQzbDjNnJA+0ql8tyN/mhCSN4FS50Mo9LOtLj523qUEBwHflDmCiOGZzW9iZdni6NXJgh8nLqjhTlDw==} + + langium@2.1.3: + resolution: {integrity: sha512-/WN1xHoNBg0mi1Jp9ydMFSHIv8Jhq7K+0stNVURdoG4NgZx4/06AfNeeixmmU8X842wBl9gFZJP5O93Ge5Oasw==} + engines: {node: '>=16.0.0'} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + marked@14.0.0: + resolution: {integrity: sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==} + engines: {node: '>= 18'} + hasBin: true + + mdast-util-from-markdown@2.0.2: + resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + monaco-languageclient@10.2.0: + resolution: {integrity: sha512-8R2XJPNnhqob2xYjhJX+lHXTHXirAoottNrzsyth7JR3S+wvwKKJg8hQWm9jWQjQ3LUb/3f8WOPE8bWwk3AZRw==} + engines: {node: '>=20.10.0', npm: '>=10.2.3'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neverthrow@8.2.0: + resolution: {integrity: sha512-kOCT/1MCPAxY5iUV3wytNFUMUolzuwd/VF/1KCx7kf6CutrOsTie+84zTGTpgQycjvfLdBBdvBvFLqFD2c0wkQ==} + engines: {node: '>=18'} + + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + postcss-js@4.1.0: + resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-mixins@12.1.2: + resolution: {integrity: sha512-90pSxmZVfbX9e5xCv7tI5RV1mnjdf16y89CJKbf/hD7GyOz1FCxcYMl8ZYA8Hc56dbApTKKmU9HfvgfWdCxlwg==} + engines: {node: ^20.0 || ^22.0 || >=24.0} + peerDependencies: + postcss: ^8.2.14 + + postcss-nested@7.0.2: + resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-preset-mantine@1.18.0: + resolution: {integrity: sha512-sP6/s1oC7cOtBdl4mw/IRKmKvYTuzpRrH/vT6v9enMU/EQEQ31eQnHcWtFghOXLH87AAthjL/Q75rLmin1oZoA==} + peerDependencies: + postcss: '>=8.0.0' + + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} + engines: {node: '>=4'} + + postcss-simple-vars@7.0.1: + resolution: {integrity: sha512-5GLLXaS8qmzHMOjVxqkk1TZPf1jMqesiI7qLhnlyERalG0sMbHIbJqrcnrpmZdKCLglHnRHoEBB61RtGTsj++A==} + engines: {node: '>=14.0'} + peerDependencies: + postcss: ^8.2.1 + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + railroad-diagrams@1.0.0: + resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} + + react-dom@19.2.0: + resolution: {integrity: sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==} + peerDependencies: + react: ^19.2.0 + + react-markdown@10.1.0: + resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} + peerDependencies: + '@types/react': '>=18' + react: '>=18' + + react-number-format@5.4.4: + resolution: {integrity: sha512-wOmoNZoOpvMminhifQYiYSTCLUDOiUbBunrMrMjA+dV52sY+vck1S4UhR6PkgnoCquvvMSeJjErXZ4qSaWCliA==} + peerDependencies: + react: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-textarea-autosize@8.5.9: + resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + react@19.2.0: + resolution: {integrity: sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==} + engines: {node: '>=0.10.0'} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + rollup@4.52.5: + resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + style-to-js@1.1.18: + resolution: {integrity: sha512-JFPn62D4kJaPTnhFUI244MThx+FEGbi+9dw1b9yBBQ+1CZpV7QAT8kUtJ7b7EUNdHajjF/0x8fT+16oLJoojLg==} + + style-to-object@1.0.11: + resolution: {integrity: sha512-5A560JmXr7wDyGLK12Nq/EYS38VkGlglVzkis1JEdbGWSnbQIEhZzTJhzURXN5/8WwwFCs/f/VVcmkTppbXLow==} + + sugarss@5.0.1: + resolution: {integrity: sha512-ctS5RYCBVvPoZAnzIaX5QSShK8ZiZxD5HUqSxlusvEMC+QZQIPCPOIJg6aceFX+K2rf4+SH89eu++h1Zmsr2nw==} + engines: {node: '>=18.0'} + peerDependencies: + postcss: ^8.3.3 + + tabbable@6.3.0: + resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-composed-ref@1.4.0: + resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-isomorphic-layout-effect@1.2.1: + resolution: {integrity: sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-latest@1.3.0: + resolution: {integrity: sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.1.12: + resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-jsonrpc@8.2.1: + resolution: {integrity: sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==} + engines: {node: '>=14.0.0'} + + vscode-languageclient@9.0.1: + resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} + engines: {vscode: ^1.82.0} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.12: + resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@9.2.0: + resolution: {integrity: sha512-rkvG4SraZQaPSN/5XjwKswdU0OP9MF28QjrYzUBbhb8QyG3ljB1Ky996m++jiI7KdiAP2CkBiQZd9pqEDTClqA==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vscode-ws-jsonrpc@3.5.0: + resolution: {integrity: sha512-13ZDy7Od4AfEPK2HIfY3DtyRi4FVsvFql1yobVJrpIoHOKGGJpIjVvIJpMxkrHzCZzWlYlg+WEu2hrYkCTvM0Q==} + engines: {node: '>=20.10.0', npm: '>=10.2.3'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@babel/code-frame@7.27.1': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.28.5': {} + + '@babel/core@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.27.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.27.1': + dependencies: + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.27.1': {} + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/helper-validator-option@7.27.1': {} + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/runtime@7.28.4': {} + + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@babel/traverse@7.28.5': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.5 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.5 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@chevrotain/cst-dts-gen@11.0.3': + dependencies: + '@chevrotain/gast': 11.0.3 + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/gast@11.0.3': + dependencies: + '@chevrotain/types': 11.0.3 + lodash-es: 4.17.21 + + '@chevrotain/regexp-to-ast@11.0.3': {} + + '@chevrotain/types@11.0.3': {} + + '@chevrotain/utils@11.0.3': {} + + '@codingame/esbuild-import-meta-url-plugin@1.0.3': + dependencies: + esbuild: 0.25.11 + import-meta-resolve: 4.2.0 + + '@codingame/monaco-vscode-05a2a821-e4de-5941-b7f9-bbf01c09f229-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-b6d52a6d-8c8e-51f5-bcd2-1722295e31d9-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-08d1b4da-daf2-5f0d-8c50-ca6a6986c50f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + + '@codingame/monaco-vscode-0c06bfba-d24d-5c4d-90cd-b40cefb7f811-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common': 22.1.3 + + '@codingame/monaco-vscode-1021b67c-93e5-5c78-a270-cbdb2574d980-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-15626ec7-b165-51e1-8caf-7bcc2ae9b95a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-1b4486de-4fe4-59c4-9e6d-34f265ff6625-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common': 22.1.3 + '@codingame/monaco-vscode-422642f2-7e3a-5c1c-9e1e-1d3ef1817346-common': 22.1.3 + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-9a1a5840-af83-5d07-a156-ba32a36c5c4b-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-23aade48-f094-5c08-9555-97fc9cca96c9-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-249dc928-1da3-51c1-82d0-45e0ba9d08a1-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-256d5b78-0649-50e9-8354-2807f95f68f4-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-2a22c7b4-b906-5914-8cd1-3ed912fb738f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-4a3ac544-9a61-534c-88df-756262793ef7-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-2f06fe84-148e-5e6b-a7ca-c7989c5f128a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-3109a756-1f83-5d09-945b-9f0fcad928f0-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common': 22.1.3 + + '@codingame/monaco-vscode-33833ac7-3af3-5e9d-8fb9-11838d852c59-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-37b3b402-09f5-5f69-89ef-ce30559f63cc-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-422642f2-7e3a-5c1c-9e1e-1d3ef1817346-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-494be54c-bd37-5b3c-af70-02f086e28768-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-4a316137-39d1-5d77-8b53-112db3547c1e-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + + '@codingame/monaco-vscode-4a3ac544-9a61-534c-88df-756262793ef7-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-5084de40-f866-5cb5-9d9b-33a10f6f235d-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-b994942c-360d-5b68-8a33-77d4bde6b714-common': 22.1.3 + + '@codingame/monaco-vscode-51e7513d-a395-525d-b226-639aa8c6cc2d-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-523730aa-81e6-55d7-9916-87ad537fe087-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + + '@codingame/monaco-vscode-5452e2b7-9081-5f95-839b-4ab3544ce28f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-7969284a-1a12-5148-9750-fcf9656a693f-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-571c8352-7953-5038-9f09-e03bb6219a0e-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-08d1b4da-daf2-5f0d-8c50-ca6a6986c50f-common': 22.1.3 + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common': 22.1.3 + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + + '@codingame/monaco-vscode-6845754f-e617-5ed9-8aaa-6ca3653a9532-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-6980eeab-47bb-5a48-8e15-32caf0785565-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common': 22.1.3 + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common': 22.1.3 + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common': 22.1.3 + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common': 22.1.3 + '@codingame/monaco-vscode-6bf85d7b-e6e3-54e9-9bc1-7e08d663f0f6-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-6bf85d7b-e6e3-54e9-9bc1-7e08d663f0f6-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-96e83782-7f38-572e-8787-02e981f1c54f-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common': 22.1.3 + + '@codingame/monaco-vscode-6db1b967-5327-5c5c-8c17-bd92774c0fb2-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + + '@codingame/monaco-vscode-7869cfe8-f42c-5721-9f2b-7d04a6a41f16-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-7969284a-1a12-5148-9750-fcf9656a693f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-7f39b6f1-3542-5430-8760-0f404d7a7cee-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-897bebad-39df-57cb-8a57-36a271d038be-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-89a82baf-8ded-5b2f-b8af-e5fbd72dc5ad-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-256d5b78-0649-50e9-8354-2807f95f68f4-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-8ccb7637-50ea-5359-97bf-00015d7fe567-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-6db1b967-5327-5c5c-8c17-bd92774c0fb2-common': 22.1.3 + '@codingame/monaco-vscode-897bebad-39df-57cb-8a57-36a271d038be-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-96e83782-7f38-572e-8787-02e981f1c54f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-51e7513d-a395-525d-b226-639aa8c6cc2d-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common': 22.1.3 + + '@codingame/monaco-vscode-9a1a5840-af83-5d07-a156-ba32a36c5c4b-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-9c84f943-bcb5-5bcf-92a6-91f66a732f26-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-9d0168a3-519b-57f3-9bcc-89efc41f951a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-9ee79c1a-3f03-568b-8eac-b02513a98b68-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-e39a1c8f-7892-5d9b-9987-7b10b79e1a0a-common': 22.1.3 + + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-51e7513d-a395-525d-b226-639aa8c6cc2d-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-a175bd1a-4858-5944-9ae5-fb73305dcb13-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-a3eaa464-944c-5b8f-8886-213068ba4897-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-a654b07e-8806-5425-b124-18f03ba8e11a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-a9da9abe-278d-5ce6-9418-99c7c07c5c37-common@22.1.3': {} + + '@codingame/monaco-vscode-abed5a84-8a82-5f84-9412-88a736235bae-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common': 22.1.3 + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-bd0792ac-6043-5ec3-a41a-54ccb922a1f4-common': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + + '@codingame/monaco-vscode-api@22.1.3': + dependencies: + '@codingame/monaco-vscode-base-service-override': 22.1.3 + '@codingame/monaco-vscode-environment-service-override': 22.1.3 + '@codingame/monaco-vscode-extensions-service-override': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + '@codingame/monaco-vscode-host-service-override': 22.1.3 + '@codingame/monaco-vscode-layout-service-override': 22.1.3 + '@codingame/monaco-vscode-quickaccess-service-override': 22.1.3 + '@vscode/iconv-lite-umd': 0.7.0 + dompurify: 3.2.7 + jschardet: 3.1.4 + marked: 14.0.0 + + '@codingame/monaco-vscode-b6d52a6d-8c8e-51f5-bcd2-1722295e31d9-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-a175bd1a-4858-5944-9ae5-fb73305dcb13-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-b994942c-360d-5b68-8a33-77d4bde6b714-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-base-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-23aade48-f094-5c08-9555-97fc9cca96c9-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-9a1a5840-af83-5d07-a156-ba32a36c5c4b-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d987325e-3e05-53aa-b9ff-6f97476f64db-common': 22.1.3 + + '@codingame/monaco-vscode-bba55be6-41a2-50cd-a3cc-8bafa35bfa89-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-bd0792ac-6043-5ec3-a41a-54ccb922a1f4-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common': 22.1.3 + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + + '@codingame/monaco-vscode-be143a32-d60a-5489-a1d2-c83ea7eff6bf-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-bf94ddb5-e436-506a-9763-5ab86b642508-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-bulk-edit-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-ce7c734f-7712-563c-9335-d7acb43306af-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-cea4d01f-6526-5c2f-8b09-b168fead499f-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-configuration-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-422642f2-7e3a-5c1c-9e1e-1d3ef1817346-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-ce7c734f-7712-563c-9335-d7acb43306af-common': 22.1.3 + '@codingame/monaco-vscode-d987325e-3e05-53aa-b9ff-6f97476f64db-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + + '@codingame/monaco-vscode-d26a96d3-122c-5a3d-a04d-deb5ff0f19c0-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-d481a59e-259c-524e-bee1-76483d75d3a1-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-523730aa-81e6-55d7-9916-87ad537fe087-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common': 22.1.3 + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + + '@codingame/monaco-vscode-d609a7d3-bf87-551a-884f-550a8b327ec5-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-d987325e-3e05-53aa-b9ff-6f97476f64db-common@22.1.3': {} + + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common': 22.1.3 + + '@codingame/monaco-vscode-e39a1c8f-7892-5d9b-9987-7b10b79e1a0a-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-e59ecb8c-db32-5324-8fe4-cf9921fd92b8-common@22.1.3': {} + + '@codingame/monaco-vscode-e72c94ca-257a-5b75-8b68-5a5fa3c18255-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d609a7d3-bf87-551a-884f-550a8b327ec5-common': 22.1.3 + + '@codingame/monaco-vscode-eb7d5efd-2e60-59f8-9ba4-9a8ae8cb2957-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-9ee79c1a-3f03-568b-8eac-b02513a98b68-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-e39a1c8f-7892-5d9b-9987-7b10b79e1a0a-common': 22.1.3 + + '@codingame/monaco-vscode-eba0b9b3-174c-5dae-9867-a37810ca1808-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-eda30bac-0984-5b42-9362-c68996b85232-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common': 22.1.3 + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-editor-api@22.1.3': + dependencies: + '@codingame/monaco-vscode-5452e2b7-9081-5f95-839b-4ab3544ce28f-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-editor-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-environment-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-abed5a84-8a82-5f84-9412-88a736235bae-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-extension-api@22.1.3': + dependencies: + '@codingame/monaco-vscode-4a3ac544-9a61-534c-88df-756262793ef7-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-extensions-service-override': 22.1.3 + + '@codingame/monaco-vscode-extensions-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-05a2a821-e4de-5941-b7f9-bbf01c09f229-common': 22.1.3 + '@codingame/monaco-vscode-249dc928-1da3-51c1-82d0-45e0ba9d08a1-common': 22.1.3 + '@codingame/monaco-vscode-256d5b78-0649-50e9-8354-2807f95f68f4-common': 22.1.3 + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common': 22.1.3 + '@codingame/monaco-vscode-4a3ac544-9a61-534c-88df-756262793ef7-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-5084de40-f866-5cb5-9d9b-33a10f6f235d-common': 22.1.3 + '@codingame/monaco-vscode-571c8352-7953-5038-9f09-e03bb6219a0e-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common': 22.1.3 + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-6845754f-e617-5ed9-8aaa-6ca3653a9532-common': 22.1.3 + '@codingame/monaco-vscode-7969284a-1a12-5148-9750-fcf9656a693f-common': 22.1.3 + '@codingame/monaco-vscode-7f39b6f1-3542-5430-8760-0f404d7a7cee-common': 22.1.3 + '@codingame/monaco-vscode-8ccb7637-50ea-5359-97bf-00015d7fe567-common': 22.1.3 + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-a654b07e-8806-5425-b124-18f03ba8e11a-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-a9da9abe-278d-5ce6-9418-99c7c07c5c37-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-b994942c-360d-5b68-8a33-77d4bde6b714-common': 22.1.3 + '@codingame/monaco-vscode-bba55be6-41a2-50cd-a3cc-8bafa35bfa89-common': 22.1.3 + '@codingame/monaco-vscode-bf94ddb5-e436-506a-9763-5ab86b642508-common': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-eb7d5efd-2e60-59f8-9ba4-9a8ae8cb2957-common': 22.1.3 + '@codingame/monaco-vscode-eba0b9b3-174c-5dae-9867-a37810ca1808-common': 22.1.3 + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + + '@codingame/monaco-vscode-f1bbc6d3-6129-583c-a2ba-c80b832993d2-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-f22e7e55-aee8-5b52-a6bc-950efd9f5890-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-ff9fa663-eae3-5274-8573-c2b918871e4b-common@22.1.3': {} + + '@codingame/monaco-vscode-files-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-0c06bfba-d24d-5c4d-90cd-b40cefb7f811-common': 22.1.3 + '@codingame/monaco-vscode-15626ec7-b165-51e1-8caf-7bcc2ae9b95a-common': 22.1.3 + '@codingame/monaco-vscode-2f06fe84-148e-5e6b-a7ca-c7989c5f128a-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-cea4d01f-6526-5c2f-8b09-b168fead499f-common': 22.1.3 + + '@codingame/monaco-vscode-host-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-keybindings-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-2a22c7b4-b906-5914-8cd1-3ed912fb738f-common': 22.1.3 + '@codingame/monaco-vscode-37b3b402-09f5-5f69-89ef-ce30559f63cc-common': 22.1.3 + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common': 22.1.3 + '@codingame/monaco-vscode-a3eaa464-944c-5b8f-8886-213068ba4897-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d609a7d3-bf87-551a-884f-550a8b327ec5-common': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + + '@codingame/monaco-vscode-language-pack-cs@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-de@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-es@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-fr@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-it@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-ja@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-ko@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-pl@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-pt-br@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-qps-ploc@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-ru@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-tr@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-zh-hans@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-language-pack-zh-hant@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-languages-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + + '@codingame/monaco-vscode-layout-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-6bf85d7b-e6e3-54e9-9bc1-7e08d663f0f6-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-localization-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-a654b07e-8806-5425-b124-18f03ba8e11a-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-log-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-abed5a84-8a82-5f84-9412-88a736235bae-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-cea4d01f-6526-5c2f-8b09-b168fead499f-common': 22.1.3 + '@codingame/monaco-vscode-environment-service-override': 22.1.3 + + '@codingame/monaco-vscode-model-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-0c06bfba-d24d-5c4d-90cd-b40cefb7f811-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + + '@codingame/monaco-vscode-monarch-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-quickaccess-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-9a1a5840-af83-5d07-a156-ba32a36c5c4b-common': 22.1.3 + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-d609a7d3-bf87-551a-884f-550a8b327ec5-common': 22.1.3 + '@codingame/monaco-vscode-eda30bac-0984-5b42-9362-c68996b85232-common': 22.1.3 + + '@codingame/monaco-vscode-textmate-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-33833ac7-3af3-5e9d-8fb9-11838d852c59-common': 22.1.3 + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-be143a32-d60a-5489-a1d2-c83ea7eff6bf-common': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + vscode-oniguruma: 1.7.0 + vscode-textmate: 9.2.0 + + '@codingame/monaco-vscode-theme-defaults-default-extension@22.1.3': + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-theme-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-9a934394-0cf8-512d-939b-77e71f69cebb-common': 22.1.3 + '@codingame/monaco-vscode-9d0168a3-519b-57f3-9bcc-89efc41f951a-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-files-service-override': 22.1.3 + + '@codingame/monaco-vscode-view-banner-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-view-common-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-0c06bfba-d24d-5c4d-90cd-b40cefb7f811-common': 22.1.3 + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common': 22.1.3 + '@codingame/monaco-vscode-158b9837-fc78-5d9c-86f5-9134e4358643-common': 22.1.3 + '@codingame/monaco-vscode-1b4486de-4fe4-59c4-9e6d-34f265ff6625-common': 22.1.3 + '@codingame/monaco-vscode-2a94c04a-b85b-5669-b06b-89c1bfa11cb9-common': 22.1.3 + '@codingame/monaco-vscode-3109a756-1f83-5d09-945b-9f0fcad928f0-common': 22.1.3 + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common': 22.1.3 + '@codingame/monaco-vscode-4a316137-39d1-5d77-8b53-112db3547c1e-common': 22.1.3 + '@codingame/monaco-vscode-501b06ab-3f58-516b-8a1a-c29d375d3da4-common': 22.1.3 + '@codingame/monaco-vscode-523730aa-81e6-55d7-9916-87ad537fe087-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-615ce609-8555-545a-a549-47bd9f80e9f8-common': 22.1.3 + '@codingame/monaco-vscode-670aae94-7f88-54d7-90ea-6fcbef423557-common': 22.1.3 + '@codingame/monaco-vscode-6980eeab-47bb-5a48-8e15-32caf0785565-common': 22.1.3 + '@codingame/monaco-vscode-6db1b967-5327-5c5c-8c17-bd92774c0fb2-common': 22.1.3 + '@codingame/monaco-vscode-72a1b7d3-3f58-5545-9b7e-f579bd003081-common': 22.1.3 + '@codingame/monaco-vscode-7869cfe8-f42c-5721-9f2b-7d04a6a41f16-common': 22.1.3 + '@codingame/monaco-vscode-7f39b6f1-3542-5430-8760-0f404d7a7cee-common': 22.1.3 + '@codingame/monaco-vscode-897bebad-39df-57cb-8a57-36a271d038be-common': 22.1.3 + '@codingame/monaco-vscode-89a82baf-8ded-5b2f-b8af-e5fbd72dc5ad-common': 22.1.3 + '@codingame/monaco-vscode-8ccb7637-50ea-5359-97bf-00015d7fe567-common': 22.1.3 + '@codingame/monaco-vscode-9c84f943-bcb5-5bcf-92a6-91f66a732f26-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-a17e9d37-b6c1-5556-8402-5db73960fae3-common': 22.1.3 + '@codingame/monaco-vscode-a654b07e-8806-5425-b124-18f03ba8e11a-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-ac93482b-2178-52df-a200-ba0d1a4963fb-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-bc6d9a89-1625-5010-b57e-ff44151144fe-common': 22.1.3 + '@codingame/monaco-vscode-bulk-edit-service-override': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d26a96d3-122c-5a3d-a04d-deb5ff0f19c0-common': 22.1.3 + '@codingame/monaco-vscode-d481a59e-259c-524e-bee1-76483d75d3a1-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + '@codingame/monaco-vscode-e59ecb8c-db32-5324-8fe4-cf9921fd92b8-common': 22.1.3 + '@codingame/monaco-vscode-e72c94ca-257a-5b75-8b68-5a5fa3c18255-common': 22.1.3 + '@codingame/monaco-vscode-f1bbc6d3-6129-583c-a2ba-c80b832993d2-common': 22.1.3 + '@codingame/monaco-vscode-f24e325c-2ce0-5bba-8236-bfc4f53180ab-common': 22.1.3 + '@codingame/monaco-vscode-ff9fa663-eae3-5274-8573-c2b918871e4b-common': 22.1.3 + + '@codingame/monaco-vscode-view-status-bar-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-0cc5da60-f921-59b9-bd8c-a018e93c0a6f-common': 22.1.3 + '@codingame/monaco-vscode-622c0cca-d5fa-59b6-b730-0715afcf93ee-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + + '@codingame/monaco-vscode-view-title-bar-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-08d1b4da-daf2-5f0d-8c50-ca6a6986c50f-common': 22.1.3 + '@codingame/monaco-vscode-40cada32-7e9c-528a-81fc-766e4da54147-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-51e7513d-a395-525d-b226-639aa8c6cc2d-common': 22.1.3 + '@codingame/monaco-vscode-60014c9d-b815-501d-83a9-4b08725c2ec2-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-96e83782-7f38-572e-8787-02e981f1c54f-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-dbfe5f85-b426-55ed-a79b-5f811b395762-common': 22.1.3 + + '@codingame/monaco-vscode-views-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-6980eeab-47bb-5a48-8e15-32caf0785565-common': 22.1.3 + '@codingame/monaco-vscode-6bf85d7b-e6e3-54e9-9bc1-7e08d663f0f6-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-keybindings-service-override': 22.1.3 + '@codingame/monaco-vscode-layout-service-override': 22.1.3 + '@codingame/monaco-vscode-quickaccess-service-override': 22.1.3 + '@codingame/monaco-vscode-view-common-service-override': 22.1.3 + + '@codingame/monaco-vscode-workbench-service-override@22.1.3': + dependencies: + '@codingame/monaco-vscode-1021b67c-93e5-5c78-a270-cbdb2574d980-common': 22.1.3 + '@codingame/monaco-vscode-256d5b78-0649-50e9-8354-2807f95f68f4-common': 22.1.3 + '@codingame/monaco-vscode-494be54c-bd37-5b3c-af70-02f086e28768-common': 22.1.3 + '@codingame/monaco-vscode-4bf376c2-03c7-58cb-8303-c67aeefa3d3d-common': 22.1.3 + '@codingame/monaco-vscode-6980eeab-47bb-5a48-8e15-32caf0785565-common': 22.1.3 + '@codingame/monaco-vscode-85886bdb-61c5-52f1-8eb7-d1d32f6f8cbd-common': 22.1.3 + '@codingame/monaco-vscode-9c84f943-bcb5-5bcf-92a6-91f66a732f26-common': 22.1.3 + '@codingame/monaco-vscode-9efc1f50-c7de-55d6-8b28-bcc88bd49b5a-common': 22.1.3 + '@codingame/monaco-vscode-a8d3bd74-e63e-5327-96e8-4f931661e329-common': 22.1.3 + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-caeb744c-8e3f-5c11-80fb-0f057d24d544-common': 22.1.3 + '@codingame/monaco-vscode-d941ac7b-412f-57e3-b1bf-f6b0eb253b21-common': 22.1.3 + '@codingame/monaco-vscode-keybindings-service-override': 22.1.3 + '@codingame/monaco-vscode-quickaccess-service-override': 22.1.3 + '@codingame/monaco-vscode-view-banner-service-override': 22.1.3 + '@codingame/monaco-vscode-view-common-service-override': 22.1.3 + '@codingame/monaco-vscode-view-status-bar-service-override': 22.1.3 + '@codingame/monaco-vscode-view-title-bar-service-override': 22.1.3 + + '@dprint/darwin-arm64@0.50.2': + optional: true + + '@dprint/darwin-x64@0.50.2': + optional: true + + '@dprint/linux-arm64-glibc@0.50.2': + optional: true + + '@dprint/linux-arm64-musl@0.50.2': + optional: true + + '@dprint/linux-riscv64-glibc@0.50.2': + optional: true + + '@dprint/linux-x64-glibc@0.50.2': + optional: true + + '@dprint/linux-x64-musl@0.50.2': + optional: true + + '@dprint/win32-arm64@0.50.2': + optional: true + + '@dprint/win32-x64@0.50.2': + optional: true + + '@esbuild/aix-ppc64@0.25.11': + optional: true + + '@esbuild/android-arm64@0.25.11': + optional: true + + '@esbuild/android-arm@0.25.11': + optional: true + + '@esbuild/android-x64@0.25.11': + optional: true + + '@esbuild/darwin-arm64@0.25.11': + optional: true + + '@esbuild/darwin-x64@0.25.11': + optional: true + + '@esbuild/freebsd-arm64@0.25.11': + optional: true + + '@esbuild/freebsd-x64@0.25.11': + optional: true + + '@esbuild/linux-arm64@0.25.11': + optional: true + + '@esbuild/linux-arm@0.25.11': + optional: true + + '@esbuild/linux-ia32@0.25.11': + optional: true + + '@esbuild/linux-loong64@0.25.11': + optional: true + + '@esbuild/linux-mips64el@0.25.11': + optional: true + + '@esbuild/linux-ppc64@0.25.11': + optional: true + + '@esbuild/linux-riscv64@0.25.11': + optional: true + + '@esbuild/linux-s390x@0.25.11': + optional: true + + '@esbuild/linux-x64@0.25.11': + optional: true + + '@esbuild/netbsd-arm64@0.25.11': + optional: true + + '@esbuild/netbsd-x64@0.25.11': + optional: true + + '@esbuild/openbsd-arm64@0.25.11': + optional: true + + '@esbuild/openbsd-x64@0.25.11': + optional: true + + '@esbuild/openharmony-arm64@0.25.11': + optional: true + + '@esbuild/sunos-x64@0.25.11': + optional: true + + '@esbuild/win32-arm64@0.25.11': + optional: true + + '@esbuild/win32-ia32@0.25.11': + optional: true + + '@esbuild/win32-x64@0.25.11': + optional: true + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/dom': 1.7.4 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + '@floating-ui/react@0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@floating-ui/utils': 0.2.10 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + tabbable: 6.3.0 + + '@floating-ui/utils@0.2.10': {} + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mantine/core@8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@floating-ui/react': 0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mantine/hooks': 8.3.6(react@19.2.0) + clsx: 2.1.1 + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + react-number-format: 5.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-textarea-autosize: 8.5.9(@types/react@19.2.2)(react@19.2.0) + type-fest: 4.41.0 + transitivePeerDependencies: + - '@types/react' + + '@mantine/hooks@8.3.6(react@19.2.0)': + dependencies: + react: 19.2.0 + + '@rolldown/pluginutils@1.0.0-beta.43': {} + + '@rollup/rollup-android-arm-eabi@4.52.5': + optional: true + + '@rollup/rollup-android-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-arm64@4.52.5': + optional: true + + '@rollup/rollup-darwin-x64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-arm64@4.52.5': + optional: true + + '@rollup/rollup-freebsd-x64@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.52.5': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-linux-x64-musl@4.52.5': + optional: true + + '@rollup/rollup-openharmony-arm64@4.52.5': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.52.5': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.52.5': + optional: true + + '@tabler/icons-react@3.35.0(react@19.2.0)': + dependencies: + '@tabler/icons': 3.35.0 + react: 19.2.0 + + '@tabler/icons@3.35.0': {} + + '@typefox/monaco-editor-react@7.2.0': + dependencies: + '@codingame/monaco-vscode-editor-api': 22.1.3 + react: 19.2.0 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@types/babel__generator': 7.27.0 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.28.0 + + '@types/babel__generator@7.27.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + + '@types/babel__traverse@7.28.0': + dependencies: + '@babel/types': 7.28.5 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/emscripten@1.41.5': {} + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.8 + + '@types/estree@1.0.8': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/react-dom@19.2.2(@types/react@19.2.2)': + dependencies: + '@types/react': 19.2.2 + + '@types/react@19.2.2': + dependencies: + csstype: 3.1.3 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + + '@types/vscode@1.105.0': {} + + '@ungap/structured-clone@1.3.0': {} + + '@vitejs/plugin-react@5.1.0(vite@7.1.12(sugarss@5.0.1(postcss@8.5.6)))': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) + '@rolldown/pluginutils': 1.0.0-beta.43 + '@types/babel__core': 7.20.5 + react-refresh: 0.18.0 + vite: 7.1.12(sugarss@5.0.1(postcss@8.5.6)) + transitivePeerDependencies: + - supports-color + + '@vscode/iconv-lite-umd@0.7.0': {} + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + baseline-browser-mapping@2.8.21: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + browserslist@4.27.0: + dependencies: + baseline-browser-mapping: 2.8.21 + caniuse-lite: 1.0.30001752 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001752: {} + + ccount@2.0.1: {} + + chalk@5.3.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + + chevrotain-allstar@0.3.1(chevrotain@11.0.3): + dependencies: + chevrotain: 11.0.3 + lodash-es: 4.17.21 + + chevrotain@11.0.3: + dependencies: + '@chevrotain/cst-dts-gen': 11.0.3 + '@chevrotain/gast': 11.0.3 + '@chevrotain/regexp-to-ast': 11.0.3 + '@chevrotain/types': 11.0.3 + '@chevrotain/utils': 11.0.3 + lodash-es: 4.17.21 + + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.0.0: {} + + convert-source-map@2.0.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.2.0: + dependencies: + character-entities: 2.0.2 + + dequal@2.0.3: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dompurify@3.2.7: + optionalDependencies: + '@types/trusted-types': 2.0.7 + + dprint@0.50.2: + optionalDependencies: + '@dprint/darwin-arm64': 0.50.2 + '@dprint/darwin-x64': 0.50.2 + '@dprint/linux-arm64-glibc': 0.50.2 + '@dprint/linux-arm64-musl': 0.50.2 + '@dprint/linux-riscv64-glibc': 0.50.2 + '@dprint/linux-x64-glibc': 0.50.2 + '@dprint/linux-x64-musl': 0.50.2 + '@dprint/win32-arm64': 0.50.2 + '@dprint/win32-x64': 0.50.2 + + electron-to-chromium@1.5.244: {} + + esbuild@0.25.11: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.11 + '@esbuild/android-arm': 0.25.11 + '@esbuild/android-arm64': 0.25.11 + '@esbuild/android-x64': 0.25.11 + '@esbuild/darwin-arm64': 0.25.11 + '@esbuild/darwin-x64': 0.25.11 + '@esbuild/freebsd-arm64': 0.25.11 + '@esbuild/freebsd-x64': 0.25.11 + '@esbuild/linux-arm': 0.25.11 + '@esbuild/linux-arm64': 0.25.11 + '@esbuild/linux-ia32': 0.25.11 + '@esbuild/linux-loong64': 0.25.11 + '@esbuild/linux-mips64el': 0.25.11 + '@esbuild/linux-ppc64': 0.25.11 + '@esbuild/linux-riscv64': 0.25.11 + '@esbuild/linux-s390x': 0.25.11 + '@esbuild/linux-x64': 0.25.11 + '@esbuild/netbsd-arm64': 0.25.11 + '@esbuild/netbsd-x64': 0.25.11 + '@esbuild/openbsd-arm64': 0.25.11 + '@esbuild/openbsd-x64': 0.25.11 + '@esbuild/openharmony-arm64': 0.25.11 + '@esbuild/sunos-x64': 0.25.11 + '@esbuild/win32-arm64': 0.25.11 + '@esbuild/win32-ia32': 0.25.11 + '@esbuild/win32-x64': 0.25.11 + + escalade@3.2.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + extend@3.0.2: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + gensync@1.0.0-beta.2: {} + + get-nonce@1.0.1: {} + + graceful-fs@4.2.11: {} + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.8 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.18 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + html-url-attributes@3.0.1: {} + + import-meta-resolve@4.2.0: {} + + inline-style-parser@0.2.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-decimal@2.0.1: {} + + is-hexadecimal@2.0.1: {} + + is-plain-obj@4.1.0: {} + + js-tokens@4.0.0: {} + + jschardet@3.1.4: {} + + jsesc@3.1.0: {} + + json5@2.2.3: {} + + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsonschema@1.4.1: {} + + langium-cli@2.1.0: + dependencies: + chalk: 5.3.0 + commander: 11.0.0 + fs-extra: 11.1.1 + jsonschema: 1.4.1 + langium: 2.1.3 + langium-railroad: 2.1.0 + lodash: 4.17.21 + + langium-railroad@2.1.0: + dependencies: + langium: 2.1.3 + railroad-diagrams: 1.0.0 + + langium@2.1.3: + dependencies: + chevrotain: 11.0.3 + chevrotain-allstar: 0.3.1(chevrotain@11.0.3) + vscode-languageserver: 9.0.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + lodash-es@4.17.21: {} + + lodash@4.17.21: {} + + longest-streak@3.1.0: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + marked@14.0.0: {} + + mdast-util-from-markdown@2.0.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.2 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.0: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.2.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.3 + decode-named-character-reference: 1.2.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.2 + + monaco-languageclient@10.2.0: + dependencies: + '@codingame/monaco-vscode-api': 22.1.3 + '@codingame/monaco-vscode-configuration-service-override': 22.1.3 + '@codingame/monaco-vscode-editor-api': 22.1.3 + '@codingame/monaco-vscode-editor-service-override': 22.1.3 + '@codingame/monaco-vscode-extension-api': 22.1.3 + '@codingame/monaco-vscode-extensions-service-override': 22.1.3 + '@codingame/monaco-vscode-language-pack-cs': 22.1.3 + '@codingame/monaco-vscode-language-pack-de': 22.1.3 + '@codingame/monaco-vscode-language-pack-es': 22.1.3 + '@codingame/monaco-vscode-language-pack-fr': 22.1.3 + '@codingame/monaco-vscode-language-pack-it': 22.1.3 + '@codingame/monaco-vscode-language-pack-ja': 22.1.3 + '@codingame/monaco-vscode-language-pack-ko': 22.1.3 + '@codingame/monaco-vscode-language-pack-pl': 22.1.3 + '@codingame/monaco-vscode-language-pack-pt-br': 22.1.3 + '@codingame/monaco-vscode-language-pack-qps-ploc': 22.1.3 + '@codingame/monaco-vscode-language-pack-ru': 22.1.3 + '@codingame/monaco-vscode-language-pack-tr': 22.1.3 + '@codingame/monaco-vscode-language-pack-zh-hans': 22.1.3 + '@codingame/monaco-vscode-language-pack-zh-hant': 22.1.3 + '@codingame/monaco-vscode-languages-service-override': 22.1.3 + '@codingame/monaco-vscode-localization-service-override': 22.1.3 + '@codingame/monaco-vscode-log-service-override': 22.1.3 + '@codingame/monaco-vscode-model-service-override': 22.1.3 + '@codingame/monaco-vscode-monarch-service-override': 22.1.3 + '@codingame/monaco-vscode-textmate-service-override': 22.1.3 + '@codingame/monaco-vscode-theme-defaults-default-extension': 22.1.3 + '@codingame/monaco-vscode-theme-service-override': 22.1.3 + '@codingame/monaco-vscode-views-service-override': 22.1.3 + '@codingame/monaco-vscode-workbench-service-override': 22.1.3 + vscode-languageclient: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-ws-jsonrpc: 3.5.0 + + ms@2.1.3: {} + + nanoid@3.3.11: {} + + neverthrow@8.2.0: + optionalDependencies: + '@rollup/rollup-linux-x64-gnu': 4.52.5 + + node-releases@2.0.27: {} + + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.2.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + postcss-js@4.1.0(postcss@8.5.6): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.5.6 + + postcss-mixins@12.1.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-js: 4.1.0(postcss@8.5.6) + postcss-simple-vars: 7.0.1(postcss@8.5.6) + sugarss: 5.0.1(postcss@8.5.6) + tinyglobby: 0.2.15 + + postcss-nested@7.0.2(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser: 7.1.0 + + postcss-preset-mantine@1.18.0(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-mixins: 12.1.2(postcss@8.5.6) + postcss-nested: 7.0.2(postcss@8.5.6) + + postcss-selector-parser@7.1.0: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-simple-vars@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + property-information@7.1.0: {} + + railroad-diagrams@1.0.0: {} + + react-dom@19.2.0(react@19.2.0): + dependencies: + react: 19.2.0 + scheduler: 0.27.0 + + react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@types/react': 19.2.2 + devlop: 1.1.0 + hast-util-to-jsx-runtime: 2.3.6 + html-url-attributes: 3.0.1 + mdast-util-to-hast: 13.2.0 + react: 19.2.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + react-number-format@5.4.4(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + dependencies: + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + + react-refresh@0.18.0: {} + + react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + + react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + get-nonce: 1.0.1 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + react-textarea-autosize@8.5.9(@types/react@19.2.2)(react@19.2.0): + dependencies: + '@babel/runtime': 7.28.4 + react: 19.2.0 + use-composed-ref: 1.4.0(@types/react@19.2.2)(react@19.2.0) + use-latest: 1.3.0(@types/react@19.2.2)(react@19.2.0) + transitivePeerDependencies: + - '@types/react' + + react@19.2.0: {} + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.2 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 + + rollup@4.52.5: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.52.5 + '@rollup/rollup-android-arm64': 4.52.5 + '@rollup/rollup-darwin-arm64': 4.52.5 + '@rollup/rollup-darwin-x64': 4.52.5 + '@rollup/rollup-freebsd-arm64': 4.52.5 + '@rollup/rollup-freebsd-x64': 4.52.5 + '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 + '@rollup/rollup-linux-arm-musleabihf': 4.52.5 + '@rollup/rollup-linux-arm64-gnu': 4.52.5 + '@rollup/rollup-linux-arm64-musl': 4.52.5 + '@rollup/rollup-linux-loong64-gnu': 4.52.5 + '@rollup/rollup-linux-ppc64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-gnu': 4.52.5 + '@rollup/rollup-linux-riscv64-musl': 4.52.5 + '@rollup/rollup-linux-s390x-gnu': 4.52.5 + '@rollup/rollup-linux-x64-gnu': 4.52.5 + '@rollup/rollup-linux-x64-musl': 4.52.5 + '@rollup/rollup-openharmony-arm64': 4.52.5 + '@rollup/rollup-win32-arm64-msvc': 4.52.5 + '@rollup/rollup-win32-ia32-msvc': 4.52.5 + '@rollup/rollup-win32-x64-gnu': 4.52.5 + '@rollup/rollup-win32-x64-msvc': 4.52.5 + fsevents: 2.3.3 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.7.3: {} + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + style-to-js@1.1.18: + dependencies: + style-to-object: 1.0.11 + + style-to-object@1.0.11: + dependencies: + inline-style-parser: 0.2.4 + + sugarss@5.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + tabbable@6.3.0: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: {} + + type-fest@4.41.0: {} + + typescript@5.9.3: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + universalify@2.0.1: {} + + update-browserslist-db@1.1.4(browserslist@4.27.0): + dependencies: + browserslist: 4.27.0 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + use-composed-ref@1.4.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + optionalDependencies: + '@types/react': 19.2.2 + + use-latest@1.3.0(@types/react@19.2.2)(react@19.2.0): + dependencies: + react: 19.2.0 + use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.2)(react@19.2.0) + optionalDependencies: + '@types/react': 19.2.2 + + use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.2 + + util-deprecate@1.0.2: {} + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.1.12(sugarss@5.0.1(postcss@8.5.6)): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.5 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + sugarss: 5.0.1(postcss@8.5.6) + + vscode-jsonrpc@8.2.0: {} + + vscode-jsonrpc@8.2.1: {} + + vscode-languageclient@9.0.1: + dependencies: + minimatch: 5.1.6 + semver: 7.7.3 + vscode-languageserver-protocol: 3.17.5 + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.12: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-oniguruma@1.7.0: {} + + vscode-textmate@9.2.0: {} + + vscode-uri@3.0.8: {} + + vscode-ws-jsonrpc@3.5.0: + dependencies: + vscode-jsonrpc: 8.2.1 + + yallist@3.1.1: {} + + zwitch@2.0.4: {} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 00000000..b09b7f92 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,14 @@ +module.exports = { + plugins: { + "postcss-preset-mantine": {}, + "postcss-simple-vars": { + variables: { + "mantine-breakpoint-xs": "36em", + "mantine-breakpoint-sm": "48em", + "mantine-breakpoint-md": "62em", + "mantine-breakpoint-lg": "75em", + "mantine-breakpoint-xl": "88em", + }, + }, + }, +}; diff --git a/src/components/lab.tsx b/src/components/lab.tsx new file mode 100644 index 00000000..f2602c63 --- /dev/null +++ b/src/components/lab.tsx @@ -0,0 +1,149 @@ +import { ChangeEvent, useState } from "react"; + +import Markdown from "../components/markdown"; +import { IconAlertTriangle } from "@tabler/icons-react"; + +import { + Accordion, + Badge, + Card, + CardProps, + Code, + Group, + NativeSelect, + rem, + ScrollArea, + Stack, + StackProps, + Switch, + Text, + ThemeIcon, + Title, +} from "@mantine/core"; + +import { evaluate } from "../parser/utils"; +import { Given, Laboratory, Tweakable } from "../parser"; + +export interface ItemProps extends Omit +{ + item: Tweakable | Given; + notify?: () => void; +} + +export function Item({ item, notify, ...props }: ItemProps) +{ + const { expression, value } = item; + + const disable = "disable" in item ? evaluate(item.disable) : true; + const concerns = "concerns" in item ? evaluate(item.concerns) : []; + + const allowedValues = "allowedValues" in item ? item.allowedValues : [item.value]; + const boolish = allowedValues.every(item => typeof item === "boolean"); + + const update = ({ currentTarget }: ChangeEvent) => + { + if ("update" in item) + { + item.update("checked" in currentTarget ? currentTarget.checked : currentTarget.value); + } + + notify?.(); + }; + + return ( + + + + + {expression} + + {boolish + ? ( + + ) + : ( + + )} + + {concerns.length > 0 + && ( + + {concerns.map(concern => ( + + + + + } + > + + {concern.summary} + + + + + {concern.description} + + + + ))} + + )} + + + ); +} + +export interface LabProps extends Omit +{ + laboratory?: Laboratory; +} + +export function Lab({ laboratory, ...props }: LabProps) +{ + if (!laboratory) + { + return <>; + } + + const [ver, setVer] = useState(0); + const { title, authors, description, tweakables, givens } = laboratory; + + return ( + + {title && {title}} + {authors?.map(author => {author})} + {description && {description}} + + + {givens.map(given => ( + + ))} + {tweakables.map(tweakable => ( + setVer(ver + 1)} + /> + ))} + + + + ); +} diff --git a/src/components/markdown.tsx b/src/components/markdown.tsx new file mode 100644 index 00000000..4ae9b956 --- /dev/null +++ b/src/components/markdown.tsx @@ -0,0 +1,17 @@ +import { Code } from "@mantine/core"; +import Markdown_, { Options } from "react-markdown"; + +export default function Markdown(props: Omit) +{ + return ( + {children}; + }, + }} + {...props} + /> + ); +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 00000000..65b584cf --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,45 @@ +import ReactDOM from "react-dom/client"; + +import "./style/index.css"; +import "@mantine/core/styles.css"; + +import { IconBrandGithub, IconTestPipe2 } from "@tabler/icons-react"; +import { ActionIcon, AppShell, Group, MantineProvider, Text } from "@mantine/core"; + +import Editor from "./pages/editor.tsx"; +import { initMonaco } from "./utils/monaco.ts"; + +const languageConfig = await initMonaco(); + +ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + + + + + + SpecAlt + + + - The JavaScript Proposal Laboratory + + + + + + + + + + + + + + , +); diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx new file mode 100644 index 00000000..aa5fcc3a --- /dev/null +++ b/src/pages/editor.tsx @@ -0,0 +1,44 @@ +import * as vscode from "vscode"; +import * as monaco from "@codingame/monaco-vscode-editor-api"; + +import { useState } from "react"; +import { Group } from "@mantine/core"; +import { MonacoEditorReactComp } from "@typefox/monaco-editor-react"; + +import { vscodeConfig } from "../utils/monaco"; +import { LanguageClientConfig } from "monaco-languageclient/lcwrapper"; + +import { Lab } from "../components/lab"; +import { Laboratory, parseLaboratory } from "../parser"; + +import exampleCode from "../../examples/in/records_and_tuples.jspl?raw"; + +export default function({ languageConfig }: { languageConfig: LanguageClientConfig }) +{ + const [current, setCurrent] = useState(); + + return ( + + + { + const onChange = async (input: string) => (await parseLaboratory(input)).andTee(setCurrent); + onChange(exampleCode); + vscode.workspace.onDidChangeTextDocument(async ({ document }) => onChange(document.getText())); + }} + onEditorStartDone={app => + { + app?.getEditor()?.setModel(monaco.editor.createModel(exampleCode, "jspl")); + }} + /> + + + ); +} diff --git a/src/parser/index.ts b/src/parser/index.ts new file mode 100644 index 00000000..c9867237 --- /dev/null +++ b/src/parser/index.ts @@ -0,0 +1,139 @@ +import { err, ok } from "neverthrow"; + +import { Res } from "../../lib/utils"; +import { extractModel } from "../../lib/model"; +import { Concern, Proposition } from "../../lib/language/generated/ast"; + +import { evaluate, Evaluator, lazyEvaluator, State, Value } from "./utils"; + +export interface Given +{ + value: Value; + expression: string; +} + +export interface Tweakable +{ + expression: string; + disable: Evaluator; + + value: Evaluator; + update: (value: Value) => void; + + defaultValue: Value; + allowedValues: Value[]; + + concerns: Evaluator; +} + +export interface Laboratory +{ + title?: string; + authors?: string[]; + description?: string; + + concerns: Map; + givens: Given[]; + tweakables: Tweakable[]; +} + +function evaluateConcerns({ name, valueClauses }: Proposition, state: State) +{ + const clause = valueClauses.find(item => item.value === state.tweakables.get(name))!; + const rtn: Concern[] = []; + + for (const { condition, concern } of clause.raises) + { + if (condition && !evaluate(lazyEvaluator.fromExpression(condition.expression, state))) + { + continue; + } + + rtn.push(concern.ref!); + } + + return rtn; +} + +function evalauteDisable({ disable }: Proposition, state: State) +{ + for (const { condition } of disable?.statements ?? []) + { + const expr = lazyEvaluator.fromExpression(condition.expression, state); + + if (!evaluate(expr)) + { + continue; + } + + return true; + } + + return false; +} + +export async function parseLaboratory(input: string): Promise> +{ + const model = await extractModel(input); + + if (model.isErr()) + { + return err(model.error); + } + + const { laboratory, propositions, conditions } = model.value; + + const state: State = { + tweakables: new Map(), + conditions: new Map(), + }; + + const givens: Given[] = []; + const tweakables: Tweakable[] = []; + + for (const { name, condition } of conditions) + { + state.conditions.set(name, lazyEvaluator.fromExpression(condition.expression, state)); + } + + for (const { name, expression, valueClauses } of propositions.filter(item => item.valueClauses.length === 1)) + { + const value = valueClauses[0].value; + givens.push({ expression, value }); + state.tweakables.set(name, value); + } + + for (const tweakable of propositions.filter(item => item.valueClauses.length !== 1)) + { + const { name, expression, valueClauses } = tweakable; + + const defaultValue = valueClauses.find(item => item.default)!.value; + const allowedValues = valueClauses.map(item => item.value); + + tweakables.push({ + expression, + defaultValue, + allowedValues, + value: () => state.tweakables.get(name)!, + update: val => state.tweakables.set(name, val), + disable: () => evalauteDisable(tweakable, state), + concerns: () => evaluateConcerns(tweakable, state), + }); + + state.tweakables.set(name, defaultValue); + } + + const concerns = new Map(model.value.concerns.map( + concern => [concern.name, concern] as const, + )); + + return ok({ + title: laboratory?.titles[0], + authors: laboratory?.authors, + description: laboratory?.descriptions[0], + version: laboratory?.versions[0], + concerns, + givens, + tweakables, + }); +} diff --git a/src/parser/utils.ts b/src/parser/utils.ts new file mode 100644 index 00000000..27c3c190 --- /dev/null +++ b/src/parser/utils.ts @@ -0,0 +1,89 @@ +import { LogicalExpressionExtractor } from "../../lib/language/utils"; + +import { + AndExpression, + Group, + Negation, + OrExpression, + PropositionalExpression, + Statement, +} from "../../lib/language/generated/ast"; + +export type Value = string | boolean; +export type Evaluator = () => T; + +export function evaluate(evaluator: Exclude | Evaluator) +{ + return typeof evaluator === "function" ? (evaluator as Evaluator)() : evaluator; +} + +export interface State +{ + tweakables: Map; + conditions: Map; +} + +export const lazyEvaluator: LogicalExpressionExtractor = { + fromOrExpression: (expression: OrExpression, state: State) => + { + const left = lazyEvaluator.fromExpression(expression.left, state); + const right = lazyEvaluator.fromExpression(expression.right, state); + + return () => evaluate(left) || evaluate(right); + }, + fromAndExpression: (expression: AndExpression, state: State) => + { + const left = lazyEvaluator.fromExpression(expression.left, state); + const right = lazyEvaluator.fromExpression(expression.right, state); + + return () => evaluate(left) && evaluate(right); + }, + fromNegation: (expression: Negation, state: State) => + { + const inner = lazyEvaluator.fromExpression(expression, state); + return () => !evaluate(inner); + }, + fromGroup: (expression: Group, state: State) => + { + return lazyEvaluator.fromExpression(expression.inner, state); + }, + fromStatement: (expression: Statement, state: State) => + { + const { name, $type } = expression.reference.ref!; + + const get = (name: string) => + { + switch ($type) + { + case "Condition": + return evaluate(state.conditions.get(name)!); + case "Proposition": + return state.tweakables.get(name)!; + } + }; + + switch (expression.negation) + { + case true: + return () => get(name) !== expression.value; + case false: + return () => get(name) === expression.value; + } + }, + fromExpression: (expression: PropositionalExpression, state: State) => + { + switch (expression.$type) + { + case "OrExpression": + return lazyEvaluator.fromOrExpression(expression, state); + case "AndExpression": + return lazyEvaluator.fromAndExpression(expression, state); + case "Negation": + return lazyEvaluator.fromNegation(expression, state); + case "Group": + return lazyEvaluator.fromGroup(expression, state); + case "Statement": + return lazyEvaluator.fromStatement(expression, state); + } + }, +}; diff --git a/src/style/index.css b/src/style/index.css new file mode 100644 index 00000000..af316769 --- /dev/null +++ b/src/style/index.css @@ -0,0 +1,17 @@ +#root { + width: 100vw; + height: 100vh; +} + +.editor { + width: 50%; + height: 100%; +} + +.main { + height: calc( + 100vh - var(--app-shell-header-height, 0x) - + var(--app-shell-footer-height, 0px) - var(--app-shell-padding) * 2 + ); + width: 100%; +} diff --git a/src/utils/monaco.ts b/src/utils/monaco.ts new file mode 100644 index 00000000..28bc22ce --- /dev/null +++ b/src/utils/monaco.ts @@ -0,0 +1,103 @@ +import * as vscode from "vscode"; + +import { MonacoVscodeApiConfig } from "monaco-languageclient/vscodeApiWrapper"; +import { configureDefaultWorkerFactory } from "monaco-languageclient/workerFactory"; + +import { + type IFileWriteOptions, + InMemoryFileSystemProvider, + registerFileSystemOverlay, +} from "@codingame/monaco-vscode-files-service-override"; + +import workerUrl from "../worker/specalt-server?worker&url"; +import langiumConfig from "../../config/langium.json?raw"; +import langiumGrammar from "../../syntaxes/jspl-format.tmLanguage.json?raw"; +import { LanguageClientConfig } from "monaco-languageclient/lcwrapper"; +import { BrowserMessageReader, BrowserMessageWriter } from "vscode-languageserver/browser"; + +const extensionFilesOrContents = new Map( + [ + ["/workspace/langium-grammar.json", langiumGrammar], + ["/workspace/langium-configuration.json", langiumConfig], + ], +); + +export const vscodeConfig: MonacoVscodeApiConfig = { + $type: "extended", + viewsConfig: { + $type: "EditorService", + }, + userConfiguration: { + json: JSON.stringify({ + "workbench.colorTheme": "Default Dark Modern", + "editor.minimap.enabled": false, + }), + }, + extensions: [{ + config: { + name: "SpecAlt", + publisher: "bldl", + version: "1.0.0", + engines: { + vscode: "*", + }, + contributes: { + languages: [{ + id: "jspl", + extensions: [".jspl"], + configuration: "/workspace/langium-configuration.json", + }], + grammars: [{ + language: "jspl", + scopeName: "source.jspl", + path: "/workspace/langium-grammar.json", + }], + }, + }, + filesOrContents: extensionFilesOrContents, + }], + monacoWorkerFactory: configureDefaultWorkerFactory, +}; + +export async function initMonaco() +{ + const fs = new InMemoryFileSystemProvider(); + const encoder = new TextEncoder(); + + const options: IFileWriteOptions = { + atomic: false, + unlock: false, + create: true, + overwrite: true, + }; + + await fs.mkdir(vscode.Uri.file("/workspace")); + + for (const [path, content] of extensionFilesOrContents.entries()) + { + await fs.writeFile(vscode.Uri.file(path), encoder.encode(content), options); + } + + registerFileSystemOverlay(1, fs); + + const worker = new Worker(workerUrl, { type: "module", name: "JSPL LS" }); + + const languageClientConfig: LanguageClientConfig = { + languageId: "jspl", + clientOptions: { + documentSelector: ["jspl"], + }, + connection: { + options: { + $type: "WorkerDirect", + worker, + }, + messageTransports: { + reader: new BrowserMessageReader(worker), + writer: new BrowserMessageWriter(worker), + }, + }, + }; + + return languageClientConfig; +} diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 00000000..11f02fe2 --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/worker/specalt-server.ts b/src/worker/specalt-server.ts new file mode 100644 index 00000000..35700cd6 --- /dev/null +++ b/src/worker/specalt-server.ts @@ -0,0 +1,19 @@ +/// + +import { EmptyFileSystem } from "langium"; +import { type DefaultSharedModuleContext, startLanguageServer } from "langium"; +import { BrowserMessageReader, BrowserMessageWriter, createConnection } from "vscode-languageserver/browser.js"; + +import { createJSPLFormatServices } from "../../lib/language/jspl-format-module"; + +const messageReader = new BrowserMessageReader(self as DedicatedWorkerGlobalScope); +const messageWriter = new BrowserMessageWriter(self as DedicatedWorkerGlobalScope); + +const context = { + connection: createConnection(messageReader, messageWriter), + ...EmptyFileSystem, +} as unknown as DefaultSharedModuleContext; + +const { shared } = createJSPLFormatServices(context); + +startLanguageServer(shared); diff --git a/tsconfig.json b/tsconfig.json index 91e8763e..c81ef9f3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,24 @@ { "compilerOptions": { - "target": "ES2017", - "module": "Node16", - "lib": ["ESNext"], - "sourceMap": true, - "outDir": "out", + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ "strict": true, "noUnusedLocals": true, - "noImplicitReturns": true, - "noImplicitOverride": true, - "moduleResolution": "Node16", - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "out", - "node_modules" - ] + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 00000000..c0c519b4 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from "vite"; + +import react from "@vitejs/plugin-react"; +import importMetaUrlPlugin from "@codingame/esbuild-import-meta-url-plugin"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + optimizeDeps: { + esbuildOptions: { + plugins: [ + importMetaUrlPlugin, + ], + }, + }, + resolve: { + dedupe: ["vscode"], + }, +}); From 4860c5d09c58d63cf568f30106fb3946af9b5c3f Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:32:28 +0100 Subject: [PATCH 13/36] refactor(examples/records-tuples): markdownify partially --- examples/in/records_and_tuples.jspl | 30 +++++++++++++---------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/examples/in/records_and_tuples.jspl b/examples/in/records_and_tuples.jspl index 387e6d55..9d0f519d 100644 --- a/examples/in/records_and_tuples.jspl +++ b/examples/in/records_and_tuples.jspl @@ -1,9 +1,8 @@ laboratory { title "Records and Tuples Laboratory 🔬" - description MD "🏗 Work in progress - [raise technical issue](https://github.com/acutmore/record-tuple-laboratory/issues/new)" + description "🏗 Work in progress - [raise technical issue](https://github.com/acutmore/record-tuple-laboratory/issues/new)" icon "./res/favicon.svg" author "Ashley Claymore" - format HTML version "2" } @@ -11,24 +10,21 @@ issue withoutBox { summary "complexity moved to ecosystem" description - "

Without a 'Box' like type there will not be any direct support in the language for storing objects in Records and Tuples.

- Instead using symbols-as-weakmap-keys, + " + Without a 'Box' like type there will not be any direct support in the language for storing objects in Records and Tuples. + Instead using [symbols-as-weakmap-keys](https://github.com/tc39/proposal-symbols-as-weakmap-keys), symbols in Record and Tuples could still refer to objects/functions via a WeakMap. Code will need to ensure the necessary code has access to these WeakMap side tables. APIs conventions will need to be established to distinguish when symbols are being used in this way. Care will need to be taken with the WeakMaps, if a Map is used by accident there is a risk of memory leaks. Unless direct access to the WeakMap is hidden behind a wrapper, other code could remove/replace the referenced - object. -

- Box use-cases include: -

    -
  • Composite keys for Maps/Sets.
  • -
  • - In React.js creating and passing groups of values, possibly functions, - around without triggering re-renders due to changing object identity -
  • -
-

" + object. + + Box use-cases include: + * Composite keys for Maps/Sets. + * In React.js creating and passing groups of values, possibly functions, + around without triggering re-renders due to changing object identity + " } issue typeofPowerfulObjectIsNotObject { @@ -80,8 +76,8 @@ issue objectWrappers { summary "object wrappers" description - "

If Records and Tuples are not objects then a

ToObject
operation will return an object wrapper - which will have its own unique identity:
Object(#[]) !== Object(#[])

." + "If Records and Tuples are not objects then a `ToObject` operation will return an object wrapper + which will have its own unique identity: `Object(#[]) !== Object(#[])`." } issue objectWrapperInConsistency { From f1dae1ce6d073b1824c1b42071f439806ec5ed1d Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:32:44 +0100 Subject: [PATCH 14/36] refactor(solver/parser): remove unused include --- solver/src/parser.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp index 65de9dc9..19c0cf3f 100644 --- a/solver/src/parser.cpp +++ b/solver/src/parser.cpp @@ -1,8 +1,6 @@ #include "parser.hpp" #include -#include - #include namespace jspl From 0c9020cdf2dc665897284a6dec6275f0d95a7210 Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:33:05 +0100 Subject: [PATCH 15/36] refactor: update license --- LICENSE.txt => LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename LICENSE.txt => LICENSE (95%) diff --git a/LICENSE.txt b/LICENSE similarity index 95% rename from LICENSE.txt rename to LICENSE index 339ce355..26c36bb3 100644 --- a/LICENSE.txt +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Philipp Riemer +Copyright (c) 2025 Philipp Riemer, Noah Karnel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From acc62bcde50d887cb600cb1e69bf09310020420f Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:39:30 +0100 Subject: [PATCH 16/36] fix(lib/converter): only trim start --- lib/language/jspl-converter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/language/jspl-converter.ts b/lib/language/jspl-converter.ts index 1a29289e..bf37a911 100644 --- a/lib/language/jspl-converter.ts +++ b/lib/language/jspl-converter.ts @@ -9,7 +9,7 @@ export class JSPLValueConverter extends DefaultValueConverter // Trim (multiline) strings to ensure proper Markdown formatting if (typeof rtn === "string") { - return rtn.split("\n").map(item => item.trim()).join("\n"); + return rtn.split("\n").map(item => item.trimStart()).join("\n"); } return rtn; From e0202367a173ea7a304ba4f99039016d5e7c3acd Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:43:12 +0100 Subject: [PATCH 17/36] fix(frontend): reactiveness on small viewport --- src/components/lab.tsx | 4 ++-- src/main.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/lab.tsx b/src/components/lab.tsx index f2602c63..1d158cc3 100644 --- a/src/components/lab.tsx +++ b/src/components/lab.tsx @@ -53,7 +53,7 @@ export function Item({ item, notify, ...props }: ItemProps) return ( - + {expression} @@ -123,7 +123,7 @@ export function Lab({ laboratory, ...props }: LabProps) return ( {title && {title}} - {authors?.map(author => {author})} + {authors?.map(author => {author})} {description && {description}} diff --git a/src/main.tsx b/src/main.tsx index 65b584cf..b076097b 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -15,13 +15,13 @@ ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - + SpecAlt - + - The JavaScript Proposal Laboratory From 6ec026109c90aa60325fa7cdbb86f9f9ad3a5fd6 Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 00:45:43 +0100 Subject: [PATCH 18/36] refactor(frontend): update icon --- src/main.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index b076097b..331e03e4 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,7 +3,7 @@ import ReactDOM from "react-dom/client"; import "./style/index.css"; import "@mantine/core/styles.css"; -import { IconBrandGithub, IconTestPipe2 } from "@tabler/icons-react"; +import { IconBrandGithub, IconTestPipe } from "@tabler/icons-react"; import { ActionIcon, AppShell, Group, MantineProvider, Text } from "@mantine/core"; import Editor from "./pages/editor.tsx"; @@ -17,7 +17,7 @@ ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - + SpecAlt From b08aa19d75f06978060f6f9b6b2d33b75a97b2e0 Mon Sep 17 00:00:00 2001 From: Curve Date: Tue, 4 Nov 2025 13:14:01 +0100 Subject: [PATCH 19/36] feat: persist last draft --- package.json | 1 + pnpm-lock.yaml | 3 +++ src/pages/editor.tsx | 21 +++++++++++++++++---- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 56e8a041..cf8b4b64 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@codingame/monaco-vscode-editor-api": "^22.1.3", "@codingame/monaco-vscode-files-service-override": "^22.1.3", "@mantine/core": "^8.3.6", + "@mantine/hooks": "^8.3.6", "@tabler/icons-react": "^3.35.0", "@typefox/monaco-editor-react": "^7.2.0", "monaco-languageclient": "^10.2.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 275eb17b..a769c080 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@mantine/core': specifier: ^8.3.6 version: 8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mantine/hooks': + specifier: ^8.3.6 + version: 8.3.6(react@19.2.0) '@tabler/icons-react': specifier: ^3.35.0 version: 3.35.0(react@19.2.0) diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index aa5fcc3a..c4b00d94 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -2,7 +2,10 @@ import * as vscode from "vscode"; import * as monaco from "@codingame/monaco-vscode-editor-api"; import { useState } from "react"; +import { fromThrowable } from "neverthrow"; + import { Group } from "@mantine/core"; +import { useDebouncedCallback } from "@mantine/hooks"; import { MonacoEditorReactComp } from "@typefox/monaco-editor-react"; import { vscodeConfig } from "../utils/monaco"; @@ -13,10 +16,21 @@ import { Laboratory, parseLaboratory } from "../parser"; import exampleCode from "../../examples/in/records_and_tuples.jspl?raw"; +const setLocalStorage = fromThrowable((key: string, value: string) => localStorage.setItem(key, value), e => e); + export default function({ languageConfig }: { languageConfig: LanguageClientConfig }) { const [current, setCurrent] = useState(); + const save = useDebouncedCallback(setLocalStorage, 1000); + const lastDraft = localStorage.getItem("draft") ?? exampleCode; + + const change = async (input: string) => + { + save("draft", input); + parseLaboratory(input).then(result => result.andTee(setCurrent)); + }; + return ( { - const onChange = async (input: string) => (await parseLaboratory(input)).andTee(setCurrent); - onChange(exampleCode); - vscode.workspace.onDidChangeTextDocument(async ({ document }) => onChange(document.getText())); + change(lastDraft); + vscode.workspace.onDidChangeTextDocument(async ({ document }) => change(document.getText())); }} onEditorStartDone={app => { - app?.getEditor()?.setModel(monaco.editor.createModel(exampleCode, "jspl")); + app?.getEditor()?.setModel(monaco.editor.createModel(lastDraft, "jspl")); }} /> Date: Tue, 4 Nov 2025 13:28:21 +0100 Subject: [PATCH 20/36] refactor: rename to specalt --- config/langium.json | 10 +- examples/in/randt_times_n/script.py | 552 - examples/in/randt_times_n/times_67.jspl | 14787 ---------------- ...and_tuples.jspl => records_and_tuples.spa} | 0 examples/in/running_example.jspl | 45 - examples/in/test.jspl | 42 - examples/in/very_simple.jspl | 24 - lib/language/jspl-format-module.ts | 85 - ...jspl-converter.ts => specalt-converter.ts} | 2 +- lib/language/specalt-format-module.ts | 58 + ...jspl-validator.ts => specalt-validator.ts} | 12 +- .../{jspl.langium => specalt.langium} | 2 +- lib/model.ts | 6 +- package.json | 8 +- solver/CMakeLists.txt | 2 +- solver/include/emitter.hpp | 4 +- solver/include/lexer.hpp | 4 +- solver/include/parser.hpp | 4 +- solver/include/utils.hpp | 4 +- solver/include/utils.inl | 4 +- solver/src/emitter.cpp | 4 +- solver/src/lexer.cpp | 4 +- solver/src/parser.cpp | 14 +- solver/src/solver.cpp | 2 +- src/pages/editor.tsx | 6 +- src/utils/monaco.ts | 16 +- src/worker/specalt-server.ts | 4 +- 27 files changed, 114 insertions(+), 15591 deletions(-) delete mode 100644 examples/in/randt_times_n/script.py delete mode 100644 examples/in/randt_times_n/times_67.jspl rename examples/in/{records_and_tuples.jspl => records_and_tuples.spa} (100%) delete mode 100644 examples/in/running_example.jspl delete mode 100644 examples/in/test.jspl delete mode 100644 examples/in/very_simple.jspl delete mode 100644 lib/language/jspl-format-module.ts rename lib/language/{jspl-converter.ts => specalt-converter.ts} (86%) create mode 100644 lib/language/specalt-format-module.ts rename lib/language/{jspl-validator.ts => specalt-validator.ts} (93%) rename lib/language/{jspl.langium => specalt.langium} (99%) diff --git a/config/langium.json b/config/langium.json index 6989b0f7..cb70a5c6 100644 --- a/config/langium.json +++ b/config/langium.json @@ -1,12 +1,12 @@ { - "projectName": "JSPL", + "projectName": "SpecAlt", "languages": [{ - "id": "jspl", + "id": "specalt", "textMate": { - "out": "../syntaxes/jspl-format.tmLanguage.json" + "out": "../syntaxes/specalt-format.tmLanguage.json" }, - "fileExtensions": [".jspl"], - "grammar": "../lib/language/jspl.langium" + "fileExtensions": [".spa"], + "grammar": "../lib/language/specalt.langium" }], "out": "../lib/language/generated" } diff --git a/examples/in/randt_times_n/script.py b/examples/in/randt_times_n/script.py deleted file mode 100644 index 57ea8a9b..00000000 --- a/examples/in/randt_times_n/script.py +++ /dev/null @@ -1,552 +0,0 @@ -from math import ceil - -TWEAKABLES_IN_R_AND_T = 15 -WANTED_TWEAKABLES = 1000 - -LAB_PREFIX = """ -laboratory { - title "Records and Tuples Laboratory 🔬" - description MD "🏗 Work in progress - [raise technical issue](https://github.com/acutmore/record-tuple-laboratory/issues/new)" - icon "./res/favicon.svg" - author "Ashley Claymore" - format HTML - version "2" -} - -issue withoutBox { - summary - "complexity moved to ecosystem" - description - "

Without a 'Box' like type there will not be any direct support in the language for storing objects in Records and Tuples.

- Instead using symbols-as-weakmap-keys, - symbols in Record and Tuples could still refer to objects/functions via a WeakMap. - Code will need to ensure the necessary code has access to these WeakMap side tables. - APIs conventions will need to be established to distinguish when symbols are being used in this way. - Care will need to be taken with the WeakMaps, if a Map is used by accident there is a risk of memory leaks. - Unless direct access to the WeakMap is hidden behind a wrapper, other code could remove/replace the referenced - object. -

- Box use-cases include: -

    -
  • Composite keys for Maps/Sets.
  • -
  • - In React.js creating and passing groups of values, possibly functions, - around without triggering re-renders due to changing object identity -
  • -
-

" -} - -issue typeofPowerfulObjectIsNotObject { - summary - "security risk" - description - "Existing security sensitive code checks if a value has no-power by checking if it's typeof - is not 'object' or 'function', and will assume values with other results are safe to - pass-around without further inspection. These projects may not be updated before they start - to interact with Records and Tuples." -} - -issue validWeakValue { - summary - "consistency change" - description - "Current code can rely on the consistency that values that have typeof 'object' and are not - null can be stored weakly. If R&T introduces values that have typeof 'object' but throw when - placed in a WeakSet this consistency is no longer reliable. And code will need to be updated." -} - -issue weakSetLeak { - summary - "memory leak" - description - "If values are allowed in a WeakSet that are impossible to be garbage-collected this could - create a silent memory leak." -} - -issue slotSensitiveTypeof { - summary - "slot sensitive typeof" - description - "If typeof a record or tuple changes depending on if there is a box transitively within its - tree this makes typeof confusing. Code will have to rely on static methods like - Record.isRecord instead." -} - -issue confusingTypeof { - summary - "problematic typeof" - description - "If a Tuple without a Box in it's tree has typeof 'object', there is no value to be gained - from a Tuple with a Box having typeof 'tuple', because if anything it is more like an object - when it contains a Box." -} - -issue objectWrappers { - summary - "object wrappers" - description - "

If Records and Tuples are not objects then a

ToObject
operation will return an object wrapper - which will have its own unique identity:
Object(#[]) !== Object(#[])

." -} - -issue objectWrapperInConsistency { - summary - "being objects" - description - "

Code may assume that if a value's typeof is not 'object' or 'function' then it is not an object, but if

ToObject
returns the value as is this implies that it is an object.

-

If Tuples are objects this means that the methods on their '[[prototype]]' will be linked to the realm (e.g. iframe) in which they were created. - As opposed to primitives, where property access triggers a

ToObject
in the current executing realm. - This would mean that two Tuples created in different realms will carry around different prototypes. - The choice here is that either two objects with different prototypes can still be === equal to each other. - Or Tuples from different realms are never equal even if their contents are equal. -

" -} - -issue noBoxesInWeakSets { - summary - "performance" - description - "Libraries may want to create values based on Records that contain boxes. For example, - mapping over a record and mapping each Box to something else. If this work is expensive, it - may be beneficial to memoize the work using a WeakMap. But this wouldn't be possible if - Records with Boxes can't be WeakMaps keys." -} - -issue unequalTupleNan { - summary - "consistency change" - description - "Currently the only value not equal to itself is NaN, and this can be used as a reliable - check for NaN. If any record or tuple containing a NaN within its tree is also not equal to - itself, then there would be an infinite number of values not equal to themselves. - " -} - -issue noNegativeZero { - summary - "no negative zero" - description - "

- Negative zero can be stored in a standard Array. If negative zero was transformed into - positive zero when stored in a tuple, then mapping arrays of numbers to and from tuples - would not be isomorphic. -

-

Being able to store a negative zero is considered important to some users.

- " -} - -issue impossibleEqualityOfZeros { - summary - "impossible equality" - description - "If negative zero can not be stored in a Tuple (converted to +0). Then #[-0] cannot compare - unequal to #[+0]." -} - -issue observableDifferentButIsEqual { - summary - "Object.is semantics" - description - "Putting aside that two NaNs can be observably different, by storing them in a TypedArray and - reading the bits. If Object.is returns true for two values this means the two values are not - observably different, this is useful for memoization techniques. For a pure function, if the - inputs have not changed in an observable way then neither should the output. React.js for - example uses Object.is for its change-detection. If two Tuples compare equal, but have - observably different values (one has positive zero and the other has negative zero), then - this changes the semantics of Object.is, and the use cases it can be applied to." -} - -issue nanNotIsNan { - summary - "Object.is NaN semantics" - description - "if both 'Object.is(NaN, NaN)' and '#[NaN] === #[NaN]'' are true, there does not appear to be - a reason for Object.is(#[NaN], #[NaN]) to not be true." -} - -issue canNotAlwaysIntern { - summary - "can not always intern" - description - "Object interning is a technique used to reduce memory and speed up certain operations after - the initial interning cost. If #[+0] equals #[-0] and storing negative zero in a tuple is - preserved then records and tuple equality can not solely rely on interning." -} - -issue zerosNotTripleEqual { - summary - "Triple equality semantics" - description - "As -0 === +0 on their own, it may surprise people that they are no longer treated as triple - equal when compared via a record or tuple. This could lead to bugs. - " -} - -issue storingPrimitiveInBox { - summary - "storing primitives* in a Box" - description - "

- primitives*: For want of a more appropriate term, in this section the term primitive will have the meaning: a value that can be directly stored in a Record or Tuple. - i.e. records, tuples, boxes, null, undefined, booleans, numbers, strings, symbols, and bigints. -

-

- The original rationale for introducing Box is to allow Records and Tuples to explicitly reference a value that would otherwise be disallowed - to be 'stored' directly within Records and Tuples e.g. functions. - Values like numbers can already be stored in a Record or Tuple. - While allowing primitives* to be stored in a Box may be ergonomic for the producer of the Box, - complexity has been moved to the consumers of Boxes. Consumers can no longer rely on the guarantee that a Box will always - reference a 'non-primitive*'. -

-

- It appears that there might be situations where checking if a Record contains an Object or not will be important, because of the difference in semantics. - e.g. checking for cycles, passing values across a ShadowRealm boundary, - or storing values in a WeakMap. - If primitives* can be stored in a Box, then code checking if a Record/Tuple transitively contains an Object can no - longer be performed with a single call to a

Box.containsBoxes
predicate, instead different/additional helpers would be needed for this use-case. - e.g.
Object.containsObject
or
Box.containsBoxWithIdentity
. These helpers may be harder to explain than 'containsBoxes'. - Note: These helpers can be implemented in user-land, recursively walking the tree inspecting the values. They do not necessarily need to be built-in. -

- " -} - -issue noPrimitivesInBox { - summary - "Box construction ergonomics" - description - "If the Box constructor throws for values that can be 'stored' directly in a Record and - Tuple, such as strings, numbers, booleans. This adds complexity for code that is trying to - use Boxes generically, they will now need to check if a value can be put in a Box before - attempting to construct the Box, or be sure to handle the possibility that an exception will - be thrown. From a different perspective there could be an advantage to an exception being - thrown - it may help clarify the purpose of Boxes and make unnecessary boxing - impossible." -} - -issue recordProxies { - summary - "Record proxies" - description - "It appears that a Record-Proxy would not be able to be much different from 'new - Proxy(Object.freeze({...record}), handler)'. This is because if the Proxy still retained - Record semantics, then equality checks would need to trigger the traps. Causing arbitrary JS - to run during previously safe operations like '==='. This means that the returning proxy can - not be transparent, and will instead be an object and not a record. It could be better to - throw instead so this API space remains open for new ideas on how to achieve this in the - future." -} - -issue proxyThrowTypeofObject { - summary - "proxy ergonomics" - description - "Usually if something has typeof 'object' then it would be safe to create a proxy of it. But - if records and tuples are typeof 'object' and throw when passed to the proxy constructor, - this causes users to update their code to manually convert Records/Tuples into their frozen - object counterparts before passing them to the proxy constructor." -} - -issue differenceBetweenEqualityForTypeofObject { - summary - "different equality of an object-like value" - description - "

- In current JavaScript if two values, 'a' and 'b', both have typeof 'object' then 'a === - b' and 'Object.is(a, b)' will always return the same result. -

-

- The current laboratory setup would mean that this is no longer an invariant of the - language. Because given two almost identical tuples, except one has positive zero, and - the other has negative zero. These would both have typeof 'object' and be '===' equal to - each other, but not equal when compared by Object.is. -

" -} - -issue boxType { - summary - "Box type" - description - "

- Introducing a Box type to the language adds more complexity to the language. -

" -} - -issue objectsDontHaveWrappers { - summary - "Value is already an object" - description - "

- If Records and Tuples are objects then

ToObject
should be an identity function. -

" -} - -issue tuplePrototypeEquality { - summary - "Tuple prototype equality" - description - "

- Records do not have a '[[prototype]]', it is null. Tuples on the other hand do have a '[[prototype]]', being lists they - can have many of the typical generic list operations (e.g. map, filter etc). - In fact Tuples have all the same non-mutating methods as Arrays. -

-

- If Tuples are objects this means that the methods on their '[[prototype]]' will be linked to the realm (e.g. iframe) in which they were created. - As opposed to primitives, where property access triggers a

ToObject
in the current executing realm. - This would mean that two Tuples created in different realms will carry around different prototypes. - The choice here is that either two objects with different prototypes can still be === equal to each other. - Or Tuples from different realms are never equal even if their contents are equal. -

" -}""" - -LAB_TWEAKABLES_TEMPLATE = """\ -tweakable typeofArray{lab_index} {{ - expression "typeof []" - default value "object" -}} - -tweakable typeofNan{lab_index} {{ - expression "typeof NaN" - default value "number" -}} - -tweakable zeroTripleEqualsNegativZero{lab_index} {{ - expression "+0 === -0" - default value true -}} - -tweakable zeroObjectIsNegativeZero{lab_index} {{ - expression "Object.is(+0, -0)" - default value false -}} - -tweakable arrayWithNegativeZeroIncludesZero{lab_index} {{ - expression "[-0].includes(+0)" - default value true -}} - -tweakable nanTripleEqualsNan{lab_index} {{ - expression "NaN === NaN" - default value false -}} - -tweakable nanObjectIsNan{lab_index} {{ - expression "Object.is(NaN, Nan)" - default value true -}} - -tweakable arrayWithNanIncludesNan{lab_index} {{ - expression "[NaN].includes(NaN)" - default value true -}} - -tweakable arrayWithZeroTripleEqualsArrayWithZero{lab_index} {{ - expression "[0] === [0]" - default value false -}} - -tweakable tupleWithZeroTripleEqualsTupleWithZero{lab_index} {{ - expression "#[0] === #[0]" - default value true -}} - -tweakable objectIsFrozenTupleWithZero{lab_index} {{ - expression "Object.isFrozen(#[0])" - default value true -}} - -/* - Tweakables -*/ - -tweakable storeNegativeZero{lab_index} {{ - expression "Object.is(#[-0].at(0), -0)" - default value true - value false {{ - raise noNegativeZero - }} -}} - -tweakable zerosAreTripleEqual{lab_index} {{ - expression "#[+0] === #[-0]" - default value true {{ - raise canNotAlwaysIntern when storeNegativeZero{lab_index} is true - }} - value False {{ - raise zerosNotTripleEqual when storeNegativeZero{lab_index} is true - raise impossibleEqualityOfZeros when storeNegativeZero{lab_index} is false - }} -}} - -tweakable tupleNaNAreTripleEqual{lab_index} {{ - expression "#[NaN] === #[NaN]" - default value true - value false {{ - raise unequalTupleNan - }} -}} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero{lab_index} {{ - expression "Object.is(#[+0], #[-0])" - default value false {{ - raise impossibleEqualityOfZeros when storeNegativeZero{lab_index} is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple{lab_index} is "object" and zerosAreTripleEqual{lab_index} is true - }} - value true {{ - raise observableDifferentButIsEqual when storeNegativeZero{lab_index} is true - }} -}} - -tweakable tupleWithNanObjectIsTupleWithNan{lab_index} {{ - expression "Object.is(#[NaN], #[NaN])" - default value true - value false {{ - raise nanNotIsNan when tupleNaNAreTripleEqual{lab_index} is true - }} -}} - -tweakable typeofTuple{lab_index} {{ - expression "typeof #[]" - default value "tuple" {{ - raise slotSensitiveTypeof when typeOfTupleWithBox{lab_index} is "tuple" and typeofBoxConstructor{lab_index} is "function" - }} - value "object" {{ - raise slotSensitiveTypeof when typeOfTupleWithBox{lab_index} is "object" and typeofBoxConstructor{lab_index} is "function" - raise tuplePrototypeEquality - }} -}} - -tweakable tupleWrappedInObjectTripleEqualsTuple{lab_index} {{ - expression "Object(#[]) === #[]" - default value false {{ - raise objectsDontHaveWrappers when typeofTuple{lab_index} is "object" - raise objectWrappers - }} - value true {{ - raise objectWrapperInConsistency when typeofTuple{lab_index} is "tuple" - }} -}} - -tweakable addingTupleToWeakSetThrows{lab_index} {{ - expression "new WeakSet().add(#[])" - default value "ShouldThrow" {{ - raise validWeakValue when typeofTuple{lab_index} is "object" - }} - value "ShouldSucceed" {{ - raise weakSetLeak - }} -}} - -tweakable tupleAsArgumentOfNewProxyThrows{lab_index} {{ - expression "new Proxy(#[])" - default value "ShouldThrow" {{ - raise proxyThrowTypeofObject when typeofTuple{lab_index} is "object" - }} - value "ShouldSucceed" {{ - raise recordProxies - }} -}} - -tweakable typeofBoxConstructor{lab_index} {{ - expression "typeof Box" - default value "undefined" {{ - raise withoutBox - }} - value "function" {{ - raise boxType - }} -}} - -tweakable typeofBoxInstance{lab_index} {{ - expression "typeof Box({{}})" - default value "box" {{ - raise typeofPowerfulObjectIsNotObject - }} - value "object" - disabled {{ - message "typeof Box === 'undefined'" when typeofBoxConstructor{lab_index} is "undefined" - }} -}} - -tweakable typeOfTupleWithBox{lab_index} {{ - expression "typeof #[Box({{}})]" - default value "tuple" {{ - raise confusingTypeof when typeofTuple{lab_index} is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance{lab_index} is "object" - }} - value "object" - disabled {{ - message "typeof Box === 'undefined'" when typeofBoxConstructor{lab_index} is "undefined" - }} -}} - -tweakable boxConstructorWithPrimitives{lab_index} {{ - expression "Box(42)" - default value "ShouldThrow" {{ - raise noPrimitivesInBox - }} - value "ShouldSucceed" {{ - raise storingPrimitiveInBox - }} - disabled {{ - message "typeof Box === 'undefined'" when typeofBoxConstructor{lab_index} is "undefined" - }} -}} - -tweakable addingTuplesWithBoxesToWeakSets{lab_index} {{ - expression "new WeakSet().add(#[Box({{}})])" - default value "ShouldThrow" {{ - raise noBoxesInWeakSets - }} - value "ShouldSucceed" - disabled {{ - message "typeof Box === 'undefined'" when typeofBoxConstructor{lab_index} is "undefined" - }} -}} - -tweakable tupleWithBoxAsArgumentForNewProxy{lab_index} {{ - expression "new Proxy(#[Box({{}})])" - default value "ShouldThrow" {{ - raise proxyThrowTypeofObject when typeOfTupleWithBox{lab_index} is "object" - }} - value "ShouldSucceed" {{ - raise recordProxies - }} - disabled {{ - message "typeof Box === 'undefined'" when typeofBoxConstructor{lab_index} is "undefined" - }} -}} -""" - -with open("./lab.jspl", 'w') as output: - output.write(LAB_PREFIX) - - randt_copies = ceil(WANTED_TWEAKABLES / TWEAKABLES_IN_R_AND_T) - total_tweakables = randt_copies * TWEAKABLES_IN_R_AND_T - - print(f"Duplicating R&T {randt_copies} times, resulting in {total_tweakables} Tweakables.") - - for i in range(randt_copies): - - output.write(LAB_TWEAKABLES_TEMPLATE.format(lab_index = str(i))) \ No newline at end of file diff --git a/examples/in/randt_times_n/times_67.jspl b/examples/in/randt_times_n/times_67.jspl deleted file mode 100644 index 06a42e41..00000000 --- a/examples/in/randt_times_n/times_67.jspl +++ /dev/null @@ -1,14787 +0,0 @@ - -laboratory { - title "Records and Tuples Laboratory 🔬" - description MD "🏗 Work in progress - [raise technical issue](https://github.com/acutmore/record-tuple-laboratory/issues/new)" - icon "./res/favicon.svg" - author "Ashley Claymore" - format HTML - version "2" -} - -issue withoutBox { - summary - "complexity moved to ecosystem" - description - "

Without a 'Box' like type there will not be any direct support in the language for storing objects in Records and Tuples.

- Instead using symbols-as-weakmap-keys, - symbols in Record and Tuples could still refer to objects/functions via a WeakMap. - Code will need to ensure the necessary code has access to these WeakMap side tables. - APIs conventions will need to be established to distinguish when symbols are being used in this way. - Care will need to be taken with the WeakMaps, if a Map is used by accident there is a risk of memory leaks. - Unless direct access to the WeakMap is hidden behind a wrapper, other code could remove/replace the referenced - object. -

- Box use-cases include: -

    -
  • Composite keys for Maps/Sets.
  • -
  • - In React.js creating and passing groups of values, possibly functions, - around without triggering re-renders due to changing object identity -
  • -
-

" -} - -issue typeofPowerfulObjectIsNotObject { - summary - "security risk" - description - "Existing security sensitive code checks if a value has no-power by checking if it's typeof - is not 'object' or 'function', and will assume values with other results are safe to - pass-around without further inspection. These projects may not be updated before they start - to interact with Records and Tuples." -} - -issue validWeakValue { - summary - "consistency change" - description - "Current code can rely on the consistency that values that have typeof 'object' and are not - null can be stored weakly. If R&T introduces values that have typeof 'object' but throw when - placed in a WeakSet this consistency is no longer reliable. And code will need to be updated." -} - -issue weakSetLeak { - summary - "memory leak" - description - "If values are allowed in a WeakSet that are impossible to be garbage-collected this could - create a silent memory leak." -} - -issue slotSensitiveTypeof { - summary - "slot sensitive typeof" - description - "If typeof a record or tuple changes depending on if there is a box transitively within its - tree this makes typeof confusing. Code will have to rely on static methods like - Record.isRecord instead." -} - -issue confusingTypeof { - summary - "problematic typeof" - description - "If a Tuple without a Box in it's tree has typeof 'object', there is no value to be gained - from a Tuple with a Box having typeof 'tuple', because if anything it is more like an object - when it contains a Box." -} - -issue objectWrappers { - summary - "object wrappers" - description - "

If Records and Tuples are not objects then a

ToObject
operation will return an object wrapper - which will have its own unique identity:
Object(#[]) !== Object(#[])

." -} - -issue objectWrapperInConsistency { - summary - "being objects" - description - "

Code may assume that if a value's typeof is not 'object' or 'function' then it is not an object, but if

ToObject
returns the value as is this implies that it is an object.

-

If Tuples are objects this means that the methods on their '[[prototype]]' will be linked to the realm (e.g. iframe) in which they were created. - As opposed to primitives, where property access triggers a

ToObject
in the current executing realm. - This would mean that two Tuples created in different realms will carry around different prototypes. - The choice here is that either two objects with different prototypes can still be === equal to each other. - Or Tuples from different realms are never equal even if their contents are equal. -

" -} - -issue noBoxesInWeakSets { - summary - "performance" - description - "Libraries may want to create values based on Records that contain boxes. For example, - mapping over a record and mapping each Box to something else. If this work is expensive, it - may be beneficial to memoize the work using a WeakMap. But this wouldn't be possible if - Records with Boxes can't be WeakMaps keys." -} - -issue unequalTupleNan { - summary - "consistency change" - description - "Currently the only value not equal to itself is NaN, and this can be used as a reliable - check for NaN. If any record or tuple containing a NaN within its tree is also not equal to - itself, then there would be an infinite number of values not equal to themselves. - " -} - -issue noNegativeZero { - summary - "no negative zero" - description - "

- Negative zero can be stored in a standard Array. If negative zero was transformed into - positive zero when stored in a tuple, then mapping arrays of numbers to and from tuples - would not be isomorphic. -

-

Being able to store a negative zero is considered important to some users.

- " -} - -issue impossibleEqualityOfZeros { - summary - "impossible equality" - description - "If negative zero can not be stored in a Tuple (converted to +0). Then #[-0] cannot compare - unequal to #[+0]." -} - -issue observableDifferentButIsEqual { - summary - "Object.is semantics" - description - "Putting aside that two NaNs can be observably different, by storing them in a TypedArray and - reading the bits. If Object.is returns true for two values this means the two values are not - observably different, this is useful for memoization techniques. For a pure function, if the - inputs have not changed in an observable way then neither should the output. React.js for - example uses Object.is for its change-detection. If two Tuples compare equal, but have - observably different values (one has positive zero and the other has negative zero), then - this changes the semantics of Object.is, and the use cases it can be applied to." -} - -issue nanNotIsNan { - summary - "Object.is NaN semantics" - description - "if both 'Object.is(NaN, NaN)' and '#[NaN] === #[NaN]'' are true, there does not appear to be - a reason for Object.is(#[NaN], #[NaN]) to not be true." -} - -issue canNotAlwaysIntern { - summary - "can not always intern" - description - "Object interning is a technique used to reduce memory and speed up certain operations after - the initial interning cost. If #[+0] equals #[-0] and storing negative zero in a tuple is - preserved then records and tuple equality can not solely rely on interning." -} - -issue zerosNotTripleEqual { - summary - "Triple equality semantics" - description - "As -0 === +0 on their own, it may surprise people that they are no longer treated as triple - equal when compared via a record or tuple. This could lead to bugs. - " -} - -issue storingPrimitiveInBox { - summary - "storing primitives* in a Box" - description - "

- primitives*: For want of a more appropriate term, in this section the term primitive will have the meaning: a value that can be directly stored in a Record or Tuple. - i.e. records, tuples, boxes, null, undefined, booleans, numbers, strings, symbols, and bigints. -

-

- The original rationale for introducing Box is to allow Records and Tuples to explicitly reference a value that would otherwise be disallowed - to be 'stored' directly within Records and Tuples e.g. functions. - Values like numbers can already be stored in a Record or Tuple. - While allowing primitives* to be stored in a Box may be ergonomic for the producer of the Box, - complexity has been moved to the consumers of Boxes. Consumers can no longer rely on the guarantee that a Box will always - reference a 'non-primitive*'. -

-

- It appears that there might be situations where checking if a Record contains an Object or not will be important, because of the difference in semantics. - e.g. checking for cycles, passing values across a ShadowRealm boundary, - or storing values in a WeakMap. - If primitives* can be stored in a Box, then code checking if a Record/Tuple transitively contains an Object can no - longer be performed with a single call to a

Box.containsBoxes
predicate, instead different/additional helpers would be needed for this use-case. - e.g.
Object.containsObject
or
Box.containsBoxWithIdentity
. These helpers may be harder to explain than 'containsBoxes'. - Note: These helpers can be implemented in user-land, recursively walking the tree inspecting the values. They do not necessarily need to be built-in. -

- " -} - -issue noPrimitivesInBox { - summary - "Box construction ergonomics" - description - "If the Box constructor throws for values that can be 'stored' directly in a Record and - Tuple, such as strings, numbers, booleans. This adds complexity for code that is trying to - use Boxes generically, they will now need to check if a value can be put in a Box before - attempting to construct the Box, or be sure to handle the possibility that an exception will - be thrown. From a different perspective there could be an advantage to an exception being - thrown - it may help clarify the purpose of Boxes and make unnecessary boxing - impossible." -} - -issue recordProxies { - summary - "Record proxies" - description - "It appears that a Record-Proxy would not be able to be much different from 'new - Proxy(Object.freeze({...record}), handler)'. This is because if the Proxy still retained - Record semantics, then equality checks would need to trigger the traps. Causing arbitrary JS - to run during previously safe operations like '==='. This means that the returning proxy can - not be transparent, and will instead be an object and not a record. It could be better to - throw instead so this API space remains open for new ideas on how to achieve this in the - future." -} - -issue proxyThrowTypeofObject { - summary - "proxy ergonomics" - description - "Usually if something has typeof 'object' then it would be safe to create a proxy of it. But - if records and tuples are typeof 'object' and throw when passed to the proxy constructor, - this causes users to update their code to manually convert Records/Tuples into their frozen - object counterparts before passing them to the proxy constructor." -} - -issue differenceBetweenEqualityForTypeofObject { - summary - "different equality of an object-like value" - description - "

- In current JavaScript if two values, 'a' and 'b', both have typeof 'object' then 'a === - b' and 'Object.is(a, b)' will always return the same result. -

-

- The current laboratory setup would mean that this is no longer an invariant of the - language. Because given two almost identical tuples, except one has positive zero, and - the other has negative zero. These would both have typeof 'object' and be '===' equal to - each other, but not equal when compared by Object.is. -

" -} - -issue boxType { - summary - "Box type" - description - "

- Introducing a Box type to the language adds more complexity to the language. -

" -} - -issue objectsDontHaveWrappers { - summary - "Value is already an object" - description - "

- If Records and Tuples are objects then

ToObject
should be an identity function. -

" -} - -issue tuplePrototypeEquality { - summary - "Tuple prototype equality" - description - "

- Records do not have a '[[prototype]]', it is null. Tuples on the other hand do have a '[[prototype]]', being lists they - can have many of the typical generic list operations (e.g. map, filter etc). - In fact Tuples have all the same non-mutating methods as Arrays. -

-

- If Tuples are objects this means that the methods on their '[[prototype]]' will be linked to the realm (e.g. iframe) in which they were created. - As opposed to primitives, where property access triggers a

ToObject
in the current executing realm. - This would mean that two Tuples created in different realms will carry around different prototypes. - The choice here is that either two objects with different prototypes can still be === equal to each other. - Or Tuples from different realms are never equal even if their contents are equal. -

" -}tweakable typeofArray0 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan0 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero0 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero0 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero0 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan0 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan0 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan0 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero0 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero0 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero0 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero0 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual0 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero0 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero0 is true - raise impossibleEqualityOfZeros when storeNegativeZero0 is false - } -} - -tweakable tupleNaNAreTripleEqual0 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero0 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero0 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple0 is "object" and zerosAreTripleEqual0 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero0 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan0 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual0 is true - } -} - -tweakable typeofTuple0 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox0 is "tuple" and typeofBoxConstructor0 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox0 is "object" and typeofBoxConstructor0 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple0 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple0 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple0 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows0 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple0 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows0 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple0 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor0 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance0 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor0 is "undefined" - } -} - -tweakable typeOfTupleWithBox0 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple0 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance0 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor0 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives0 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor0 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets0 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor0 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy0 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox0 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor0 is "undefined" - } -} -tweakable typeofArray1 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan1 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero1 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero1 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero1 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan1 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan1 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan1 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero1 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero1 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero1 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero1 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual1 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero1 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero1 is true - raise impossibleEqualityOfZeros when storeNegativeZero1 is false - } -} - -tweakable tupleNaNAreTripleEqual1 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero1 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero1 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple1 is "object" and zerosAreTripleEqual1 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero1 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan1 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual1 is true - } -} - -tweakable typeofTuple1 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox1 is "tuple" and typeofBoxConstructor1 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox1 is "object" and typeofBoxConstructor1 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple1 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple1 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple1 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows1 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple1 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows1 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple1 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor1 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance1 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor1 is "undefined" - } -} - -tweakable typeOfTupleWithBox1 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple1 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance1 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor1 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives1 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor1 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets1 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor1 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy1 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox1 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor1 is "undefined" - } -} -tweakable typeofArray2 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan2 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero2 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero2 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero2 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan2 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan2 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan2 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero2 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero2 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero2 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero2 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual2 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero2 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero2 is true - raise impossibleEqualityOfZeros when storeNegativeZero2 is false - } -} - -tweakable tupleNaNAreTripleEqual2 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero2 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero2 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple2 is "object" and zerosAreTripleEqual2 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero2 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan2 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual2 is true - } -} - -tweakable typeofTuple2 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox2 is "tuple" and typeofBoxConstructor2 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox2 is "object" and typeofBoxConstructor2 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple2 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple2 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple2 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows2 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple2 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows2 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple2 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor2 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance2 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor2 is "undefined" - } -} - -tweakable typeOfTupleWithBox2 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple2 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance2 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor2 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives2 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor2 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets2 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor2 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy2 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox2 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor2 is "undefined" - } -} -tweakable typeofArray3 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan3 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero3 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero3 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero3 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan3 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan3 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan3 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero3 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero3 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero3 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero3 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual3 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero3 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero3 is true - raise impossibleEqualityOfZeros when storeNegativeZero3 is false - } -} - -tweakable tupleNaNAreTripleEqual3 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero3 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero3 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple3 is "object" and zerosAreTripleEqual3 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero3 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan3 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual3 is true - } -} - -tweakable typeofTuple3 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox3 is "tuple" and typeofBoxConstructor3 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox3 is "object" and typeofBoxConstructor3 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple3 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple3 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple3 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows3 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple3 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows3 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple3 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor3 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance3 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor3 is "undefined" - } -} - -tweakable typeOfTupleWithBox3 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple3 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance3 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor3 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives3 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor3 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets3 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor3 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy3 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox3 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor3 is "undefined" - } -} -tweakable typeofArray4 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan4 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero4 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero4 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero4 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan4 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan4 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan4 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero4 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero4 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero4 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero4 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual4 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero4 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero4 is true - raise impossibleEqualityOfZeros when storeNegativeZero4 is false - } -} - -tweakable tupleNaNAreTripleEqual4 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero4 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero4 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple4 is "object" and zerosAreTripleEqual4 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero4 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan4 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual4 is true - } -} - -tweakable typeofTuple4 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox4 is "tuple" and typeofBoxConstructor4 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox4 is "object" and typeofBoxConstructor4 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple4 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple4 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple4 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows4 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple4 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows4 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple4 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor4 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance4 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor4 is "undefined" - } -} - -tweakable typeOfTupleWithBox4 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple4 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance4 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor4 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives4 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor4 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets4 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor4 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy4 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox4 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor4 is "undefined" - } -} -tweakable typeofArray5 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan5 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero5 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero5 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero5 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan5 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan5 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan5 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero5 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero5 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero5 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero5 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual5 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero5 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero5 is true - raise impossibleEqualityOfZeros when storeNegativeZero5 is false - } -} - -tweakable tupleNaNAreTripleEqual5 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero5 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero5 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple5 is "object" and zerosAreTripleEqual5 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero5 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan5 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual5 is true - } -} - -tweakable typeofTuple5 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox5 is "tuple" and typeofBoxConstructor5 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox5 is "object" and typeofBoxConstructor5 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple5 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple5 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple5 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows5 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple5 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows5 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple5 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor5 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance5 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor5 is "undefined" - } -} - -tweakable typeOfTupleWithBox5 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple5 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance5 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor5 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives5 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor5 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets5 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor5 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy5 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox5 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor5 is "undefined" - } -} -tweakable typeofArray6 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan6 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero6 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero6 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero6 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan6 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan6 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan6 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero6 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero6 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero6 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero6 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual6 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero6 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero6 is true - raise impossibleEqualityOfZeros when storeNegativeZero6 is false - } -} - -tweakable tupleNaNAreTripleEqual6 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero6 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero6 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple6 is "object" and zerosAreTripleEqual6 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero6 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan6 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual6 is true - } -} - -tweakable typeofTuple6 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox6 is "tuple" and typeofBoxConstructor6 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox6 is "object" and typeofBoxConstructor6 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple6 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple6 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple6 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows6 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple6 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows6 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple6 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor6 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance6 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor6 is "undefined" - } -} - -tweakable typeOfTupleWithBox6 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple6 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance6 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor6 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives6 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor6 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets6 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor6 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy6 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox6 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor6 is "undefined" - } -} -tweakable typeofArray7 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan7 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero7 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero7 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero7 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan7 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan7 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan7 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero7 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero7 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero7 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero7 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual7 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero7 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero7 is true - raise impossibleEqualityOfZeros when storeNegativeZero7 is false - } -} - -tweakable tupleNaNAreTripleEqual7 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero7 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero7 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple7 is "object" and zerosAreTripleEqual7 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero7 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan7 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual7 is true - } -} - -tweakable typeofTuple7 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox7 is "tuple" and typeofBoxConstructor7 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox7 is "object" and typeofBoxConstructor7 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple7 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple7 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple7 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows7 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple7 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows7 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple7 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor7 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance7 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor7 is "undefined" - } -} - -tweakable typeOfTupleWithBox7 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple7 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance7 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor7 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives7 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor7 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets7 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor7 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy7 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox7 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor7 is "undefined" - } -} -tweakable typeofArray8 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan8 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero8 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero8 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero8 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan8 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan8 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan8 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero8 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero8 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero8 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero8 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual8 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero8 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero8 is true - raise impossibleEqualityOfZeros when storeNegativeZero8 is false - } -} - -tweakable tupleNaNAreTripleEqual8 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero8 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero8 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple8 is "object" and zerosAreTripleEqual8 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero8 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan8 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual8 is true - } -} - -tweakable typeofTuple8 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox8 is "tuple" and typeofBoxConstructor8 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox8 is "object" and typeofBoxConstructor8 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple8 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple8 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple8 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows8 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple8 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows8 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple8 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor8 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance8 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor8 is "undefined" - } -} - -tweakable typeOfTupleWithBox8 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple8 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance8 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor8 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives8 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor8 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets8 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor8 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy8 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox8 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor8 is "undefined" - } -} -tweakable typeofArray9 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan9 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero9 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero9 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero9 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan9 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan9 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan9 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero9 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero9 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero9 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero9 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual9 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero9 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero9 is true - raise impossibleEqualityOfZeros when storeNegativeZero9 is false - } -} - -tweakable tupleNaNAreTripleEqual9 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero9 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero9 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple9 is "object" and zerosAreTripleEqual9 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero9 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan9 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual9 is true - } -} - -tweakable typeofTuple9 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox9 is "tuple" and typeofBoxConstructor9 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox9 is "object" and typeofBoxConstructor9 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple9 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple9 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple9 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows9 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple9 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows9 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple9 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor9 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance9 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor9 is "undefined" - } -} - -tweakable typeOfTupleWithBox9 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple9 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance9 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor9 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives9 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor9 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets9 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor9 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy9 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox9 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor9 is "undefined" - } -} -tweakable typeofArray10 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan10 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero10 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero10 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero10 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan10 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan10 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan10 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero10 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero10 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero10 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero10 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual10 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero10 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero10 is true - raise impossibleEqualityOfZeros when storeNegativeZero10 is false - } -} - -tweakable tupleNaNAreTripleEqual10 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero10 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero10 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple10 is "object" and zerosAreTripleEqual10 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero10 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan10 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual10 is true - } -} - -tweakable typeofTuple10 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox10 is "tuple" and typeofBoxConstructor10 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox10 is "object" and typeofBoxConstructor10 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple10 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple10 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple10 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows10 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple10 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows10 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple10 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor10 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance10 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor10 is "undefined" - } -} - -tweakable typeOfTupleWithBox10 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple10 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance10 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor10 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives10 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor10 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets10 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor10 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy10 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox10 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor10 is "undefined" - } -} -tweakable typeofArray11 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan11 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero11 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero11 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero11 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan11 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan11 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan11 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero11 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero11 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero11 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero11 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual11 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero11 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero11 is true - raise impossibleEqualityOfZeros when storeNegativeZero11 is false - } -} - -tweakable tupleNaNAreTripleEqual11 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero11 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero11 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple11 is "object" and zerosAreTripleEqual11 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero11 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan11 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual11 is true - } -} - -tweakable typeofTuple11 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox11 is "tuple" and typeofBoxConstructor11 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox11 is "object" and typeofBoxConstructor11 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple11 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple11 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple11 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows11 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple11 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows11 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple11 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor11 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance11 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor11 is "undefined" - } -} - -tweakable typeOfTupleWithBox11 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple11 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance11 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor11 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives11 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor11 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets11 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor11 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy11 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox11 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor11 is "undefined" - } -} -tweakable typeofArray12 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan12 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero12 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero12 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero12 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan12 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan12 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan12 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero12 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero12 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero12 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero12 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual12 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero12 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero12 is true - raise impossibleEqualityOfZeros when storeNegativeZero12 is false - } -} - -tweakable tupleNaNAreTripleEqual12 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero12 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero12 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple12 is "object" and zerosAreTripleEqual12 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero12 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan12 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual12 is true - } -} - -tweakable typeofTuple12 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox12 is "tuple" and typeofBoxConstructor12 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox12 is "object" and typeofBoxConstructor12 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple12 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple12 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple12 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows12 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple12 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows12 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple12 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor12 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance12 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor12 is "undefined" - } -} - -tweakable typeOfTupleWithBox12 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple12 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance12 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor12 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives12 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor12 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets12 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor12 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy12 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox12 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor12 is "undefined" - } -} -tweakable typeofArray13 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan13 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero13 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero13 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero13 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan13 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan13 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan13 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero13 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero13 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero13 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero13 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual13 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero13 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero13 is true - raise impossibleEqualityOfZeros when storeNegativeZero13 is false - } -} - -tweakable tupleNaNAreTripleEqual13 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero13 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero13 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple13 is "object" and zerosAreTripleEqual13 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero13 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan13 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual13 is true - } -} - -tweakable typeofTuple13 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox13 is "tuple" and typeofBoxConstructor13 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox13 is "object" and typeofBoxConstructor13 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple13 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple13 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple13 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows13 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple13 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows13 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple13 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor13 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance13 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor13 is "undefined" - } -} - -tweakable typeOfTupleWithBox13 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple13 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance13 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor13 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives13 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor13 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets13 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor13 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy13 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox13 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor13 is "undefined" - } -} -tweakable typeofArray14 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan14 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero14 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero14 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero14 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan14 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan14 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan14 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero14 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero14 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero14 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero14 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual14 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero14 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero14 is true - raise impossibleEqualityOfZeros when storeNegativeZero14 is false - } -} - -tweakable tupleNaNAreTripleEqual14 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero14 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero14 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple14 is "object" and zerosAreTripleEqual14 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero14 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan14 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual14 is true - } -} - -tweakable typeofTuple14 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox14 is "tuple" and typeofBoxConstructor14 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox14 is "object" and typeofBoxConstructor14 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple14 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple14 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple14 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows14 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple14 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows14 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple14 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor14 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance14 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor14 is "undefined" - } -} - -tweakable typeOfTupleWithBox14 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple14 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance14 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor14 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives14 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor14 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets14 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor14 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy14 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox14 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor14 is "undefined" - } -} -tweakable typeofArray15 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan15 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero15 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero15 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero15 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan15 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan15 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan15 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero15 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero15 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero15 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero15 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual15 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero15 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero15 is true - raise impossibleEqualityOfZeros when storeNegativeZero15 is false - } -} - -tweakable tupleNaNAreTripleEqual15 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero15 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero15 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple15 is "object" and zerosAreTripleEqual15 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero15 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan15 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual15 is true - } -} - -tweakable typeofTuple15 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox15 is "tuple" and typeofBoxConstructor15 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox15 is "object" and typeofBoxConstructor15 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple15 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple15 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple15 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows15 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple15 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows15 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple15 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor15 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance15 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor15 is "undefined" - } -} - -tweakable typeOfTupleWithBox15 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple15 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance15 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor15 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives15 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor15 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets15 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor15 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy15 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox15 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor15 is "undefined" - } -} -tweakable typeofArray16 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan16 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero16 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero16 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero16 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan16 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan16 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan16 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero16 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero16 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero16 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero16 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual16 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero16 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero16 is true - raise impossibleEqualityOfZeros when storeNegativeZero16 is false - } -} - -tweakable tupleNaNAreTripleEqual16 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero16 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero16 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple16 is "object" and zerosAreTripleEqual16 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero16 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan16 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual16 is true - } -} - -tweakable typeofTuple16 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox16 is "tuple" and typeofBoxConstructor16 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox16 is "object" and typeofBoxConstructor16 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple16 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple16 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple16 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows16 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple16 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows16 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple16 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor16 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance16 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor16 is "undefined" - } -} - -tweakable typeOfTupleWithBox16 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple16 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance16 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor16 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives16 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor16 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets16 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor16 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy16 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox16 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor16 is "undefined" - } -} -tweakable typeofArray17 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan17 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero17 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero17 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero17 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan17 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan17 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan17 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero17 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero17 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero17 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero17 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual17 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero17 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero17 is true - raise impossibleEqualityOfZeros when storeNegativeZero17 is false - } -} - -tweakable tupleNaNAreTripleEqual17 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero17 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero17 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple17 is "object" and zerosAreTripleEqual17 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero17 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan17 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual17 is true - } -} - -tweakable typeofTuple17 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox17 is "tuple" and typeofBoxConstructor17 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox17 is "object" and typeofBoxConstructor17 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple17 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple17 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple17 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows17 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple17 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows17 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple17 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor17 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance17 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor17 is "undefined" - } -} - -tweakable typeOfTupleWithBox17 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple17 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance17 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor17 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives17 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor17 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets17 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor17 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy17 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox17 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor17 is "undefined" - } -} -tweakable typeofArray18 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan18 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero18 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero18 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero18 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan18 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan18 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan18 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero18 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero18 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero18 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero18 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual18 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero18 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero18 is true - raise impossibleEqualityOfZeros when storeNegativeZero18 is false - } -} - -tweakable tupleNaNAreTripleEqual18 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero18 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero18 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple18 is "object" and zerosAreTripleEqual18 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero18 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan18 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual18 is true - } -} - -tweakable typeofTuple18 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox18 is "tuple" and typeofBoxConstructor18 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox18 is "object" and typeofBoxConstructor18 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple18 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple18 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple18 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows18 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple18 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows18 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple18 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor18 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance18 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor18 is "undefined" - } -} - -tweakable typeOfTupleWithBox18 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple18 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance18 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor18 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives18 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor18 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets18 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor18 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy18 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox18 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor18 is "undefined" - } -} -tweakable typeofArray19 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan19 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero19 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero19 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero19 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan19 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan19 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan19 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero19 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero19 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero19 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero19 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual19 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero19 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero19 is true - raise impossibleEqualityOfZeros when storeNegativeZero19 is false - } -} - -tweakable tupleNaNAreTripleEqual19 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero19 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero19 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple19 is "object" and zerosAreTripleEqual19 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero19 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan19 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual19 is true - } -} - -tweakable typeofTuple19 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox19 is "tuple" and typeofBoxConstructor19 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox19 is "object" and typeofBoxConstructor19 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple19 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple19 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple19 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows19 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple19 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows19 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple19 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor19 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance19 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor19 is "undefined" - } -} - -tweakable typeOfTupleWithBox19 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple19 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance19 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor19 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives19 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor19 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets19 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor19 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy19 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox19 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor19 is "undefined" - } -} -tweakable typeofArray20 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan20 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero20 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero20 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero20 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan20 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan20 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan20 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero20 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero20 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero20 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero20 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual20 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero20 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero20 is true - raise impossibleEqualityOfZeros when storeNegativeZero20 is false - } -} - -tweakable tupleNaNAreTripleEqual20 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero20 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero20 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple20 is "object" and zerosAreTripleEqual20 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero20 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan20 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual20 is true - } -} - -tweakable typeofTuple20 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox20 is "tuple" and typeofBoxConstructor20 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox20 is "object" and typeofBoxConstructor20 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple20 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple20 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple20 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows20 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple20 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows20 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple20 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor20 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance20 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor20 is "undefined" - } -} - -tweakable typeOfTupleWithBox20 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple20 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance20 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor20 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives20 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor20 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets20 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor20 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy20 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox20 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor20 is "undefined" - } -} -tweakable typeofArray21 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan21 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero21 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero21 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero21 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan21 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan21 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan21 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero21 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero21 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero21 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero21 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual21 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero21 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero21 is true - raise impossibleEqualityOfZeros when storeNegativeZero21 is false - } -} - -tweakable tupleNaNAreTripleEqual21 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero21 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero21 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple21 is "object" and zerosAreTripleEqual21 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero21 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan21 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual21 is true - } -} - -tweakable typeofTuple21 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox21 is "tuple" and typeofBoxConstructor21 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox21 is "object" and typeofBoxConstructor21 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple21 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple21 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple21 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows21 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple21 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows21 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple21 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor21 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance21 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor21 is "undefined" - } -} - -tweakable typeOfTupleWithBox21 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple21 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance21 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor21 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives21 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor21 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets21 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor21 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy21 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox21 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor21 is "undefined" - } -} -tweakable typeofArray22 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan22 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero22 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero22 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero22 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan22 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan22 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan22 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero22 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero22 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero22 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero22 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual22 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero22 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero22 is true - raise impossibleEqualityOfZeros when storeNegativeZero22 is false - } -} - -tweakable tupleNaNAreTripleEqual22 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero22 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero22 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple22 is "object" and zerosAreTripleEqual22 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero22 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan22 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual22 is true - } -} - -tweakable typeofTuple22 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox22 is "tuple" and typeofBoxConstructor22 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox22 is "object" and typeofBoxConstructor22 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple22 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple22 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple22 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows22 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple22 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows22 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple22 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor22 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance22 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor22 is "undefined" - } -} - -tweakable typeOfTupleWithBox22 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple22 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance22 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor22 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives22 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor22 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets22 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor22 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy22 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox22 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor22 is "undefined" - } -} -tweakable typeofArray23 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan23 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero23 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero23 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero23 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan23 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan23 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan23 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero23 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero23 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero23 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero23 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual23 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero23 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero23 is true - raise impossibleEqualityOfZeros when storeNegativeZero23 is false - } -} - -tweakable tupleNaNAreTripleEqual23 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero23 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero23 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple23 is "object" and zerosAreTripleEqual23 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero23 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan23 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual23 is true - } -} - -tweakable typeofTuple23 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox23 is "tuple" and typeofBoxConstructor23 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox23 is "object" and typeofBoxConstructor23 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple23 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple23 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple23 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows23 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple23 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows23 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple23 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor23 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance23 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor23 is "undefined" - } -} - -tweakable typeOfTupleWithBox23 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple23 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance23 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor23 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives23 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor23 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets23 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor23 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy23 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox23 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor23 is "undefined" - } -} -tweakable typeofArray24 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan24 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero24 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero24 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero24 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan24 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan24 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan24 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero24 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero24 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero24 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero24 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual24 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero24 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero24 is true - raise impossibleEqualityOfZeros when storeNegativeZero24 is false - } -} - -tweakable tupleNaNAreTripleEqual24 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero24 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero24 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple24 is "object" and zerosAreTripleEqual24 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero24 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan24 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual24 is true - } -} - -tweakable typeofTuple24 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox24 is "tuple" and typeofBoxConstructor24 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox24 is "object" and typeofBoxConstructor24 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple24 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple24 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple24 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows24 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple24 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows24 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple24 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor24 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance24 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor24 is "undefined" - } -} - -tweakable typeOfTupleWithBox24 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple24 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance24 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor24 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives24 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor24 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets24 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor24 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy24 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox24 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor24 is "undefined" - } -} -tweakable typeofArray25 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan25 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero25 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero25 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero25 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan25 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan25 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan25 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero25 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero25 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero25 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero25 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual25 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero25 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero25 is true - raise impossibleEqualityOfZeros when storeNegativeZero25 is false - } -} - -tweakable tupleNaNAreTripleEqual25 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero25 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero25 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple25 is "object" and zerosAreTripleEqual25 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero25 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan25 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual25 is true - } -} - -tweakable typeofTuple25 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox25 is "tuple" and typeofBoxConstructor25 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox25 is "object" and typeofBoxConstructor25 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple25 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple25 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple25 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows25 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple25 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows25 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple25 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor25 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance25 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor25 is "undefined" - } -} - -tweakable typeOfTupleWithBox25 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple25 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance25 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor25 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives25 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor25 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets25 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor25 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy25 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox25 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor25 is "undefined" - } -} -tweakable typeofArray26 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan26 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero26 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero26 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero26 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan26 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan26 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan26 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero26 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero26 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero26 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero26 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual26 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero26 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero26 is true - raise impossibleEqualityOfZeros when storeNegativeZero26 is false - } -} - -tweakable tupleNaNAreTripleEqual26 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero26 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero26 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple26 is "object" and zerosAreTripleEqual26 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero26 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan26 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual26 is true - } -} - -tweakable typeofTuple26 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox26 is "tuple" and typeofBoxConstructor26 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox26 is "object" and typeofBoxConstructor26 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple26 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple26 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple26 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows26 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple26 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows26 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple26 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor26 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance26 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor26 is "undefined" - } -} - -tweakable typeOfTupleWithBox26 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple26 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance26 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor26 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives26 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor26 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets26 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor26 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy26 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox26 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor26 is "undefined" - } -} -tweakable typeofArray27 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan27 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero27 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero27 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero27 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan27 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan27 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan27 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero27 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero27 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero27 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero27 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual27 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero27 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero27 is true - raise impossibleEqualityOfZeros when storeNegativeZero27 is false - } -} - -tweakable tupleNaNAreTripleEqual27 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero27 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero27 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple27 is "object" and zerosAreTripleEqual27 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero27 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan27 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual27 is true - } -} - -tweakable typeofTuple27 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox27 is "tuple" and typeofBoxConstructor27 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox27 is "object" and typeofBoxConstructor27 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple27 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple27 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple27 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows27 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple27 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows27 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple27 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor27 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance27 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor27 is "undefined" - } -} - -tweakable typeOfTupleWithBox27 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple27 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance27 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor27 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives27 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor27 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets27 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor27 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy27 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox27 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor27 is "undefined" - } -} -tweakable typeofArray28 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan28 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero28 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero28 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero28 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan28 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan28 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan28 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero28 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero28 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero28 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero28 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual28 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero28 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero28 is true - raise impossibleEqualityOfZeros when storeNegativeZero28 is false - } -} - -tweakable tupleNaNAreTripleEqual28 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero28 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero28 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple28 is "object" and zerosAreTripleEqual28 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero28 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan28 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual28 is true - } -} - -tweakable typeofTuple28 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox28 is "tuple" and typeofBoxConstructor28 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox28 is "object" and typeofBoxConstructor28 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple28 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple28 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple28 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows28 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple28 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows28 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple28 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor28 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance28 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor28 is "undefined" - } -} - -tweakable typeOfTupleWithBox28 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple28 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance28 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor28 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives28 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor28 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets28 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor28 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy28 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox28 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor28 is "undefined" - } -} -tweakable typeofArray29 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan29 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero29 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero29 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero29 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan29 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan29 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan29 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero29 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero29 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero29 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero29 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual29 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero29 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero29 is true - raise impossibleEqualityOfZeros when storeNegativeZero29 is false - } -} - -tweakable tupleNaNAreTripleEqual29 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero29 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero29 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple29 is "object" and zerosAreTripleEqual29 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero29 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan29 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual29 is true - } -} - -tweakable typeofTuple29 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox29 is "tuple" and typeofBoxConstructor29 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox29 is "object" and typeofBoxConstructor29 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple29 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple29 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple29 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows29 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple29 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows29 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple29 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor29 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance29 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor29 is "undefined" - } -} - -tweakable typeOfTupleWithBox29 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple29 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance29 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor29 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives29 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor29 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets29 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor29 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy29 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox29 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor29 is "undefined" - } -} -tweakable typeofArray30 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan30 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero30 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero30 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero30 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan30 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan30 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan30 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero30 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero30 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero30 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero30 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual30 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero30 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero30 is true - raise impossibleEqualityOfZeros when storeNegativeZero30 is false - } -} - -tweakable tupleNaNAreTripleEqual30 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero30 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero30 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple30 is "object" and zerosAreTripleEqual30 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero30 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan30 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual30 is true - } -} - -tweakable typeofTuple30 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox30 is "tuple" and typeofBoxConstructor30 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox30 is "object" and typeofBoxConstructor30 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple30 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple30 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple30 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows30 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple30 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows30 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple30 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor30 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance30 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor30 is "undefined" - } -} - -tweakable typeOfTupleWithBox30 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple30 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance30 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor30 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives30 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor30 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets30 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor30 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy30 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox30 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor30 is "undefined" - } -} -tweakable typeofArray31 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan31 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero31 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero31 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero31 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan31 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan31 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan31 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero31 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero31 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero31 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero31 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual31 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero31 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero31 is true - raise impossibleEqualityOfZeros when storeNegativeZero31 is false - } -} - -tweakable tupleNaNAreTripleEqual31 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero31 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero31 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple31 is "object" and zerosAreTripleEqual31 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero31 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan31 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual31 is true - } -} - -tweakable typeofTuple31 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox31 is "tuple" and typeofBoxConstructor31 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox31 is "object" and typeofBoxConstructor31 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple31 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple31 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple31 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows31 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple31 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows31 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple31 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor31 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance31 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor31 is "undefined" - } -} - -tweakable typeOfTupleWithBox31 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple31 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance31 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor31 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives31 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor31 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets31 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor31 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy31 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox31 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor31 is "undefined" - } -} -tweakable typeofArray32 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan32 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero32 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero32 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero32 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan32 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan32 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan32 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero32 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero32 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero32 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero32 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual32 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero32 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero32 is true - raise impossibleEqualityOfZeros when storeNegativeZero32 is false - } -} - -tweakable tupleNaNAreTripleEqual32 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero32 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero32 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple32 is "object" and zerosAreTripleEqual32 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero32 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan32 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual32 is true - } -} - -tweakable typeofTuple32 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox32 is "tuple" and typeofBoxConstructor32 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox32 is "object" and typeofBoxConstructor32 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple32 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple32 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple32 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows32 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple32 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows32 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple32 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor32 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance32 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor32 is "undefined" - } -} - -tweakable typeOfTupleWithBox32 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple32 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance32 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor32 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives32 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor32 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets32 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor32 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy32 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox32 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor32 is "undefined" - } -} -tweakable typeofArray33 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan33 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero33 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero33 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero33 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan33 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan33 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan33 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero33 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero33 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero33 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero33 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual33 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero33 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero33 is true - raise impossibleEqualityOfZeros when storeNegativeZero33 is false - } -} - -tweakable tupleNaNAreTripleEqual33 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero33 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero33 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple33 is "object" and zerosAreTripleEqual33 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero33 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan33 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual33 is true - } -} - -tweakable typeofTuple33 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox33 is "tuple" and typeofBoxConstructor33 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox33 is "object" and typeofBoxConstructor33 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple33 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple33 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple33 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows33 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple33 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows33 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple33 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor33 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance33 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor33 is "undefined" - } -} - -tweakable typeOfTupleWithBox33 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple33 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance33 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor33 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives33 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor33 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets33 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor33 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy33 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox33 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor33 is "undefined" - } -} -tweakable typeofArray34 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan34 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero34 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero34 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero34 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan34 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan34 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan34 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero34 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero34 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero34 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero34 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual34 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero34 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero34 is true - raise impossibleEqualityOfZeros when storeNegativeZero34 is false - } -} - -tweakable tupleNaNAreTripleEqual34 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero34 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero34 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple34 is "object" and zerosAreTripleEqual34 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero34 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan34 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual34 is true - } -} - -tweakable typeofTuple34 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox34 is "tuple" and typeofBoxConstructor34 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox34 is "object" and typeofBoxConstructor34 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple34 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple34 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple34 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows34 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple34 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows34 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple34 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor34 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance34 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor34 is "undefined" - } -} - -tweakable typeOfTupleWithBox34 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple34 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance34 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor34 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives34 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor34 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets34 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor34 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy34 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox34 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor34 is "undefined" - } -} -tweakable typeofArray35 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan35 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero35 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero35 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero35 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan35 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan35 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan35 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero35 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero35 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero35 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero35 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual35 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero35 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero35 is true - raise impossibleEqualityOfZeros when storeNegativeZero35 is false - } -} - -tweakable tupleNaNAreTripleEqual35 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero35 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero35 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple35 is "object" and zerosAreTripleEqual35 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero35 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan35 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual35 is true - } -} - -tweakable typeofTuple35 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox35 is "tuple" and typeofBoxConstructor35 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox35 is "object" and typeofBoxConstructor35 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple35 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple35 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple35 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows35 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple35 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows35 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple35 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor35 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance35 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor35 is "undefined" - } -} - -tweakable typeOfTupleWithBox35 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple35 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance35 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor35 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives35 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor35 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets35 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor35 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy35 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox35 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor35 is "undefined" - } -} -tweakable typeofArray36 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan36 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero36 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero36 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero36 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan36 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan36 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan36 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero36 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero36 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero36 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero36 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual36 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero36 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero36 is true - raise impossibleEqualityOfZeros when storeNegativeZero36 is false - } -} - -tweakable tupleNaNAreTripleEqual36 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero36 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero36 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple36 is "object" and zerosAreTripleEqual36 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero36 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan36 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual36 is true - } -} - -tweakable typeofTuple36 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox36 is "tuple" and typeofBoxConstructor36 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox36 is "object" and typeofBoxConstructor36 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple36 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple36 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple36 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows36 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple36 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows36 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple36 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor36 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance36 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor36 is "undefined" - } -} - -tweakable typeOfTupleWithBox36 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple36 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance36 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor36 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives36 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor36 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets36 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor36 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy36 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox36 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor36 is "undefined" - } -} -tweakable typeofArray37 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan37 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero37 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero37 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero37 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan37 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan37 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan37 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero37 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero37 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero37 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero37 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual37 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero37 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero37 is true - raise impossibleEqualityOfZeros when storeNegativeZero37 is false - } -} - -tweakable tupleNaNAreTripleEqual37 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero37 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero37 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple37 is "object" and zerosAreTripleEqual37 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero37 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan37 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual37 is true - } -} - -tweakable typeofTuple37 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox37 is "tuple" and typeofBoxConstructor37 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox37 is "object" and typeofBoxConstructor37 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple37 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple37 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple37 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows37 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple37 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows37 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple37 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor37 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance37 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor37 is "undefined" - } -} - -tweakable typeOfTupleWithBox37 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple37 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance37 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor37 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives37 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor37 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets37 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor37 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy37 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox37 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor37 is "undefined" - } -} -tweakable typeofArray38 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan38 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero38 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero38 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero38 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan38 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan38 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan38 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero38 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero38 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero38 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero38 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual38 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero38 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero38 is true - raise impossibleEqualityOfZeros when storeNegativeZero38 is false - } -} - -tweakable tupleNaNAreTripleEqual38 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero38 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero38 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple38 is "object" and zerosAreTripleEqual38 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero38 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan38 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual38 is true - } -} - -tweakable typeofTuple38 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox38 is "tuple" and typeofBoxConstructor38 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox38 is "object" and typeofBoxConstructor38 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple38 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple38 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple38 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows38 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple38 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows38 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple38 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor38 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance38 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor38 is "undefined" - } -} - -tweakable typeOfTupleWithBox38 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple38 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance38 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor38 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives38 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor38 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets38 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor38 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy38 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox38 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor38 is "undefined" - } -} -tweakable typeofArray39 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan39 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero39 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero39 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero39 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan39 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan39 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan39 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero39 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero39 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero39 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero39 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual39 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero39 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero39 is true - raise impossibleEqualityOfZeros when storeNegativeZero39 is false - } -} - -tweakable tupleNaNAreTripleEqual39 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero39 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero39 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple39 is "object" and zerosAreTripleEqual39 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero39 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan39 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual39 is true - } -} - -tweakable typeofTuple39 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox39 is "tuple" and typeofBoxConstructor39 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox39 is "object" and typeofBoxConstructor39 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple39 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple39 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple39 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows39 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple39 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows39 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple39 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor39 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance39 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor39 is "undefined" - } -} - -tweakable typeOfTupleWithBox39 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple39 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance39 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor39 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives39 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor39 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets39 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor39 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy39 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox39 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor39 is "undefined" - } -} -tweakable typeofArray40 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan40 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero40 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero40 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero40 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan40 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan40 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan40 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero40 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero40 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero40 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero40 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual40 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero40 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero40 is true - raise impossibleEqualityOfZeros when storeNegativeZero40 is false - } -} - -tweakable tupleNaNAreTripleEqual40 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero40 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero40 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple40 is "object" and zerosAreTripleEqual40 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero40 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan40 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual40 is true - } -} - -tweakable typeofTuple40 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox40 is "tuple" and typeofBoxConstructor40 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox40 is "object" and typeofBoxConstructor40 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple40 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple40 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple40 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows40 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple40 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows40 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple40 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor40 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance40 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor40 is "undefined" - } -} - -tweakable typeOfTupleWithBox40 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple40 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance40 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor40 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives40 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor40 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets40 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor40 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy40 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox40 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor40 is "undefined" - } -} -tweakable typeofArray41 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan41 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero41 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero41 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero41 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan41 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan41 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan41 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero41 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero41 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero41 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero41 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual41 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero41 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero41 is true - raise impossibleEqualityOfZeros when storeNegativeZero41 is false - } -} - -tweakable tupleNaNAreTripleEqual41 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero41 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero41 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple41 is "object" and zerosAreTripleEqual41 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero41 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan41 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual41 is true - } -} - -tweakable typeofTuple41 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox41 is "tuple" and typeofBoxConstructor41 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox41 is "object" and typeofBoxConstructor41 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple41 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple41 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple41 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows41 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple41 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows41 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple41 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor41 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance41 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor41 is "undefined" - } -} - -tweakable typeOfTupleWithBox41 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple41 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance41 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor41 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives41 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor41 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets41 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor41 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy41 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox41 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor41 is "undefined" - } -} -tweakable typeofArray42 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan42 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero42 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero42 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero42 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan42 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan42 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan42 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero42 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero42 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero42 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero42 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual42 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero42 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero42 is true - raise impossibleEqualityOfZeros when storeNegativeZero42 is false - } -} - -tweakable tupleNaNAreTripleEqual42 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero42 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero42 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple42 is "object" and zerosAreTripleEqual42 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero42 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan42 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual42 is true - } -} - -tweakable typeofTuple42 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox42 is "tuple" and typeofBoxConstructor42 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox42 is "object" and typeofBoxConstructor42 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple42 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple42 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple42 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows42 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple42 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows42 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple42 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor42 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance42 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor42 is "undefined" - } -} - -tweakable typeOfTupleWithBox42 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple42 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance42 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor42 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives42 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor42 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets42 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor42 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy42 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox42 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor42 is "undefined" - } -} -tweakable typeofArray43 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan43 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero43 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero43 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero43 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan43 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan43 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan43 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero43 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero43 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero43 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero43 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual43 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero43 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero43 is true - raise impossibleEqualityOfZeros when storeNegativeZero43 is false - } -} - -tweakable tupleNaNAreTripleEqual43 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero43 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero43 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple43 is "object" and zerosAreTripleEqual43 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero43 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan43 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual43 is true - } -} - -tweakable typeofTuple43 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox43 is "tuple" and typeofBoxConstructor43 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox43 is "object" and typeofBoxConstructor43 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple43 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple43 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple43 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows43 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple43 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows43 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple43 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor43 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance43 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor43 is "undefined" - } -} - -tweakable typeOfTupleWithBox43 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple43 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance43 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor43 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives43 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor43 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets43 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor43 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy43 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox43 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor43 is "undefined" - } -} -tweakable typeofArray44 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan44 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero44 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero44 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero44 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan44 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan44 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan44 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero44 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero44 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero44 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero44 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual44 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero44 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero44 is true - raise impossibleEqualityOfZeros when storeNegativeZero44 is false - } -} - -tweakable tupleNaNAreTripleEqual44 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero44 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero44 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple44 is "object" and zerosAreTripleEqual44 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero44 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan44 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual44 is true - } -} - -tweakable typeofTuple44 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox44 is "tuple" and typeofBoxConstructor44 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox44 is "object" and typeofBoxConstructor44 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple44 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple44 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple44 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows44 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple44 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows44 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple44 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor44 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance44 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor44 is "undefined" - } -} - -tweakable typeOfTupleWithBox44 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple44 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance44 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor44 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives44 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor44 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets44 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor44 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy44 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox44 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor44 is "undefined" - } -} -tweakable typeofArray45 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan45 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero45 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero45 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero45 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan45 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan45 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan45 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero45 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero45 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero45 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero45 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual45 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero45 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero45 is true - raise impossibleEqualityOfZeros when storeNegativeZero45 is false - } -} - -tweakable tupleNaNAreTripleEqual45 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero45 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero45 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple45 is "object" and zerosAreTripleEqual45 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero45 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan45 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual45 is true - } -} - -tweakable typeofTuple45 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox45 is "tuple" and typeofBoxConstructor45 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox45 is "object" and typeofBoxConstructor45 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple45 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple45 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple45 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows45 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple45 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows45 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple45 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor45 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance45 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor45 is "undefined" - } -} - -tweakable typeOfTupleWithBox45 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple45 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance45 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor45 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives45 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor45 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets45 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor45 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy45 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox45 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor45 is "undefined" - } -} -tweakable typeofArray46 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan46 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero46 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero46 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero46 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan46 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan46 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan46 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero46 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero46 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero46 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero46 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual46 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero46 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero46 is true - raise impossibleEqualityOfZeros when storeNegativeZero46 is false - } -} - -tweakable tupleNaNAreTripleEqual46 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero46 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero46 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple46 is "object" and zerosAreTripleEqual46 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero46 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan46 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual46 is true - } -} - -tweakable typeofTuple46 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox46 is "tuple" and typeofBoxConstructor46 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox46 is "object" and typeofBoxConstructor46 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple46 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple46 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple46 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows46 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple46 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows46 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple46 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor46 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance46 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor46 is "undefined" - } -} - -tweakable typeOfTupleWithBox46 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple46 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance46 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor46 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives46 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor46 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets46 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor46 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy46 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox46 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor46 is "undefined" - } -} -tweakable typeofArray47 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan47 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero47 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero47 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero47 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan47 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan47 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan47 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero47 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero47 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero47 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero47 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual47 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero47 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero47 is true - raise impossibleEqualityOfZeros when storeNegativeZero47 is false - } -} - -tweakable tupleNaNAreTripleEqual47 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero47 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero47 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple47 is "object" and zerosAreTripleEqual47 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero47 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan47 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual47 is true - } -} - -tweakable typeofTuple47 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox47 is "tuple" and typeofBoxConstructor47 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox47 is "object" and typeofBoxConstructor47 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple47 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple47 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple47 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows47 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple47 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows47 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple47 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor47 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance47 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor47 is "undefined" - } -} - -tweakable typeOfTupleWithBox47 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple47 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance47 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor47 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives47 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor47 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets47 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor47 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy47 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox47 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor47 is "undefined" - } -} -tweakable typeofArray48 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan48 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero48 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero48 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero48 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan48 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan48 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan48 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero48 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero48 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero48 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero48 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual48 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero48 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero48 is true - raise impossibleEqualityOfZeros when storeNegativeZero48 is false - } -} - -tweakable tupleNaNAreTripleEqual48 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero48 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero48 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple48 is "object" and zerosAreTripleEqual48 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero48 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan48 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual48 is true - } -} - -tweakable typeofTuple48 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox48 is "tuple" and typeofBoxConstructor48 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox48 is "object" and typeofBoxConstructor48 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple48 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple48 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple48 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows48 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple48 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows48 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple48 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor48 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance48 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor48 is "undefined" - } -} - -tweakable typeOfTupleWithBox48 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple48 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance48 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor48 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives48 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor48 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets48 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor48 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy48 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox48 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor48 is "undefined" - } -} -tweakable typeofArray49 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan49 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero49 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero49 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero49 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan49 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan49 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan49 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero49 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero49 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero49 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero49 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual49 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero49 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero49 is true - raise impossibleEqualityOfZeros when storeNegativeZero49 is false - } -} - -tweakable tupleNaNAreTripleEqual49 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero49 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero49 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple49 is "object" and zerosAreTripleEqual49 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero49 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan49 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual49 is true - } -} - -tweakable typeofTuple49 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox49 is "tuple" and typeofBoxConstructor49 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox49 is "object" and typeofBoxConstructor49 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple49 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple49 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple49 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows49 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple49 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows49 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple49 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor49 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance49 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor49 is "undefined" - } -} - -tweakable typeOfTupleWithBox49 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple49 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance49 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor49 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives49 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor49 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets49 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor49 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy49 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox49 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor49 is "undefined" - } -} -tweakable typeofArray50 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan50 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero50 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero50 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero50 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan50 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan50 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan50 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero50 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero50 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero50 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero50 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual50 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero50 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero50 is true - raise impossibleEqualityOfZeros when storeNegativeZero50 is false - } -} - -tweakable tupleNaNAreTripleEqual50 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero50 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero50 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple50 is "object" and zerosAreTripleEqual50 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero50 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan50 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual50 is true - } -} - -tweakable typeofTuple50 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox50 is "tuple" and typeofBoxConstructor50 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox50 is "object" and typeofBoxConstructor50 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple50 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple50 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple50 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows50 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple50 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows50 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple50 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor50 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance50 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor50 is "undefined" - } -} - -tweakable typeOfTupleWithBox50 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple50 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance50 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor50 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives50 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor50 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets50 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor50 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy50 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox50 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor50 is "undefined" - } -} -tweakable typeofArray51 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan51 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero51 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero51 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero51 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan51 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan51 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan51 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero51 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero51 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero51 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero51 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual51 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero51 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero51 is true - raise impossibleEqualityOfZeros when storeNegativeZero51 is false - } -} - -tweakable tupleNaNAreTripleEqual51 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero51 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero51 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple51 is "object" and zerosAreTripleEqual51 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero51 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan51 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual51 is true - } -} - -tweakable typeofTuple51 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox51 is "tuple" and typeofBoxConstructor51 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox51 is "object" and typeofBoxConstructor51 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple51 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple51 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple51 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows51 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple51 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows51 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple51 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor51 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance51 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor51 is "undefined" - } -} - -tweakable typeOfTupleWithBox51 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple51 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance51 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor51 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives51 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor51 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets51 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor51 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy51 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox51 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor51 is "undefined" - } -} -tweakable typeofArray52 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan52 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero52 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero52 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero52 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan52 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan52 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan52 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero52 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero52 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero52 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero52 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual52 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero52 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero52 is true - raise impossibleEqualityOfZeros when storeNegativeZero52 is false - } -} - -tweakable tupleNaNAreTripleEqual52 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero52 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero52 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple52 is "object" and zerosAreTripleEqual52 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero52 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan52 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual52 is true - } -} - -tweakable typeofTuple52 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox52 is "tuple" and typeofBoxConstructor52 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox52 is "object" and typeofBoxConstructor52 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple52 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple52 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple52 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows52 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple52 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows52 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple52 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor52 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance52 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor52 is "undefined" - } -} - -tweakable typeOfTupleWithBox52 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple52 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance52 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor52 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives52 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor52 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets52 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor52 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy52 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox52 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor52 is "undefined" - } -} -tweakable typeofArray53 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan53 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero53 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero53 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero53 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan53 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan53 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan53 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero53 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero53 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero53 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero53 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual53 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero53 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero53 is true - raise impossibleEqualityOfZeros when storeNegativeZero53 is false - } -} - -tweakable tupleNaNAreTripleEqual53 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero53 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero53 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple53 is "object" and zerosAreTripleEqual53 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero53 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan53 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual53 is true - } -} - -tweakable typeofTuple53 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox53 is "tuple" and typeofBoxConstructor53 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox53 is "object" and typeofBoxConstructor53 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple53 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple53 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple53 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows53 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple53 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows53 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple53 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor53 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance53 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor53 is "undefined" - } -} - -tweakable typeOfTupleWithBox53 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple53 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance53 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor53 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives53 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor53 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets53 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor53 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy53 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox53 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor53 is "undefined" - } -} -tweakable typeofArray54 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan54 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero54 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero54 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero54 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan54 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan54 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan54 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero54 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero54 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero54 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero54 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual54 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero54 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero54 is true - raise impossibleEqualityOfZeros when storeNegativeZero54 is false - } -} - -tweakable tupleNaNAreTripleEqual54 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero54 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero54 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple54 is "object" and zerosAreTripleEqual54 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero54 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan54 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual54 is true - } -} - -tweakable typeofTuple54 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox54 is "tuple" and typeofBoxConstructor54 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox54 is "object" and typeofBoxConstructor54 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple54 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple54 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple54 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows54 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple54 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows54 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple54 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor54 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance54 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor54 is "undefined" - } -} - -tweakable typeOfTupleWithBox54 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple54 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance54 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor54 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives54 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor54 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets54 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor54 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy54 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox54 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor54 is "undefined" - } -} -tweakable typeofArray55 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan55 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero55 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero55 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero55 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan55 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan55 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan55 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero55 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero55 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero55 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero55 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual55 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero55 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero55 is true - raise impossibleEqualityOfZeros when storeNegativeZero55 is false - } -} - -tweakable tupleNaNAreTripleEqual55 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero55 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero55 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple55 is "object" and zerosAreTripleEqual55 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero55 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan55 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual55 is true - } -} - -tweakable typeofTuple55 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox55 is "tuple" and typeofBoxConstructor55 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox55 is "object" and typeofBoxConstructor55 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple55 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple55 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple55 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows55 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple55 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows55 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple55 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor55 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance55 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor55 is "undefined" - } -} - -tweakable typeOfTupleWithBox55 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple55 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance55 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor55 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives55 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor55 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets55 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor55 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy55 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox55 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor55 is "undefined" - } -} -tweakable typeofArray56 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan56 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero56 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero56 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero56 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan56 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan56 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan56 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero56 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero56 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero56 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero56 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual56 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero56 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero56 is true - raise impossibleEqualityOfZeros when storeNegativeZero56 is false - } -} - -tweakable tupleNaNAreTripleEqual56 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero56 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero56 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple56 is "object" and zerosAreTripleEqual56 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero56 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan56 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual56 is true - } -} - -tweakable typeofTuple56 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox56 is "tuple" and typeofBoxConstructor56 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox56 is "object" and typeofBoxConstructor56 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple56 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple56 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple56 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows56 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple56 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows56 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple56 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor56 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance56 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor56 is "undefined" - } -} - -tweakable typeOfTupleWithBox56 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple56 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance56 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor56 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives56 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor56 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets56 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor56 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy56 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox56 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor56 is "undefined" - } -} -tweakable typeofArray57 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan57 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero57 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero57 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero57 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan57 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan57 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan57 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero57 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero57 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero57 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero57 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual57 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero57 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero57 is true - raise impossibleEqualityOfZeros when storeNegativeZero57 is false - } -} - -tweakable tupleNaNAreTripleEqual57 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero57 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero57 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple57 is "object" and zerosAreTripleEqual57 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero57 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan57 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual57 is true - } -} - -tweakable typeofTuple57 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox57 is "tuple" and typeofBoxConstructor57 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox57 is "object" and typeofBoxConstructor57 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple57 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple57 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple57 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows57 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple57 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows57 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple57 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor57 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance57 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor57 is "undefined" - } -} - -tweakable typeOfTupleWithBox57 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple57 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance57 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor57 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives57 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor57 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets57 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor57 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy57 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox57 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor57 is "undefined" - } -} -tweakable typeofArray58 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan58 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero58 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero58 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero58 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan58 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan58 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan58 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero58 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero58 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero58 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero58 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual58 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero58 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero58 is true - raise impossibleEqualityOfZeros when storeNegativeZero58 is false - } -} - -tweakable tupleNaNAreTripleEqual58 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero58 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero58 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple58 is "object" and zerosAreTripleEqual58 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero58 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan58 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual58 is true - } -} - -tweakable typeofTuple58 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox58 is "tuple" and typeofBoxConstructor58 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox58 is "object" and typeofBoxConstructor58 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple58 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple58 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple58 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows58 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple58 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows58 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple58 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor58 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance58 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor58 is "undefined" - } -} - -tweakable typeOfTupleWithBox58 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple58 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance58 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor58 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives58 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor58 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets58 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor58 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy58 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox58 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor58 is "undefined" - } -} -tweakable typeofArray59 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan59 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero59 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero59 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero59 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan59 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan59 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan59 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero59 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero59 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero59 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero59 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual59 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero59 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero59 is true - raise impossibleEqualityOfZeros when storeNegativeZero59 is false - } -} - -tweakable tupleNaNAreTripleEqual59 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero59 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero59 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple59 is "object" and zerosAreTripleEqual59 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero59 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan59 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual59 is true - } -} - -tweakable typeofTuple59 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox59 is "tuple" and typeofBoxConstructor59 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox59 is "object" and typeofBoxConstructor59 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple59 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple59 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple59 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows59 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple59 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows59 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple59 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor59 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance59 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor59 is "undefined" - } -} - -tweakable typeOfTupleWithBox59 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple59 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance59 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor59 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives59 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor59 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets59 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor59 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy59 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox59 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor59 is "undefined" - } -} -tweakable typeofArray60 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan60 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero60 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero60 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero60 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan60 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan60 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan60 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero60 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero60 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero60 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero60 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual60 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero60 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero60 is true - raise impossibleEqualityOfZeros when storeNegativeZero60 is false - } -} - -tweakable tupleNaNAreTripleEqual60 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero60 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero60 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple60 is "object" and zerosAreTripleEqual60 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero60 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan60 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual60 is true - } -} - -tweakable typeofTuple60 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox60 is "tuple" and typeofBoxConstructor60 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox60 is "object" and typeofBoxConstructor60 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple60 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple60 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple60 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows60 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple60 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows60 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple60 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor60 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance60 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor60 is "undefined" - } -} - -tweakable typeOfTupleWithBox60 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple60 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance60 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor60 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives60 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor60 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets60 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor60 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy60 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox60 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor60 is "undefined" - } -} -tweakable typeofArray61 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan61 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero61 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero61 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero61 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan61 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan61 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan61 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero61 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero61 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero61 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero61 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual61 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero61 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero61 is true - raise impossibleEqualityOfZeros when storeNegativeZero61 is false - } -} - -tweakable tupleNaNAreTripleEqual61 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero61 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero61 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple61 is "object" and zerosAreTripleEqual61 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero61 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan61 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual61 is true - } -} - -tweakable typeofTuple61 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox61 is "tuple" and typeofBoxConstructor61 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox61 is "object" and typeofBoxConstructor61 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple61 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple61 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple61 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows61 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple61 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows61 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple61 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor61 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance61 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor61 is "undefined" - } -} - -tweakable typeOfTupleWithBox61 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple61 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance61 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor61 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives61 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor61 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets61 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor61 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy61 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox61 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor61 is "undefined" - } -} -tweakable typeofArray62 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan62 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero62 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero62 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero62 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan62 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan62 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan62 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero62 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero62 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero62 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero62 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual62 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero62 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero62 is true - raise impossibleEqualityOfZeros when storeNegativeZero62 is false - } -} - -tweakable tupleNaNAreTripleEqual62 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero62 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero62 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple62 is "object" and zerosAreTripleEqual62 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero62 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan62 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual62 is true - } -} - -tweakable typeofTuple62 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox62 is "tuple" and typeofBoxConstructor62 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox62 is "object" and typeofBoxConstructor62 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple62 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple62 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple62 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows62 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple62 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows62 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple62 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor62 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance62 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor62 is "undefined" - } -} - -tweakable typeOfTupleWithBox62 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple62 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance62 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor62 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives62 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor62 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets62 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor62 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy62 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox62 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor62 is "undefined" - } -} -tweakable typeofArray63 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan63 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero63 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero63 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero63 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan63 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan63 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan63 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero63 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero63 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero63 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero63 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual63 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero63 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero63 is true - raise impossibleEqualityOfZeros when storeNegativeZero63 is false - } -} - -tweakable tupleNaNAreTripleEqual63 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero63 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero63 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple63 is "object" and zerosAreTripleEqual63 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero63 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan63 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual63 is true - } -} - -tweakable typeofTuple63 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox63 is "tuple" and typeofBoxConstructor63 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox63 is "object" and typeofBoxConstructor63 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple63 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple63 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple63 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows63 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple63 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows63 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple63 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor63 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance63 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor63 is "undefined" - } -} - -tweakable typeOfTupleWithBox63 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple63 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance63 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor63 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives63 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor63 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets63 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor63 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy63 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox63 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor63 is "undefined" - } -} -tweakable typeofArray64 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan64 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero64 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero64 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero64 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan64 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan64 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan64 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero64 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero64 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero64 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero64 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual64 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero64 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero64 is true - raise impossibleEqualityOfZeros when storeNegativeZero64 is false - } -} - -tweakable tupleNaNAreTripleEqual64 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero64 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero64 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple64 is "object" and zerosAreTripleEqual64 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero64 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan64 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual64 is true - } -} - -tweakable typeofTuple64 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox64 is "tuple" and typeofBoxConstructor64 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox64 is "object" and typeofBoxConstructor64 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple64 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple64 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple64 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows64 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple64 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows64 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple64 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor64 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance64 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor64 is "undefined" - } -} - -tweakable typeOfTupleWithBox64 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple64 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance64 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor64 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives64 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor64 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets64 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor64 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy64 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox64 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor64 is "undefined" - } -} -tweakable typeofArray65 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan65 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero65 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero65 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero65 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan65 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan65 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan65 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero65 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero65 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero65 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero65 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual65 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero65 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero65 is true - raise impossibleEqualityOfZeros when storeNegativeZero65 is false - } -} - -tweakable tupleNaNAreTripleEqual65 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero65 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero65 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple65 is "object" and zerosAreTripleEqual65 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero65 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan65 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual65 is true - } -} - -tweakable typeofTuple65 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox65 is "tuple" and typeofBoxConstructor65 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox65 is "object" and typeofBoxConstructor65 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple65 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple65 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple65 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows65 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple65 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows65 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple65 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor65 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance65 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor65 is "undefined" - } -} - -tweakable typeOfTupleWithBox65 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple65 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance65 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor65 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives65 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor65 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets65 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor65 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy65 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox65 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor65 is "undefined" - } -} -tweakable typeofArray66 { - expression "typeof []" - default value "object" -} - -tweakable typeofNan66 { - expression "typeof NaN" - default value "number" -} - -tweakable zeroTripleEqualsNegativZero66 { - expression "+0 === -0" - default value true -} - -tweakable zeroObjectIsNegativeZero66 { - expression "Object.is(+0, -0)" - default value false -} - -tweakable arrayWithNegativeZeroIncludesZero66 { - expression "[-0].includes(+0)" - default value true -} - -tweakable nanTripleEqualsNan66 { - expression "NaN === NaN" - default value false -} - -tweakable nanObjectIsNan66 { - expression "Object.is(NaN, Nan)" - default value true -} - -tweakable arrayWithNanIncludesNan66 { - expression "[NaN].includes(NaN)" - default value true -} - -tweakable arrayWithZeroTripleEqualsArrayWithZero66 { - expression "[0] === [0]" - default value false -} - -tweakable tupleWithZeroTripleEqualsTupleWithZero66 { - expression "#[0] === #[0]" - default value true -} - -tweakable objectIsFrozenTupleWithZero66 { - expression "Object.isFrozen(#[0])" - default value true -} - -/* - Tweakables -*/ - -tweakable storeNegativeZero66 { - expression "Object.is(#[-0].at(0), -0)" - default value true - value false { - raise noNegativeZero - } -} - -tweakable zerosAreTripleEqual66 { - expression "#[+0] === #[-0]" - default value true { - raise canNotAlwaysIntern when storeNegativeZero66 is true - } - value False { - raise zerosNotTripleEqual when storeNegativeZero66 is true - raise impossibleEqualityOfZeros when storeNegativeZero66 is false - } -} - -tweakable tupleNaNAreTripleEqual66 { - expression "#[NaN] === #[NaN]" - default value true - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithZeroObjectIsTupleWithNegativeZero66 { - expression "Object.is(#[+0], #[-0])" - default value false { - raise impossibleEqualityOfZeros when storeNegativeZero66 is false - raise differenceBetweenEqualityForTypeofObject when typeofTuple66 is "object" and zerosAreTripleEqual66 is true - } - value true { - raise observableDifferentButIsEqual when storeNegativeZero66 is true - } -} - -tweakable tupleWithNanObjectIsTupleWithNan66 { - expression "Object.is(#[NaN], #[NaN])" - default value true - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual66 is true - } -} - -tweakable typeofTuple66 { - expression "typeof #[]" - default value "tuple" { - raise slotSensitiveTypeof when typeOfTupleWithBox66 is "tuple" and typeofBoxConstructor66 is "function" - } - value "object" { - raise slotSensitiveTypeof when typeOfTupleWithBox66 is "object" and typeofBoxConstructor66 is "function" - raise tuplePrototypeEquality - } -} - -tweakable tupleWrappedInObjectTripleEqualsTuple66 { - expression "Object(#[]) === #[]" - default value false { - raise objectsDontHaveWrappers when typeofTuple66 is "object" - raise objectWrappers - } - value true { - raise objectWrapperInConsistency when typeofTuple66 is "tuple" - } -} - -tweakable addingTupleToWeakSetThrows66 { - expression "new WeakSet().add(#[])" - default value "ShouldThrow" { - raise validWeakValue when typeofTuple66 is "object" - } - value "ShouldSucceed" { - raise weakSetLeak - } -} - -tweakable tupleAsArgumentOfNewProxyThrows66 { - expression "new Proxy(#[])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeofTuple66 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } -} - -tweakable typeofBoxConstructor66 { - expression "typeof Box" - default value "undefined" { - raise withoutBox - } - value "function" { - raise boxType - } -} - -tweakable typeofBoxInstance66 { - expression "typeof Box({})" - default value "box" { - raise typeofPowerfulObjectIsNotObject - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor66 is "undefined" - } -} - -tweakable typeOfTupleWithBox66 { - expression "typeof #[Box({})]" - default value "tuple" { - raise confusingTypeof when typeofTuple66 is "object" - raise typeofPowerfulObjectIsNotObject when typeofBoxInstance66 is "object" - } - value "object" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor66 is "undefined" - } -} - -tweakable boxConstructorWithPrimitives66 { - expression "Box(42)" - default value "ShouldThrow" { - raise noPrimitivesInBox - } - value "ShouldSucceed" { - raise storingPrimitiveInBox - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor66 is "undefined" - } -} - -tweakable addingTuplesWithBoxesToWeakSets66 { - expression "new WeakSet().add(#[Box({})])" - default value "ShouldThrow" { - raise noBoxesInWeakSets - } - value "ShouldSucceed" - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor66 is "undefined" - } -} - -tweakable tupleWithBoxAsArgumentForNewProxy66 { - expression "new Proxy(#[Box({})])" - default value "ShouldThrow" { - raise proxyThrowTypeofObject when typeOfTupleWithBox66 is "object" - } - value "ShouldSucceed" { - raise recordProxies - } - disabled { - message "typeof Box === 'undefined'" when typeofBoxConstructor66 is "undefined" - } -} diff --git a/examples/in/records_and_tuples.jspl b/examples/in/records_and_tuples.spa similarity index 100% rename from examples/in/records_and_tuples.jspl rename to examples/in/records_and_tuples.spa diff --git a/examples/in/running_example.jspl b/examples/in/running_example.jspl deleted file mode 100644 index b9e88727..00000000 --- a/examples/in/running_example.jspl +++ /dev/null @@ -1,45 +0,0 @@ -issue unequalTupleNan { - summary - "consistency change" - description - "Currently the only value not equal to itself is NaN, and this can be used as a reliable - check for NaN. If any record or tuple containing a NaN within its tree is also not equal to - itself, then there would be an infinite number of values not equal to themselves. - " -} - -issue nanNotIsNan { - summary - "Object.is NaN semantics" - description - "if both 'Object.is(NaN, NaN)' and '#[NaN] === #[NaN]'' are true, there does not appear to be - a reason for Object.is(#[NaN], #[NaN]) to not be true." -} - - -/* - Tweakables -*/ - - -tweakable tupleNaNAreTripleEqual { - expression "#[NaN] === #[NaN]" - default value true {} - value false { - raise unequalTupleNan - } -} - -tweakable tupleWithNanObjectIsTupleWithNan { - expression "Object.is(#[NaN], #[NaN])" - default value true {} - value false { - raise nanNotIsNan when tupleNaNAreTripleEqual is true - } -} \ No newline at end of file diff --git a/examples/in/test.jspl b/examples/in/test.jspl deleted file mode 100644 index 3638b6c8..00000000 --- a/examples/in/test.jspl +++ /dev/null @@ -1,42 +0,0 @@ -laboratory { - title "Basic Test Laboratory" - description "This is a basic test to try out DSL components" - icon "./res/favicon.svg" - author "Philipp" - format HTML - version "2" -} - -issue concerning { - summary "a != b" - description "We need a to be equal to b." -} - -issue concerning2 { - summary "" - description "" -} - -tweakable first { - expression "a == 0" - default value True { - raise concerning when second is False - } - value False { - raise concerning when second is True - raise concerning2 - } -} - -condition unequal holds when -(first is True and second is False) or (first is False and second is True) - -tweakable second { - expression "b == 0" - value True { - raise concerning when unequal is True - } - default value False { - raise concerning when unequal is True - } -} diff --git a/examples/in/very_simple.jspl b/examples/in/very_simple.jspl deleted file mode 100644 index cc2a1e20..00000000 --- a/examples/in/very_simple.jspl +++ /dev/null @@ -1,24 +0,0 @@ -issue concerning { - summary "a != b" - description "We need a to be equal to b." -} - -tweakable first { - expression "a == 0" - default value True { - raise concerning when second is False - } - value False { - raise concerning when second is True - } -} - -tweakable second { - expression "b == 0" - value True { - raise concerning when first is False - } - default value False { - raise concerning when first is True - } -} \ No newline at end of file diff --git a/lib/language/jspl-format-module.ts b/lib/language/jspl-format-module.ts deleted file mode 100644 index 63f70dff..00000000 --- a/lib/language/jspl-format-module.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { - createDefaultModule, - createDefaultSharedModule, - type DefaultSharedModuleContext, - inject, - type LangiumServices, - type LangiumSharedServices, - type Module, - type PartialLangiumServices, -} from "langium"; - -import { JSPLFormatGeneratedModule, JSPLGeneratedSharedModule } from "./generated/module"; -import { JSPLFormatValidator, registerValidationChecks } from "./jspl-validator"; -import { JSPLValueConverter } from "./jspl-converter"; - -/** - * Declaration of custom services - add your own service classes here. - */ -export type JSPLFormatAddedServices = { - validation: { - JSPLFormatValidator: JSPLFormatValidator; - }; -}; - -/** - * Union of Langium default services and your custom services - use this as constructor parameter - * of custom service classes. - */ -export type JSPLFormatServices = - & LangiumServices - & JSPLFormatAddedServices; - -/** - * Dependency injection module that overrides Langium default services and contributes the - * declared custom services. The Langium defaults can be partially specified to override only - * selected services, while the custom services must be fully specified. - */ -export const JSPLFormatModule: Module< - JSPLFormatServices, - PartialLangiumServices & JSPLFormatAddedServices -> = { - validation: { - JSPLFormatValidator: () => new JSPLFormatValidator(), - }, - parser: { - ValueConverter: () => new JSPLValueConverter(), - }, -}; - -/** - * Create the full set of services required by Langium. - * - * First inject the shared services by merging two modules: - * - Langium default shared services - * - Services generated by langium-cli - * - * Then inject the language-specific services by merging three modules: - * - Langium default language-specific services - * - Services generated by langium-cli - * - Services specified in this file - * - * @param context Optional module context with the LSP connection - * @returns An object wrapping the shared services and the language-specific services - */ -export function createJSPLFormatServices(context: DefaultSharedModuleContext): { - shared: LangiumSharedServices; - JSPLFormat: JSPLFormatServices; -} -{ - const shared = inject( - createDefaultSharedModule(context), - JSPLGeneratedSharedModule, - ); - - const JSPLFormat = inject( - createDefaultModule({ shared }), - JSPLFormatGeneratedModule, - JSPLFormatModule, - ); - - shared.ServiceRegistry.register(JSPLFormat); - registerValidationChecks(JSPLFormat); - - return { shared, JSPLFormat }; -} diff --git a/lib/language/jspl-converter.ts b/lib/language/specalt-converter.ts similarity index 86% rename from lib/language/jspl-converter.ts rename to lib/language/specalt-converter.ts index bf37a911..c5d65fc8 100644 --- a/lib/language/jspl-converter.ts +++ b/lib/language/specalt-converter.ts @@ -1,6 +1,6 @@ import { CstNode, DefaultValueConverter } from "langium"; -export class JSPLValueConverter extends DefaultValueConverter +export class SpecAltValueConverter extends DefaultValueConverter { convert(input: string, cstNode: CstNode) { diff --git a/lib/language/specalt-format-module.ts b/lib/language/specalt-format-module.ts new file mode 100644 index 00000000..488b97e1 --- /dev/null +++ b/lib/language/specalt-format-module.ts @@ -0,0 +1,58 @@ +import { + createDefaultModule, + createDefaultSharedModule, + type DefaultSharedModuleContext, + inject, + type LangiumServices, + type LangiumSharedServices, + type Module, + type PartialLangiumServices, +} from "langium"; + +import { SpecAltFormatGeneratedModule, SpecAltGeneratedSharedModule } from "./generated/module"; +import { registerValidationChecks, SpecAltFormatValidator } from "./specalt-validator"; +import { SpecAltValueConverter } from "./specalt-converter"; + +export type SpecAltFormatAddedServices = { + validation: { + SpecAltFormatValidator: SpecAltFormatValidator; + }; +}; + +export type SpecAltFormatServices = + & LangiumServices + & SpecAltFormatAddedServices; + +export const SpecAltFormatModule: Module< + SpecAltFormatServices, + PartialLangiumServices & SpecAltFormatAddedServices +> = { + validation: { + SpecAltFormatValidator: () => new SpecAltFormatValidator(), + }, + parser: { + ValueConverter: () => new SpecAltValueConverter(), + }, +}; + +export function createSpecAltFormatServices(context: DefaultSharedModuleContext): { + shared: LangiumSharedServices; + SpecAltFormat: SpecAltFormatServices; +} +{ + const shared = inject( + createDefaultSharedModule(context), + SpecAltGeneratedSharedModule, + ); + + const SpecAltFormat = inject( + createDefaultModule({ shared }), + SpecAltFormatGeneratedModule, + SpecAltFormatModule, + ); + + shared.ServiceRegistry.register(SpecAltFormat); + registerValidationChecks(SpecAltFormat); + + return { shared, SpecAltFormat }; +} diff --git a/lib/language/jspl-validator.ts b/lib/language/specalt-validator.ts similarity index 93% rename from lib/language/jspl-validator.ts rename to lib/language/specalt-validator.ts index 6c192562..f2074e82 100644 --- a/lib/language/jspl-validator.ts +++ b/lib/language/specalt-validator.ts @@ -1,14 +1,14 @@ import type { ValidationAcceptor, ValidationChecks } from "langium"; -import { type JSPLFormatServices } from "./jspl-format-module"; +import { type SpecAltFormatServices } from "./specalt-format-module"; import { extractReferenceables, getAllUsedConcerns, getAllUsedReferenceables } from "./utils"; -import { Condition, type JSPLAstType, LaboratoryInformation, Model, Proposition, Statement } from "./generated/ast"; +import { Condition, LaboratoryInformation, Model, Proposition, type SpecAltAstType, Statement } from "./generated/ast"; -export function registerValidationChecks({ validation }: JSPLFormatServices) +export function registerValidationChecks({ validation }: SpecAltFormatServices) { - const { ValidationRegistry: registry, JSPLFormatValidator: validator } = validation; + const { ValidationRegistry: registry, SpecAltFormatValidator: validator } = validation; - const checks: ValidationChecks = { + const checks: ValidationChecks = { Model: [ validator.uniqueConcernIdentifiers, validator.uniqueReferenceableIdentifiers, @@ -32,7 +32,7 @@ export function registerValidationChecks({ validation }: JSPLFormatServices) registry.register(checks, validator); } -export class JSPLFormatValidator +export class SpecAltFormatValidator { uniqueConcernIdentifiers(model: Model, accept: ValidationAcceptor) { diff --git a/lib/language/jspl.langium b/lib/language/specalt.langium similarity index 99% rename from lib/language/jspl.langium rename to lib/language/specalt.langium index 1b0a9dce..052784f1 100644 --- a/lib/language/jspl.langium +++ b/lib/language/specalt.langium @@ -1,4 +1,4 @@ -grammar JSPLFormat +grammar SpecAltFormat entry Model: ( // Optional Header diff --git a/lib/model.ts b/lib/model.ts index fe660047..65ff18db 100644 --- a/lib/model.ts +++ b/lib/model.ts @@ -1,7 +1,7 @@ import { AstNode, EmptyFileSystem, LangiumDocument, LangiumServices, URI } from "langium"; import { type Model } from "./language/generated/ast"; -import { createJSPLFormatServices } from "./language/jspl-format-module"; +import { createSpecAltFormatServices } from "./language/specalt-format-module"; import { Res } from "./utils"; import { err, ok } from "neverthrow"; @@ -11,7 +11,7 @@ export async function extractDocument( services: LangiumServices, ): Promise>> { - const document = services.shared.workspace.LangiumDocumentFactory.fromString(input, URI.file("/tmp/input.jspl")); + const document = services.shared.workspace.LangiumDocumentFactory.fromString(input, URI.file("/tmp/input.spa")); await services.shared.workspace.DocumentBuilder.build([document], { validation: true }); const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1); @@ -44,5 +44,5 @@ export async function extractAstNode(input: string, services: export function extractModel(input: string): Promise> { - return extractAstNode(input, createJSPLFormatServices(EmptyFileSystem).JSPLFormat); + return extractAstNode(input, createSpecAltFormatServices(EmptyFileSystem).SpecAltFormat); } diff --git a/package.json b/package.json index cf8b4b64..4d24e425 100644 --- a/package.json +++ b/package.json @@ -1,15 +1,15 @@ { - "name": "jspl", + "name": "specalt", "description": "The JavaScript Language Proposal Laboratory", "version": "1.0.0", "repository": { "type": "git", - "url": "https://github.com/bldl/jspl" + "url": "https://github.com/bldl/specalt-web" }, "bugs": { - "url": "https://github.com/bldl/jspl/issues" + "url": "https://github.com/bldl/specalt-web/issues" }, - "homepage": "https://github.com/bldl/jspl", + "homepage": "https://github.com/bldl/specalt-web", "scripts": { "dev": "vite", "build": "tsc && vite build", diff --git a/solver/CMakeLists.txt b/solver/CMakeLists.txt index 99b7ca9f..b4826e7f 100644 --- a/solver/CMakeLists.txt +++ b/solver/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.25) -project(jspl-solver LANGUAGES CXX VERSION 1.0.0) +project(spa-solver LANGUAGES CXX VERSION 1.0.0) # -------------------------------------------------------------------------------------------------------- # Create Library diff --git a/solver/include/emitter.hpp b/solver/include/emitter.hpp index 81c5db65..99489e87 100644 --- a/solver/include/emitter.hpp +++ b/solver/include/emitter.hpp @@ -5,7 +5,7 @@ #include #include -namespace jspl +namespace spa { // While the whole parser for expressions here is rather overkill, it would allow to // easily swap out z3 with scip in the future if desired (scip does not work well with wasm though). @@ -31,4 +31,4 @@ namespace jspl public: res emit(node); }; -} // namespace jspl +} // namespace spa diff --git a/solver/include/lexer.hpp b/solver/include/lexer.hpp index ae8ce3fc..666b767f 100644 --- a/solver/include/lexer.hpp +++ b/solver/include/lexer.hpp @@ -5,7 +5,7 @@ #include #include -namespace jspl +namespace spa { enum class token_type : std::uint8_t { @@ -49,4 +49,4 @@ namespace jspl public: res next(); }; -} // namespace jspl +} // namespace spa diff --git a/solver/include/parser.hpp b/solver/include/parser.hpp index 35e58cf9..1303064a 100644 --- a/solver/include/parser.hpp +++ b/solver/include/parser.hpp @@ -3,7 +3,7 @@ #include "lexer.hpp" #include "utils.hpp" -namespace jspl +namespace spa { struct binary; struct unary; @@ -62,4 +62,4 @@ namespace jspl [[nodiscard]] res objective(); [[nodiscard]] res constraint(); }; -} // namespace jspl +} // namespace spa diff --git a/solver/include/utils.hpp b/solver/include/utils.hpp index 2e3b5fa0..56abc643 100644 --- a/solver/include/utils.hpp +++ b/solver/include/utils.hpp @@ -7,7 +7,7 @@ #include #include -namespace jspl +namespace spa { template using res = std ::expected; @@ -22,6 +22,6 @@ namespace jspl template auto bind_ignore(T (C::*)(Ts...), C *, Ts &&...); -} // namespace jspl +} // namespace spa #include "utils.inl" diff --git a/solver/include/utils.inl b/solver/include/utils.inl index bb1df7a6..438796c1 100644 --- a/solver/include/utils.inl +++ b/solver/include/utils.inl @@ -5,7 +5,7 @@ #include #include -namespace jspl +namespace spa { template auto bind_ignore(T (C::*func)(Ts...), C *instance, Ts &&...params) @@ -25,4 +25,4 @@ namespace jspl return std::invoke(std::forward(callable), std::forward(params)...); }; } -} // namespace jspl +} // namespace spa diff --git a/solver/src/emitter.cpp b/solver/src/emitter.cpp index 3c55d3ba..3d1da720 100644 --- a/solver/src/emitter.cpp +++ b/solver/src/emitter.cpp @@ -2,7 +2,7 @@ #include -namespace jspl +namespace spa { emitter::emitter(z3::context &ctx, variables &vars) : m_context(&ctx), m_variables(&vars) {} @@ -94,4 +94,4 @@ namespace jspl { return std::visit([this](auto &&value) { return emit(*value); }, std::move(node)); } -} // namespace jspl +} // namespace spa diff --git a/solver/src/lexer.cpp b/solver/src/lexer.cpp index f15611b8..31812fcb 100644 --- a/solver/src/lexer.cpp +++ b/solver/src/lexer.cpp @@ -3,7 +3,7 @@ #include #include -namespace jspl +namespace spa { static const auto special = std::unordered_set{'+', '-', '<', '>', '='}; @@ -103,4 +103,4 @@ namespace jspl return constant().or_else(bind_ignore(&lexer::literal, this)); } -} // namespace jspl +} // namespace spa diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp index 19c0cf3f..3cdd80ee 100644 --- a/solver/src/parser.cpp +++ b/solver/src/parser.cpp @@ -3,7 +3,7 @@ #include #include -namespace jspl +namespace spa { parser::parser(std::string_view source) : m_lexer(source) { @@ -65,12 +65,12 @@ namespace jspl { if (auto tok = take(token_type::literal); tok) { - return std::make_unique(tok->value); + return std::make_unique(tok->value); } if (auto tok = take(token_type::constant); tok) { - return std::make_unique(tok->value); + return std::make_unique(tok->value); } return err{"Expected primary"}; @@ -92,7 +92,7 @@ namespace jspl return prim; } - return std::make_unique(op->type, std::move(prim.value())); + return std::make_unique(op->type, std::move(prim.value())); } res parser::expr() @@ -122,7 +122,7 @@ namespace jspl return right; } - left = std::make_unique(op->type, std::move(left.value()), std::move(right.value())); + left = std::make_unique(op->type, std::move(left.value()), std::move(right.value())); } return left; @@ -172,6 +172,6 @@ namespace jspl return err{res.error()}; } - return std::make_unique(op->type, std::move(left.value()), std::move(right.value())); + return std::make_unique(op->type, std::move(left.value()), std::move(right.value())); } -} // namespace jspl +} // namespace spa diff --git a/solver/src/solver.cpp b/solver/src/solver.cpp index cd670383..f21386f7 100644 --- a/solver/src/solver.cpp +++ b/solver/src/solver.cpp @@ -26,7 +26,7 @@ struct output output solve(const input &inp) { - using namespace jspl; + using namespace spa; auto ctx = z3::context{}; auto opt = z3::optimize{ctx}; diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index c4b00d94..0e4bb4b2 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -14,7 +14,7 @@ import { LanguageClientConfig } from "monaco-languageclient/lcwrapper"; import { Lab } from "../components/lab"; import { Laboratory, parseLaboratory } from "../parser"; -import exampleCode from "../../examples/in/records_and_tuples.jspl?raw"; +import exampleCode from "../../examples/in/records_and_tuples.spa?raw"; const setLocalStorage = fromThrowable((key: string, value: string) => localStorage.setItem(key, value), e => e); @@ -23,7 +23,7 @@ export default function({ languageConfig }: { languageConfig: LanguageClientConf const [current, setCurrent] = useState(); const save = useDebouncedCallback(setLocalStorage, 1000); - const lastDraft = localStorage.getItem("draft") ?? exampleCode; + const lastDraft = localStorage.getItem("draft") || exampleCode; const change = async (input: string) => { @@ -44,7 +44,7 @@ export default function({ languageConfig }: { languageConfig: LanguageClientConf }} onEditorStartDone={app => { - app?.getEditor()?.setModel(monaco.editor.createModel(lastDraft, "jspl")); + app?.getEditor()?.setModel(monaco.editor.createModel(lastDraft, "specalt")); }} /> Date: Wed, 5 Nov 2025 00:44:34 +0100 Subject: [PATCH 21/36] feat(solver): support parentheses --- solver/include/emitter.hpp | 3 +++ solver/include/lexer.hpp | 2 ++ solver/include/parser.hpp | 1 - solver/src/emitter.cpp | 11 ++++++++--- solver/src/lexer.cpp | 8 ++++++-- solver/src/parser.cpp | 28 ++++++++++++++-------------- solver/src/solver.cpp | 2 +- 7 files changed, 34 insertions(+), 21 deletions(-) diff --git a/solver/include/emitter.hpp b/solver/include/emitter.hpp index 99489e87..95fbcb2b 100644 --- a/solver/include/emitter.hpp +++ b/solver/include/emitter.hpp @@ -11,6 +11,9 @@ namespace spa // easily swap out z3 with scip in the future if desired (scip does not work well with wasm though). // Furthermore, we have the added benefit of allowing more complicated expressions later on. + // NOTE: The z3 optimizer does not like multiplications on boolean constants. + // This should be implemented with multiple constraints instead. + struct emitter { using variables = std::unordered_map; diff --git a/solver/include/lexer.hpp b/solver/include/lexer.hpp index 666b767f..28f3111c 100644 --- a/solver/include/lexer.hpp +++ b/solver/include/lexer.hpp @@ -20,6 +20,8 @@ namespace spa minus, literal, constant, + lparen, + rparen, }; struct token diff --git a/solver/include/parser.hpp b/solver/include/parser.hpp index 1303064a..dd5c815b 100644 --- a/solver/include/parser.hpp +++ b/solver/include/parser.hpp @@ -52,7 +52,6 @@ namespace spa private: [[nodiscard]] res primary(); - [[nodiscard]] res unary(); private: [[nodiscard]] res expr(); diff --git a/solver/src/emitter.cpp b/solver/src/emitter.cpp index 3d1da720..86c35101 100644 --- a/solver/src/emitter.cpp +++ b/solver/src/emitter.cpp @@ -26,10 +26,10 @@ namespace spa { using enum token_type; - case minus: - return left.value() - right.value(); case plus: return left.value() + right.value(); + case minus: + return left.value() - right.value(); case lt: return left.value() < right.value(); case gt: @@ -48,6 +48,10 @@ namespace spa case literal: [[fallthrough]]; case constant: + [[fallthrough]]; + case lparen: + [[fallthrough]]; + case rparen: std::unreachable(); } } @@ -82,7 +86,8 @@ namespace spa return err{std::format("No variable '{}'", node.name)}; } - return z3::ite(var->second, m_context->int_val(1), m_context->int_val(0)); + return var->second; + // return z3::ite(var->second, m_context->int_val(1), m_context->int_val(0)); } res emitter::emit(constant &node) diff --git a/solver/src/lexer.cpp b/solver/src/lexer.cpp index 31812fcb..0e2d6aa1 100644 --- a/solver/src/lexer.cpp +++ b/solver/src/lexer.cpp @@ -83,10 +83,14 @@ namespace spa { using enum token_type; - case '-': - return token{.type = minus, .value = consume(1)}; case '+': return token{.type = plus, .value = consume(1)}; + case '-': + return token{.type = minus, .value = consume(1)}; + case '(': + return token{.type = lparen, .value = consume(1)}; + case ')': + return token{.type = rparen, .value = consume(1)}; case '>': { const auto len = 1 + (peek(1) == '='); return token{.type = len == 2 ? geq : gt, .value = consume(len)}; diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp index 3cdd80ee..5e1bd7df 100644 --- a/solver/src/parser.cpp +++ b/solver/src/parser.cpp @@ -76,31 +76,31 @@ namespace spa return err{"Expected primary"}; } - res parser::unary() + res parser::expr() // NOLINT(*-recursion) { - auto op = take(token_type::minus); + using enum token_type; - if (!op) + if (auto op = take(minus); op) { - return err{op.error()}; + return expr().transform([op](node &&fac) { return std::make_unique(op->type, std::move(fac)); }); } - auto prim = primary(); - - if (!prim) + if (!take(lparen)) { - return prim; + return primary(); } - return std::make_unique(op->type, std::move(prim.value())); - } + auto rtn = term(); - res parser::expr() - { - return unary().or_else(bind_ignore(&parser::primary, this)); + if (auto closing = take(rparen); !closing) + { + return err{closing.error()}; + } + + return rtn; } - res parser::term() + res parser::term() // NOLINT(*-recursion) { using enum token_type; diff --git a/solver/src/solver.cpp b/solver/src/solver.cpp index f21386f7..40f89c5a 100644 --- a/solver/src/solver.cpp +++ b/solver/src/solver.cpp @@ -1,8 +1,8 @@ #include "emitter.hpp" +#include #include #include -#include #include From a240f0212c18d9ae0aba8d901b9be2299d59b8da Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 00:57:20 +0100 Subject: [PATCH 22/36] fix(solver/emitter): revert ite changes --- solver/src/emitter.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solver/src/emitter.cpp b/solver/src/emitter.cpp index 86c35101..cf7701e7 100644 --- a/solver/src/emitter.cpp +++ b/solver/src/emitter.cpp @@ -86,8 +86,7 @@ namespace spa return err{std::format("No variable '{}'", node.name)}; } - return var->second; - // return z3::ite(var->second, m_context->int_val(1), m_context->int_val(0)); + return z3::ite(var->second, m_context->int_val(1), m_context->int_val(0)); } res emitter::emit(constant &node) From 49f1af43e9d7479ab17fe16286ffd841ad9f4f91 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 16:58:16 +0100 Subject: [PATCH 23/36] refactor(lib/language): disallow multiple titles, descriptions, icons and versions on grammar level --- lib/language/specalt-validator.ts | 99 ++++++++----------------------- lib/language/specalt.langium | 7 +-- src/parser/index.ts | 18 ++++-- src/utils/monaco.ts | 4 +- 4 files changed, 44 insertions(+), 84 deletions(-) diff --git a/lib/language/specalt-validator.ts b/lib/language/specalt-validator.ts index f2074e82..98c64afd 100644 --- a/lib/language/specalt-validator.ts +++ b/lib/language/specalt-validator.ts @@ -2,7 +2,7 @@ import type { ValidationAcceptor, ValidationChecks } from "langium"; import { type SpecAltFormatServices } from "./specalt-format-module"; import { extractReferenceables, getAllUsedConcerns, getAllUsedReferenceables } from "./utils"; -import { Condition, LaboratoryInformation, Model, Proposition, type SpecAltAstType, Statement } from "./generated/ast"; +import { Condition, Model, Proposition, type SpecAltAstType, Statement } from "./generated/ast"; export function registerValidationChecks({ validation }: SpecAltFormatServices) { @@ -21,9 +21,6 @@ export function registerValidationChecks({ validation }: SpecAltFormatServices) Condition: [ validator.noRecursionInConditions, ], - LaboratoryInformation: [ - validator.noDuplicateFieldsInLaboratoryInformation, - ], Statement: [ validator.statementReferencesValidValue, ], @@ -54,44 +51,24 @@ export class SpecAltFormatValidator { const reported = new Map(); - // TODO: Remove Code-Duplication here - - for (const cond of model.conditions) + for (const item of [...model.conditions, ...model.propositions]) { - if (!reported.has(cond.name)) + if (!reported.has(item.name)) { - reported.set(cond.name, cond); + reported.set(item.name, item); continue; } - const nodes = [cond, reported.get(cond.name)!]; + const nodes = [item, reported.get(item.name)!]; - nodes.forEach(node => - accept( - "error", - `Condition has non-unique name '${node.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - { node, property: "name" }, - ) - ); - } - - for (const prop of model.propositions) - { - if (!reported.has(prop.name)) + for (const violating of nodes) { - reported.set(prop.name, prop); - continue; - } - - const nodes = [prop, reported.get(prop.name)!]; - - nodes.forEach(node => accept( "error", - `Proposition has non-unique name '${node.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, - { node, property: "name" }, - ) - ); + `${item.$type} has non-unique name '${violating.name}'. All names of Propositions and Conditions must be unique, to be properly referenced.`, + { node: violating, property: "name" }, + ); + } } } @@ -125,8 +102,8 @@ export class SpecAltFormatValidator if (valueClauses.length == 1 && !valueClauses[0].default) { return accept( - "info", - `${valueClauses[0].value} of proposition ${name} is assumed to be default`, + "warning", + `${valueClauses[0].value} of proposition ${name} is implicitly default`, { node: valueClauses[0], property: "default" }, ); } @@ -153,7 +130,7 @@ export class SpecAltFormatValidator { const { name, condition } = node; - const extracted = extractReferenceables.from(condition.expression); + const extracted = extractReferenceables.from!(condition.expression); const hasRecursion = [...extracted].some(ref => ref.name === name); if (!hasRecursion) @@ -164,49 +141,28 @@ export class SpecAltFormatValidator accept("error", `Recursion is not allowed here.`, { node, property: "name" }); } - // TODO: What's the use case of this? Why not make it impossible on grammar level? - noDuplicateFieldsInLaboratoryInformation(information: LaboratoryInformation, accept: ValidationAcceptor) + statementReferencesValidValue(statement: Statement, accept: ValidationAcceptor) { - if (information.descriptions.length > 1) - { - accept("error", "Multiple descriptions for one laboratory are not allowed.", { node: information }); - } - if (information.titles.length > 1) + if (!statement.reference.ref) { - accept("error", "Multiple titles for one laboratory are not allowed.", { node: information }); - } - if (information.icons.length > 1) - { - accept("error", "Multiple icons for one laboratory are not allowed.", { node: information }); - } - if (information.authors.length > 1) - { - accept("error", "Multiple authors for one laboratory are not allowed.", { node: information }); - } - if (information.versions.length > 1) - { - accept("error", "Multiple versions for one laboratory are not allowed.", { node: information }); + return; } - } - - // TODO: Cleanup - statementReferencesValidValue(statement: Statement, accept: ValidationAcceptor): void - { - if (statement === undefined) return; - if (statement.value === undefined) return; - if (statement.reference === undefined) return; - if (statement.reference.ref === undefined) return; const referenceable = statement.reference.ref; const value = statement.value; - if (referenceable.$type === "Condition" && typeof value !== "boolean") - { - return accept("error", "Stated value is not a valid value of the referenced object.", { + const reject = () => + accept("error", "Stated value is not a valid value of the referenced object.", { node: statement, property: "value", }); - } else if (referenceable.$type === "Condition") + + if (referenceable.$type === "Condition" && typeof value !== "boolean") + { + return reject(); + } + + if (referenceable.$type === "Condition") { return; } @@ -218,9 +174,6 @@ export class SpecAltFormatValidator return; } - accept("error", "Stated value is not a valid value of the referenced object.", { - node: statement, - property: "value", - }); + reject(); } } diff --git a/lib/language/specalt.langium b/lib/language/specalt.langium index 052784f1..8d37e03b 100644 --- a/lib/language/specalt.langium +++ b/lib/language/specalt.langium @@ -24,11 +24,10 @@ hidden terminal SL_COMMENT: /\/\/[^\n\r]*/; LaboratoryInformation: "laboratory" "{" ( // allow only one field to be used multiple times via validators - ("title" titles+=STRING) - | ("description" descriptions+=STRING) - | ("icon" icons+=STRING) + ("title" title=STRING) + | ("description" description=STRING) | ("author" authors+=STRING) - | ("version" versions+=STRING) + | ("version" version=STRING) )* "}" ; diff --git a/src/parser/index.ts b/src/parser/index.ts index c9867237..2fd80dd2 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -2,7 +2,7 @@ import { err, ok } from "neverthrow"; import { Res } from "../../lib/utils"; import { extractModel } from "../../lib/model"; -import { Concern, Proposition } from "../../lib/language/generated/ast"; +import { Concern, Model, Proposition } from "../../lib/language/generated/ast"; import { evaluate, Evaluator, lazyEvaluator, State, Value } from "./utils"; @@ -14,8 +14,10 @@ export interface Given export interface Tweakable { + raw: Proposition; + + name: string; expression: string; - disable: Evaluator; value: Evaluator; update: (value: Value) => void; @@ -23,11 +25,14 @@ export interface Tweakable defaultValue: Value; allowedValues: Value[]; + disable: Evaluator; concerns: Evaluator; } export interface Laboratory { + model: Model; + title?: string; authors?: string[]; description?: string; @@ -111,6 +116,8 @@ export async function parseLaboratory(input: string): Promise> const allowedValues = valueClauses.map(item => item.value); tweakables.push({ + raw: tweakable, + name, expression, defaultValue, allowedValues, @@ -128,12 +135,13 @@ export async function parseLaboratory(input: string): Promise> )); return ok({ - title: laboratory?.titles[0], + title: laboratory?.title, authors: laboratory?.authors, - description: laboratory?.descriptions[0], - version: laboratory?.versions[0], + description: laboratory?.description, + version: laboratory?.version, concerns, givens, tweakables, + model: model.value, }); } diff --git a/src/utils/monaco.ts b/src/utils/monaco.ts index 572238ec..c3b8998e 100644 --- a/src/utils/monaco.ts +++ b/src/utils/monaco.ts @@ -1,7 +1,9 @@ import * as vscode from "vscode"; +import { LanguageClientConfig } from "monaco-languageclient/lcwrapper"; import { MonacoVscodeApiConfig } from "monaco-languageclient/vscodeApiWrapper"; import { configureDefaultWorkerFactory } from "monaco-languageclient/workerFactory"; +import { BrowserMessageReader, BrowserMessageWriter } from "vscode-languageserver/browser"; import { type IFileWriteOptions, @@ -12,8 +14,6 @@ import { import workerUrl from "../worker/specalt-server?worker&url"; import langiumConfig from "../../config/langium.json?raw"; import langiumGrammar from "../../syntaxes/specalt-format.tmLanguage.json?raw"; -import { LanguageClientConfig } from "monaco-languageclient/lcwrapper"; -import { BrowserMessageReader, BrowserMessageWriter } from "vscode-languageserver/browser"; const extensionFilesOrContents = new Map( [ From c6faca51f975bb5c0c36d3aead159f4e808b2056 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 17:00:02 +0100 Subject: [PATCH 24/36] feat(lib/language/utils): add `erased` expression, "or"-collapse and raise condition generator --- lib/language/utils.ts | 175 +++++++++++++++++++++++++++++------------- src/parser/utils.ts | 16 ++-- 2 files changed, 129 insertions(+), 62 deletions(-) diff --git a/lib/language/utils.ts b/lib/language/utils.ts index 99c45424..18973f7f 100644 --- a/lib/language/utils.ts +++ b/lib/language/utils.ts @@ -10,25 +10,29 @@ import { Statement, } from "./generated/ast"; -export type LogicalExpressionExtractor = { - fromExpression: (expr: PropositionalExpression, ...state: Ts) => T; - fromOrExpression: (expr: OrExpression, ...state: Ts) => T; - fromAndExpression: (expr: AndExpression, ...state: Ts) => T; - fromNegation: (expr: Negation, ...state: Ts) => T; - fromGroup: (expr: Group, ...state: Ts) => T; - fromStatement: (expr: Statement, ...state: Ts) => T; +export type ErasedKeys = T extends `$${infer K}` ? (K extends "type" ? never : T) : never; +export type NeedsErasure = Extract extends never ? false : true; + +export type ErasedExpression = { + [K in keyof Omit>]: Erased; }; -export const extractReferenceables: LogicalExpressionExtractor]> & { - from: (expr: PropositionalExpression) => Set; -} = { - from: (expression: PropositionalExpression) => - { - const output = new Set(); - extractReferenceables.fromExpression(expression, output); - return output; - }, - fromExpression: (expression: PropositionalExpression, output: Set) => +export type ErasedUnion = T extends any ? ErasedExpression : never; +export type Erased = NeedsErasure extends true ? T | ErasedUnion : T; +export type Expression = Erased; + +export type LogicalExpressionExtractor = { + fromExpression: (expr: Expression, state: S) => T; + fromOrExpression: (expr: Erased, state: S) => T; + fromAndExpression: (expr: Erased, state: S) => T; + fromNegation: (expr: Erased, state: S) => T; + fromGroup: (expr: Erased, state: S) => T; + fromStatement: (expr: Erased, state: S) => T; + from?: (expr: Expression) => S; +}; + +export const extractReferenceables: LogicalExpressionExtractor> = { + fromExpression: (expression: Expression, output: Set) => { if (expression === undefined) { @@ -38,41 +42,36 @@ export const extractReferenceables: LogicalExpressionExtractor) => + fromOrExpression: (expression: Erased, output: Set) => { extractReferenceables.fromExpression(expression.left, output); extractReferenceables.fromExpression(expression.right, output); }, - fromAndExpression: (expression: AndExpression, output: Set) => + fromAndExpression: (expression: Erased, output: Set) => { extractReferenceables.fromExpression(expression.left, output); extractReferenceables.fromExpression(expression.right, output); }, - fromNegation: (expression: Negation, output: Set) => + fromNegation: (expression: Erased, output: Set) => { extractReferenceables.fromExpression(expression.inner, output); }, - fromGroup: (expression: Group, output: Set) => + fromGroup: (expression: Erased, output: Set) => { extractReferenceables.fromExpression(expression.inner, output); }, - fromStatement: (statement: Statement, output: Set) => + fromStatement: (statement: Erased, output: Set) => { const { ref } = statement.reference; @@ -83,55 +82,123 @@ export const extractReferenceables: LogicalExpressionExtractor + { + const output = new Set(); + extractReferenceables.fromExpression(expression, output); + return output; + }, }; export function getAllUsedConcerns(model: Model) { - const result = new Set(); + const result: Concern[] = []; - for (const proposition of model.propositions) + const clauses = model.propositions + .flatMap(prop => prop.valueClauses); + + for (const clause of clauses) { - for (const clause of proposition.valueClauses) - { - // TODO: Can concern be undefined? - clause.raises.map(x => x.concern?.ref) - .filter(x => x !== undefined) - .forEach(item => result.add(item)); - } + result.push(...clause.raises.map(r => r.concern.ref).filter(ref => !!ref)); } - return result; + return new Set(result); } export function getAllUsedReferenceables(model: Model) { - const result = new Set(); + const result: Referenceable[] = []; + + for (const prop of model.propositions) + { + const raised = prop.valueClauses + .flatMap(clause => clause.raises) + .filter(concern => !!concern.condition); + + for (const concern of raised) + { + result.push(...extractReferenceables.from!(concern.condition!.expression)); + } + + if (!prop.disable) + { + continue; + } + + for (const stmt of prop.disable.statements) + { + result.push(...extractReferenceables.from!(stmt.condition.expression)); + } + } + + return new Set(result); +} +export function* getAllRaisedConcerns(model: Model) +{ for (const prop of model.propositions) { for (const clause of prop.valueClauses) { for (const concern of clause.raises) { - if (!concern.condition) - { - continue; - } - - extractReferenceables.from(concern.condition.expression).forEach(item => result.add(item)); + yield { from: prop, clause, raise: concern }; } } + } +} - if (!prop.disable) +export function getAllConditionsForRaises(model: Model) +{ + const rtn = new Map(); + + for (const { from, clause, raise } of getAllRaisedConcerns(model)) + { + const name = raise.concern.ref!.name; + + if (!rtn.has(name)) { - continue; + rtn.set(name, []); } - for (const stmt of prop.disable.statements) + // Pre-Condition to trigger this raise (i.e. this tweakable must have the current value [clause] to raise this concern) + let expr: Expression = { + $type: "Statement", + negation: false, + value: clause.value, + reference: { ref: from }, + }; + + // It is only raused under this specific condition + if (raise.condition) { - extractReferenceables.from(stmt.condition.expression).forEach(item => result.add(item)); + expr = { + $type: "AndExpression", + left: expr, + right: raise.condition.expression, + }; } + + // The condition cannot be raised when the tweakable is disabled + if (from.disable) + { + expr = { + $type: "AndExpression", + left: { + $type: "Negation", + inner: collapse(from.disable.statements.map(item => item.condition.expression)), + }, + right: expr, + }; + } + + rtn.get(name)!.push(expr); } - return result; + return rtn; +} + +export function collapse(expressions: Expression[]) +{ + return expressions.reduce((a, b) => ({ $type: "OrExpression", left: a, right: b })); } diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 27c3c190..0da72677 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -1,4 +1,4 @@ -import { LogicalExpressionExtractor } from "../../lib/language/utils"; +import { Erased, LogicalExpressionExtractor } from "../../lib/language/utils"; import { AndExpression, @@ -23,31 +23,31 @@ export interface State conditions: Map; } -export const lazyEvaluator: LogicalExpressionExtractor = { - fromOrExpression: (expression: OrExpression, state: State) => +export const lazyEvaluator: LogicalExpressionExtractor = { + fromOrExpression: (expression: Erased, state: State) => { const left = lazyEvaluator.fromExpression(expression.left, state); const right = lazyEvaluator.fromExpression(expression.right, state); return () => evaluate(left) || evaluate(right); }, - fromAndExpression: (expression: AndExpression, state: State) => + fromAndExpression: (expression: Erased, state: State) => { const left = lazyEvaluator.fromExpression(expression.left, state); const right = lazyEvaluator.fromExpression(expression.right, state); return () => evaluate(left) && evaluate(right); }, - fromNegation: (expression: Negation, state: State) => + fromNegation: (expression: Erased, state: State) => { const inner = lazyEvaluator.fromExpression(expression, state); return () => !evaluate(inner); }, - fromGroup: (expression: Group, state: State) => + fromGroup: (expression: Erased, state: State) => { return lazyEvaluator.fromExpression(expression.inner, state); }, - fromStatement: (expression: Statement, state: State) => + fromStatement: (expression: Erased, state: State) => { const { name, $type } = expression.reference.ref!; @@ -70,7 +70,7 @@ export const lazyEvaluator: LogicalExpressionExtractor = { return () => get(name) === expression.value; } }, - fromExpression: (expression: PropositionalExpression, state: State) => + fromExpression: (expression: Erased, state: State) => { switch (expression.$type) { From f7f4e512baed260885723e6dc4c69fd93a6c85d3 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 17:02:43 +0100 Subject: [PATCH 25/36] feat(frontend/solver): add initial solver input generation --- src/solver/utils.ts | 180 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 src/solver/utils.ts diff --git a/src/solver/utils.ts b/src/solver/utils.ts new file mode 100644 index 00000000..22eccc50 --- /dev/null +++ b/src/solver/utils.ts @@ -0,0 +1,180 @@ +import { collapse, Expression, getAllConditionsForRaises } from "../../lib/language/utils"; +import { Laboratory } from "../parser"; +import { Value } from "../parser/utils"; + +export interface GeneratedInput +{ + objective: string; + variables: string[]; + constraints: string[]; +} + +interface Mapping +{ + propositions: Map>; // Proposition-Name => [Proposition-Value, Variable-Name] + concerns: Map; // Concern-Name => Variable-Name +} + +interface State +{ + mappings: Mapping; + input: GeneratedInput; + laboratory: Laboratory; +} + +type VarGen = Generator; + +function* variable(prefix: string, input: GeneratedInput): VarGen +{ + let index = 1; // Start at 1 to preserve old variable naming scheme (eases verification) + + while (true) + { + const name = `${prefix}${index++}`; + input.variables.push(name); + yield name; + } +} + +function mapTweakableValues({ input, laboratory, mappings }: State) +{ + const x = variable("x", input); + + for (const tweakable of laboratory.tweakables) + { + const mapping = new Map(); + + for (const value of tweakable.allowedValues) + { + mapping.set(value, x.next().value); + } + + mappings.propositions.set(tweakable.name, mapping); // map all allowed values of tweakable + } +} + +function mapConcerns({ input, laboratory, mappings }: State) +{ + const r = variable("r", input); + + for (const concern of laboratory.concerns.values()) + { + mappings.concerns.set(concern.name, r.next().value); // map concern to variable + } +} + +function mapTweakableConstraints({ input, laboratory, mappings }: State) +{ + for (const tweakable of laboratory.tweakables) + { + const mapped = mappings.propositions.get(tweakable.name)!.values(); + input.constraints.push(`${[...mapped].join("+")} == 1`); // only one value of a tweakable can be set + } +} + +function buildRaiseConstraint(input: GeneratedInput, mappings: Mapping, expr: Expression, zGen: VarGen): string +{ + switch (expr.$type) + { + case "OrExpression": + { + const z = zGen.next().value; + const a = buildRaiseConstraint(input, mappings, expr.left, zGen); + const b = buildRaiseConstraint(input, mappings, expr.right, zGen); + + input.constraints.push(`${z}-${a}-${b} <= 0`); + input.constraints.push(`${a}-${z} <= 0`); + input.constraints.push(`${b}-${z} <= 0`); + + return z; + } + case "AndExpression": + { + const z = zGen.next().value; + const a = buildRaiseConstraint(input, mappings, expr.left, zGen); + const b = buildRaiseConstraint(input, mappings, expr.right, zGen); + + input.constraints.push(`${a}+${b}-${z} <= 1`); + input.constraints.push(`${z}-${a} <= 0`); + input.constraints.push(`${z}-${b} <= 0`); + + return z; + } + case "Negation": + { + const z = zGen.next().value; + const a = buildRaiseConstraint(input, mappings, expr.inner, zGen); + + input.constraints.push(`-${a}-${z} <= -1`); + input.constraints.push(`${a}+${z} <= 1`); + + return z; + } + case "Statement": + { + const ref = expr.reference.ref!; + + return ref.$type === "Proposition" + ? mappings.propositions.get(ref.name)!.get(expr.value)! + : buildRaiseConstraint(input, mappings, ref.condition.expression, zGen); // Just inline conditions + } + case "Group": + return buildRaiseConstraint(input, mappings, expr.inner, zGen); + } +} + +function mapRaiseConstraints({ input, laboratory, mappings }: State) +{ + const raises = getAllConditionsForRaises(laboratory.model); + const z = variable("z", input); + + for (const [name, conditions] of raises.entries()) + { + const expr = collapse(conditions); + + const f = buildRaiseConstraint(input, mappings, expr, z); + const r = mappings.concerns.get(name)!; + + input.constraints.push(`${f}-${r} == 0`); + } +} + +export function makeInput(laboratory: Laboratory) +{ + const input: GeneratedInput = { + variables: [], + constraints: [], + objective: "", + }; + + const mappings: Mapping = { + propositions: new Map(), + concerns: new Map(), + }; + + const state: State = { + input, + laboratory, + mappings, + }; + + mapTweakableValues(state); + mapConcerns(state); + + mapTweakableConstraints(state); + mapRaiseConstraints(state); + + const concerns = laboratory.concerns.keys() + .map(name => mappings.concerns.get(name)!); + + // TODO: Support weights + input.objective = [...concerns].join("+"); + + console.table(mappings.propositions); + console.table(mappings.concerns); + console.log(input); + + console.log(input.constraints.join("\n")); + + return { input, mappings }; +} From 2bece1615b4daf77c66332cbaf7fafc88c050fda Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 17:05:18 +0100 Subject: [PATCH 26/36] refactor(frontend/parser): cleanup --- src/parser/utils.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/parser/utils.ts b/src/parser/utils.ts index 0da72677..24512c64 100644 --- a/src/parser/utils.ts +++ b/src/parser/utils.ts @@ -1,13 +1,5 @@ -import { Erased, LogicalExpressionExtractor } from "../../lib/language/utils"; - -import { - AndExpression, - Group, - Negation, - OrExpression, - PropositionalExpression, - Statement, -} from "../../lib/language/generated/ast"; +import { Erased, Expression, LogicalExpressionExtractor } from "../../lib/language/utils"; +import { AndExpression, Group, Negation, OrExpression, Statement } from "../../lib/language/generated/ast"; export type Value = string | boolean; export type Evaluator = () => T; @@ -70,7 +62,7 @@ export const lazyEvaluator: LogicalExpressionExtractor = { return () => get(name) === expression.value; } }, - fromExpression: (expression: Erased, state: State) => + fromExpression: (expression: Expression, state: State) => { switch (expression.$type) { From ced0b726e9f2edb4334da1716cbff72c90b3fcb3 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 20:21:03 +0100 Subject: [PATCH 27/36] feat(solver): support multiplication --- solver/include/lexer.hpp | 1 + solver/include/parser.hpp | 14 ++++++++++++++ solver/src/emitter.cpp | 2 ++ solver/src/lexer.cpp | 4 +++- solver/src/parser.cpp | 35 ++++++++++++++++++++++++++++++++--- 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/solver/include/lexer.hpp b/solver/include/lexer.hpp index 28f3111c..ee48bd49 100644 --- a/solver/include/lexer.hpp +++ b/solver/include/lexer.hpp @@ -16,6 +16,7 @@ namespace spa leq, geq, neq, + mult, plus, minus, literal, diff --git a/solver/include/parser.hpp b/solver/include/parser.hpp index dd5c815b..9d9cb5bf 100644 --- a/solver/include/parser.hpp +++ b/solver/include/parser.hpp @@ -34,8 +34,21 @@ namespace spa std::string_view value; }; + enum class precedence : std::uint8_t + { + low, + high, + }; + class parser { + template + struct allowed_tokens; + + template + struct next_precedence; + + private: lexer m_lexer; res m_current; @@ -55,6 +68,7 @@ namespace spa private: [[nodiscard]] res expr(); + template [[nodiscard]] res term(); public: diff --git a/solver/src/emitter.cpp b/solver/src/emitter.cpp index cf7701e7..bfbd1066 100644 --- a/solver/src/emitter.cpp +++ b/solver/src/emitter.cpp @@ -26,6 +26,8 @@ namespace spa { using enum token_type; + case mult: + return left.value() * right.value(); case plus: return left.value() + right.value(); case minus: diff --git a/solver/src/lexer.cpp b/solver/src/lexer.cpp index 0e2d6aa1..fb86c638 100644 --- a/solver/src/lexer.cpp +++ b/solver/src/lexer.cpp @@ -5,7 +5,7 @@ namespace spa { - static const auto special = std::unordered_set{'+', '-', '<', '>', '='}; + static const auto special = std::unordered_set{'*', '+', '-', '<', '>', '='}; lexer::lexer(std::string_view source) : m_source(source) {} @@ -83,6 +83,8 @@ namespace spa { using enum token_type; + case '*': + return token{.type = mult, .value = consume(1)}; case '+': return token{.type = plus, .value = consume(1)}; case '-': diff --git a/solver/src/parser.cpp b/solver/src/parser.cpp index 5e1bd7df..e0d13d02 100644 --- a/solver/src/parser.cpp +++ b/solver/src/parser.cpp @@ -100,11 +100,40 @@ namespace spa return rtn; } + template <> + struct parser::allowed_tokens + { + static constexpr auto value = {token_type::minus, token_type::plus}; + }; + + template <> + struct parser::allowed_tokens + { + static constexpr auto value = {token_type::mult}; + }; + + template <> + struct parser::next_precedence + { + static constexpr auto value = &parser::term; + }; + + template <> + struct parser::next_precedence + { + static constexpr auto value = &parser::expr; + }; + + template res parser::term(); + template res parser::term(); + + template res parser::term() // NOLINT(*-recursion) { using enum token_type; - auto left = expr(); + auto next = std::bind_front(next_precedence

::value, this); + auto left = next(); if (!left) { @@ -113,9 +142,9 @@ namespace spa auto op = res{}; - while ((op = take({plus, minus}))) + while ((op = take(allowed_tokens

::value))) { - auto right = expr(); + auto right = next(); if (!right) { From 0216704b664b1bac21731a36ab7d016598c11d12 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 20:21:30 +0100 Subject: [PATCH 28/36] fix(frontend/lab): update switches, group authors --- src/components/lab.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/components/lab.tsx b/src/components/lab.tsx index 1d158cc3..d7c03719 100644 --- a/src/components/lab.tsx +++ b/src/components/lab.tsx @@ -62,7 +62,7 @@ export function Item({ item, notify, ...props }: ItemProps) ) : ( @@ -123,7 +123,9 @@ export function Lab({ laboratory, ...props }: LabProps) return ( {title && {title}} - {authors?.map(author => {author})} + + {authors?.map(author => {author})} + {description && {description}} From 513140eb929ad6f165b3129e3d540a2639e3b5a0 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 20:22:02 +0100 Subject: [PATCH 29/36] fix(frontend/parser): don't raise concerns for disabled tweakables --- src/parser/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/index.ts b/src/parser/index.ts index 2fd80dd2..d5118bde 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -124,7 +124,7 @@ export async function parseLaboratory(input: string): Promise> value: () => state.tweakables.get(name)!, update: val => state.tweakables.set(name, val), disable: () => evalauteDisable(tweakable, state), - concerns: () => evaluateConcerns(tweakable, state), + concerns: () => evalauteDisable(tweakable, state) ? [] : evaluateConcerns(tweakable, state), }); state.tweakables.set(name, defaultValue); From 6b7fcf965c0c8a38d401d9b318b6bfb46512bf10 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:07:50 +0100 Subject: [PATCH 30/36] feat(frontend/solver): support weights --- src/solver/utils.ts | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/solver/utils.ts b/src/solver/utils.ts index 22eccc50..144a9190 100644 --- a/src/solver/utils.ts +++ b/src/solver/utils.ts @@ -139,7 +139,7 @@ function mapRaiseConstraints({ input, laboratory, mappings }: State) } } -export function makeInput(laboratory: Laboratory) +export function makeInput(laboratory: Laboratory, weights: Map) { const input: GeneratedInput = { variables: [], @@ -164,17 +164,22 @@ export function makeInput(laboratory: Laboratory) mapTweakableConstraints(state); mapRaiseConstraints(state); - const concerns = laboratory.concerns.keys() - .map(name => mappings.concerns.get(name)!); + const concerns: string[] = []; - // TODO: Support weights - input.objective = [...concerns].join("+"); + for (const concern of laboratory.concerns.keys()) + { + const weight = weights.get(concern) ?? 1; + const variable = mappings.concerns.get(concern)!; - console.table(mappings.propositions); - console.table(mappings.concerns); - console.log(input); + if (weight <= 0) + { + continue; + } + + concerns.push(weight > 1 ? `(${weight}*${variable})` : variable); + } - console.log(input.constraints.join("\n")); + input.objective = concerns.join("+"); return { input, mappings }; } From 23a926cb958a477d628223e050c3876906b5a256 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:08:19 +0100 Subject: [PATCH 31/36] chore(gitignore): ignore solver in public folder --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3e9d4182..2ec8a070 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ test/ syntaxes/ node_modules/ +public/solver* lib/language/generated From 1eaec4e2e1ffb87ccd4146746cb1724c65a85eeb Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:08:42 +0100 Subject: [PATCH 32/36] feat(frontend): very crude optimizer implementation --- package.json | 2 + pnpm-lock.yaml | 30 ++++++++ src/pages/editor.tsx | 162 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 187 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4d24e425..f3df4d5b 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,14 @@ "@codingame/monaco-vscode-files-service-override": "^22.1.3", "@mantine/core": "^8.3.6", "@mantine/hooks": "^8.3.6", + "@mantine/modals": "^8.3.6", "@tabler/icons-react": "^3.35.0", "@typefox/monaco-editor-react": "^7.2.0", "monaco-languageclient": "^10.2.0", "neverthrow": "^8.2.0", "react": "^19.2.0", "react-dom": "^19.2.0", + "react-inspector": "^9.0.0", "react-markdown": "^10.1.0", "vscode": "npm:@codingame/monaco-vscode-extension-api@^22.1.3", "vscode-languageclient": "^9.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a769c080..8b0cd5e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: '@mantine/hooks': specifier: ^8.3.6 version: 8.3.6(react@19.2.0) + '@mantine/modals': + specifier: ^8.3.6 + version: 8.3.6(@mantine/core@8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mantine/hooks@8.3.6(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tabler/icons-react': specifier: ^3.35.0 version: 3.35.0(react@19.2.0) @@ -41,6 +44,9 @@ importers: react-dom: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) + react-inspector: + specifier: ^9.0.0 + version: 9.0.0(react@19.2.0) react-markdown: specifier: ^10.1.0 version: 10.1.0(@types/react@19.2.2)(react@19.2.0) @@ -835,6 +841,14 @@ packages: peerDependencies: react: ^18.x || ^19.x + '@mantine/modals@8.3.6': + resolution: {integrity: sha512-pQFt32LigGSQAas/Wo6VqrE77HmbTRx8POSDh/r3PfPmoQdQpBN/C8mP2Z88JixIULq47DE49YEbgLG2Dyh1zA==} + peerDependencies: + '@mantine/core': 8.3.6 + '@mantine/hooks': 8.3.6 + react: ^18.x || ^19.x + react-dom: ^18.x || ^19.x + '@rolldown/pluginutils@1.0.0-beta.43': resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} @@ -1426,6 +1440,11 @@ packages: peerDependencies: react: ^19.2.0 + react-inspector@9.0.0: + resolution: {integrity: sha512-w/VJucSeHxlwRa2nfM2k7YhpT1r5EtlDOClSR+L7DyQP91QMdfFEDXDs9bPYN4kzP7umFtom7L0b2GGjph4Kow==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 + react-markdown@10.1.0: resolution: {integrity: sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==} peerDependencies: @@ -2839,6 +2858,13 @@ snapshots: dependencies: react: 19.2.0 + '@mantine/modals@8.3.6(@mantine/core@8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@mantine/hooks@8.3.6(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + dependencies: + '@mantine/core': 8.3.6(@mantine/hooks@8.3.6(react@19.2.0))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@mantine/hooks': 8.3.6(react@19.2.0) + react: 19.2.0 + react-dom: 19.2.0(react@19.2.0) + '@rolldown/pluginutils@1.0.0-beta.43': {} '@rollup/rollup-android-arm-eabi@4.52.5': @@ -3571,6 +3597,10 @@ snapshots: react: 19.2.0 scheduler: 0.27.0 + react-inspector@9.0.0(react@19.2.0): + dependencies: + react: 19.2.0 + react-markdown@10.1.0(@types/react@19.2.2)(react@19.2.0): dependencies: '@types/hast': 3.0.4 diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index 0e4bb4b2..77f46515 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -1,10 +1,10 @@ import * as vscode from "vscode"; import * as monaco from "@codingame/monaco-vscode-editor-api"; -import { useState } from "react"; +import { useMemo, useState } from "react"; import { fromThrowable } from "neverthrow"; -import { Group } from "@mantine/core"; +import { Button, Code, Divider, Group, NumberInput, ScrollArea, Stack, Tabs, Text } from "@mantine/core"; import { useDebouncedCallback } from "@mantine/hooks"; import { MonacoEditorReactComp } from "@typefox/monaco-editor-react"; @@ -15,8 +15,137 @@ import { Lab } from "../components/lab"; import { Laboratory, parseLaboratory } from "../parser"; import exampleCode from "../../examples/in/records_and_tuples.spa?raw"; +import { IconBolt, IconBrain, IconBug, IconScale } from "@tabler/icons-react"; +import { modals } from "@mantine/modals"; +import { makeInput } from "../solver/utils"; +import { ObjectInspector } from "react-inspector"; + +import Solver from "../../solver/wasm/loader"; const setLocalStorage = fromThrowable((key: string, value: string) => localStorage.setItem(key, value), e => e); +const solver = await Solver(); + +function Optimizer({ laboratory, notify }: { laboratory: Laboratory; notify: () => void }) +{ + const [weights, setWeights] = useState( + new Map( + laboratory.concerns.values().map(concern => [concern.name, 1 as number] as const), + ), + ); + + const input = useMemo(() => makeInput(laboratory, weights), [laboratory, weights]); + + const update = (name: string, value: number) => + { + weights.set(name, value); + setWeights(new Map(weights)); + }; + + return ( + + + + }>Weights + }>Debug + + + + + + {weights.entries().map(([name, value]) => ( + + update(name, value as number)} + /> + + {name} + + + ))} + + + + + + + + + {input.input.objective} + + {input.input.constraints.join("\n")} + + + + + + + + + ); +} export default function({ languageConfig }: { languageConfig: LanguageClientConfig }) { @@ -47,11 +176,30 @@ export default function({ languageConfig }: { languageConfig: LanguageClientConf app?.getEditor()?.setModel(monaco.editor.createModel(lastDraft, "specalt")); }} /> - + + + + + + ); } From 41502661593a22c3ed8745d76bdcb8e9320d8a47 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:08:56 +0100 Subject: [PATCH 33/36] feat(frontend): improve layout --- src/main.tsx | 57 +++++++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/src/main.tsx b/src/main.tsx index 331e03e4..e7a4368c 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -8,38 +8,41 @@ import { ActionIcon, AppShell, Group, MantineProvider, Text } from "@mantine/cor import Editor from "./pages/editor.tsx"; import { initMonaco } from "./utils/monaco.ts"; +import { ModalsProvider } from "@mantine/modals"; const languageConfig = await initMonaco(); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( - - - - - - - SpecAlt - - - - The JavaScript Proposal Laboratory - + + + + + + + + SpecAlt + + + - The JavaScript Proposal Laboratory + + + + + + + - - - - - - - - - - - + + + + + + , ); From 6b66d9cfc888da70d78bfeea032ccfb3f4d1c9da Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:13:16 +0100 Subject: [PATCH 34/36] refactor(solver): build into public folder --- solver/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/solver/CMakeLists.txt b/solver/CMakeLists.txt index b4826e7f..0fde9cdc 100644 --- a/solver/CMakeLists.txt +++ b/solver/CMakeLists.txt @@ -17,6 +17,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 23 CXX_EXTENSIONS set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "solver") target_link_options(${PROJECT_NAME} PRIVATE "SHELL:--emit-tsd \"${CMAKE_CURRENT_SOURCE_DIR}/wasm/solver.d.ts\"") +set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../public") # -------------------------------------------------------------------------------------------------------- # Setup Includes From 4efec81d7537265a4bcd3dad39f92e5211d10a23 Mon Sep 17 00:00:00 2001 From: Curve Date: Wed, 5 Nov 2025 21:15:11 +0100 Subject: [PATCH 35/36] refactor(frontend/editor): limit weights to 0 minimum --- src/pages/editor.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index 77f46515..c1495509 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -56,6 +56,7 @@ function Optimizer({ laboratory, notify }: { laboratory: Laboratory; notify: () update(name, value as number)} /> From 66f44f6a26a115605690334e3ff3f3026ac9b95b Mon Sep 17 00:00:00 2001 From: Curve Date: Fri, 7 Nov 2025 17:19:26 +0100 Subject: [PATCH 36/36] chore: cleanup files --- CHANGELOG.md | 86 ------------------------------------------------ README.md | 93 ---------------------------------------------------- 2 files changed, 179 deletions(-) delete mode 100644 CHANGELOG.md delete mode 100644 README.md diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index ccfe98d2..00000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,86 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -## [0.7.4] - 2025-04-21 - -- Updated Optimizer Template to include local version of HTM-Preact instead of loading it through unpkg.com - -## [0.7.3] - 2025-02-28 - -- Allowed for uncapitalised boolean values (true/false and True/False are now all allowed) -- Updated examples to reflect scientific work - -## [0.7.2] - 2025-02-10 - -- Changed `proposition` keyword to `tweakable` -- Changed `concern` keyword to `issue` - -## [0.7.1] - 2025-01-15 - -- Minor fixes to optimizer -- Tried removing some unnecessary files from extension - -## [0.7.0] - 2025-01-15 - -- Added experimental Optimizer webpage. - - Requires to run a local python server running a linear programming solver. A suitable server using the SCIP Solver can be found in the Git repository. (Actually using the solver locally might require the user to disable Cors-checks) - -## [0.6.3] - 2024-04-28 - -- Repository was moved over to GitHub under the Bergen Language Design Laboratory - -- Fixes: - - Fixed issue where single quotes were escaped in JSON-Representation. (This is considered an error in json...) - -## [0.6.2] - 2024-04-25 - -- Fixes: - - Fixed validation error, where all boolean values for referenced conditions were rejected, instead of accepted. - -## [0.6.1] - 2024-04-12 - -- Web Laboratory Fixes: - - Removed unnecessary LICENSE and README from template - - (They might be readded in the future, with the README containing the lab description and the LICENSE using the author name.) - -- JSON Generator Fixes/Improvements: - - Added missing `default` field to values of propositions - - Shortened empty lists to reduce unused space in output - -## [0.6.0] - 2024-04-05 - -- Added Graphviz-Generator to generate graph visualisation -- Added JSON-Generator to generate json format for serialization - -## [0.5.4] - 2024-04-04 - -- Added validator to check, that in every statement made, the referenced object actual can have the given value. -- Fixed some validation errors, caused by accessing fields of possibly undefined objects. - -## [0.5.3] - 2024-04-01 - -- Fixed minor validation errors - -## [0.5.2] - 2024-04-01 - -- Updated the webpage generator, to not use default values, when certain information is not given. Instead the blocks displaying this information are removed from the webpage. These include: `icon`, `author` and `version`. `title` and `description` will still display default values, when not specified. - -## [0.5.0] - 2024-03-29 - -- Updated `laboratory`-field to include the following (sub-)fields: - - `format`: specifies the default format to be used in description texts. - - `author`: specifies the author of the laboratory. - - `version`: specifies the version number of the laboratory. - -## [0.4.0] - 2024-03-25 - -- Added warnings for unused concerns and conditions -- Added `laboratory`-field to the top of documents to specify information for the laboratory. Supported (sub-)fields: - - `title`: Specify a title to be displayed on the top of the laboratory. - - `description`: Specify a description text to be displayed on the top of the laboratory. - - `icon`: Specify an icon for the laboratory (e.g. favicon for browsers). This is a string, that will be copied straight to the html. Therefore this can be a local path to an image or a web-url. -- Added Markdown support: - - `description` fields are now formatted in Markdown by default - - HTML-Formatting can be specified per `description` by putting `HTML` before the string - \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 5fe62ddb..00000000 --- a/README.md +++ /dev/null @@ -1,93 +0,0 @@ -# JavaScript Propositional Laboratory -Provides support for the JavaScript Propositional Laboratory Format (JSPL), a format developed for Ecma-/JS-Developers, to be used for discussing contentious features of proposals. - -Available on the [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=PhilippRiemer.jspl-javascript-propositional-laboratory). - -Official Repository: https://github.com/bldl/jspl - -Based on [Langium](https://langium.org) - -## Getting started - -## Laboratory Information -``` -laboratory { - title "The title of the generated laboratory" - description "This laboratory is for x" - icon "./path/to/favicon.svg or some url" - format MD - author "Test Author" - version "1.0" -} -``` - -## Issues -``` -issue name { - summary "a short summary" - description "a more detailed description of the issue, possibly containing html elements." -} -``` - -## Tweakables -``` -tweakable name { - expression "what Expression to display" - default value True - value False { - raise someIssue when someCondition is True - } - value "some custom value" - disabled { - message "this is disabled, because ..." when someCondition is True and someOtherTweakable is "undefined" - } -} - -tweakable given { - expression "this is given" - value True -} -``` - -## Conditions -``` -condition name holds when someTweakable is "value1" and someOtherCondition is False -``` - -## Markdown support -Multiline strings (laboratory description, issue description) are by default interpreted as markdown. Because markdown is indentation-sensitive, it is important to always indent the descriptions to the level of the original node. This following example of a issue is correctly indented: -``` -issue test { - summary "ISSUE!" - description " - - # This is severe. - - **Very severe!** - - *Or is it?* - - \{ - int i = 0; - i++; - return i; - \} - " -} -``` - -The usage of markdown can be disabled in favour of direct html-interpretation on a general basis by changing the format in the Laboratory Information or on a per-description basis by prefixing a string with "HTML": -``` -issue test { - summary "summary" - description HTML " -

This is my issue

- " -} -``` - -# Optimizer (Experimental) - -**WARNING:** This feature is still experimental and not very user-friendly. - -The VSCode-Extension allows to create an experimental optimizer from the command palette. This optimizer has the original laboratory included, but comes with multiple new "tabs". In the weights tab, penalties can be assigned to the different issues to indicate "how severe" they are. In the optimize tab the optimize button can be clicked to automatically find an optimal selection of the values for every tweakable. This however requires a local python server to be run, that does the actual solving of the problem. Such a server can be found in the git repository in the file "scip-server". Using the optimizer might require you to disable CORS-checks, if the python server is run locally. \ No newline at end of file