pax_global_header00006660000000000000000000000064147241651620014522gustar00rootroot0000000000000052 comment=68b5509fe072894f8550b4b71ae4b3a2aa06b091 nonara-ts-patch-ba6d37a/000077500000000000000000000000001472416516200152125ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.editorconfig000066400000000000000000000412221472416516200176700ustar00rootroot00000000000000root = true [*] indent_style = space indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true max_line_length = 120 ij_visual_guides = 120 ij_wrap_on_typing = false end_of_line = lf [*.md] trim_trailing_whitespace = false [.editorconfig] ij_editorconfig_align_group_field_declarations = false ij_editorconfig_space_after_colon = false ij_editorconfig_space_after_comma = true ij_editorconfig_space_before_colon = false ij_editorconfig_space_before_comma = false ij_editorconfig_spaces_around_assignment_operators = true [{*.js,*.cjs}] tab_width = 2 ij_continuation_indent_size = 2 ij_javascript_align_imports = false ij_javascript_align_multiline_array_initializer_expression = false ij_javascript_align_multiline_binary_operation = false ij_javascript_align_multiline_chained_methods = false ij_javascript_align_multiline_extends_list = false ij_javascript_align_multiline_for = true ij_javascript_align_multiline_parameters = true ij_javascript_align_multiline_parameters_in_calls = false ij_javascript_align_multiline_ternary_operation = false ij_javascript_align_object_properties = 0 ij_javascript_align_union_types = false ij_javascript_align_var_statements = 0 ij_javascript_array_initializer_new_line_after_left_brace = false ij_javascript_array_initializer_right_brace_on_new_line = false ij_javascript_array_initializer_wrap = off ij_javascript_assignment_wrap = off ij_javascript_binary_operation_sign_on_next_line = false ij_javascript_binary_operation_wrap = off ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**/*, @angular/material, @angular/material/typings/** ij_javascript_blank_lines_after_imports = 2 ij_javascript_blank_lines_around_class = 1 ij_javascript_blank_lines_around_field = 0 ij_javascript_blank_lines_around_function = 1 ij_javascript_blank_lines_around_method = 0 ij_javascript_block_brace_style = end_of_line ij_javascript_call_parameters_new_line_after_left_paren = false ij_javascript_call_parameters_right_paren_on_new_line = false ij_javascript_call_parameters_wrap = off ij_javascript_catch_on_new_line = true ij_javascript_chained_call_dot_on_new_line = true ij_javascript_class_brace_style = next_line_if_wrapped ij_javascript_comma_on_new_line = false ij_javascript_do_while_brace_force = never ij_javascript_else_on_new_line = false ij_javascript_enforce_trailing_comma = keep ij_javascript_extends_keyword_wrap = off ij_javascript_extends_list_wrap = off ij_javascript_field_prefix = _ ij_javascript_file_name_style = relaxed ij_javascript_finally_on_new_line = true ij_javascript_for_brace_force = never ij_javascript_for_statement_new_line_after_left_paren = false ij_javascript_for_statement_right_paren_on_new_line = false ij_javascript_for_statement_wrap = off ij_javascript_force_quote_style = false ij_javascript_force_semicolon_style = false ij_javascript_function_expression_brace_style = next_line_if_wrapped ij_javascript_if_brace_force = never ij_javascript_import_merge_members = global ij_javascript_import_prefer_absolute_path = global ij_javascript_import_sort_members = true ij_javascript_import_sort_module_name = false ij_javascript_import_use_node_resolution = true ij_javascript_imports_wrap = normal ij_javascript_indent_case_from_switch = true ij_javascript_indent_chained_calls = true ij_javascript_indent_package_children = 0 ij_javascript_jsx_attribute_value = braces ij_javascript_keep_blank_lines_in_code = 2 ij_javascript_keep_first_column_comment = true ij_javascript_keep_indents_on_empty_lines = false ij_javascript_keep_line_breaks = true ij_javascript_keep_simple_blocks_in_one_line = true ij_javascript_keep_simple_methods_in_one_line = true ij_javascript_line_comment_add_space = true ij_javascript_line_comment_at_first_column = false ij_javascript_method_brace_style = end_of_line ij_javascript_method_call_chain_wrap = off ij_javascript_method_parameters_new_line_after_left_paren = false ij_javascript_method_parameters_right_paren_on_new_line = false ij_javascript_method_parameters_wrap = off ij_javascript_object_literal_wrap = on_every_item ij_javascript_parentheses_expression_new_line_after_left_paren = false ij_javascript_parentheses_expression_right_paren_on_new_line = false ij_javascript_place_assignment_sign_on_next_line = false ij_javascript_prefer_as_type_cast = false ij_javascript_prefer_parameters_wrap = false ij_javascript_reformat_c_style_comments = false ij_javascript_space_after_colon = true ij_javascript_space_after_comma = true ij_javascript_space_after_dots_in_rest_parameter = false ij_javascript_space_after_generator_mult = true ij_javascript_space_after_property_colon = true ij_javascript_space_after_quest = true ij_javascript_space_after_type_colon = true ij_javascript_space_after_unary_not = false ij_javascript_space_before_async_arrow_lparen = true ij_javascript_space_before_catch_keyword = true ij_javascript_space_before_catch_left_brace = true ij_javascript_space_before_catch_parentheses = true ij_javascript_space_before_class_lbrace = true ij_javascript_space_before_class_left_brace = true ij_javascript_space_before_colon = true ij_javascript_space_before_comma = false ij_javascript_space_before_do_left_brace = true ij_javascript_space_before_else_keyword = true ij_javascript_space_before_else_left_brace = true ij_javascript_space_before_finally_keyword = true ij_javascript_space_before_finally_left_brace = true ij_javascript_space_before_for_left_brace = true ij_javascript_space_before_for_parentheses = true ij_javascript_space_before_for_semicolon = false ij_javascript_space_before_function_left_parenth = true ij_javascript_space_before_generator_mult = false ij_javascript_space_before_if_left_brace = true ij_javascript_space_before_if_parentheses = true ij_javascript_space_before_method_call_parentheses = false ij_javascript_space_before_method_left_brace = true ij_javascript_space_before_method_parentheses = false ij_javascript_space_before_property_colon = false ij_javascript_space_before_quest = true ij_javascript_space_before_switch_left_brace = true ij_javascript_space_before_switch_parentheses = true ij_javascript_space_before_try_left_brace = true ij_javascript_space_before_type_colon = false ij_javascript_space_before_unary_not = false ij_javascript_space_before_while_keyword = true ij_javascript_space_before_while_left_brace = true ij_javascript_space_before_while_parentheses = true ij_javascript_spaces_around_additive_operators = true ij_javascript_spaces_around_arrow_function_operator = true ij_javascript_spaces_around_assignment_operators = true ij_javascript_spaces_around_bitwise_operators = true ij_javascript_spaces_around_equality_operators = true ij_javascript_spaces_around_logical_operators = true ij_javascript_spaces_around_multiplicative_operators = true ij_javascript_spaces_around_relational_operators = true ij_javascript_spaces_around_shift_operators = true ij_javascript_spaces_around_unary_operator = false ij_javascript_spaces_within_array_initializer_brackets = true ij_javascript_spaces_within_brackets = false ij_javascript_spaces_within_catch_parentheses = false ij_javascript_spaces_within_for_parentheses = false ij_javascript_spaces_within_if_parentheses = false ij_javascript_spaces_within_imports = true ij_javascript_spaces_within_interpolation_expressions = false ij_javascript_spaces_within_method_call_parentheses = false ij_javascript_spaces_within_method_parentheses = false ij_javascript_spaces_within_object_literal_braces = true ij_javascript_spaces_within_object_type_braces = true ij_javascript_spaces_within_parentheses = false ij_javascript_spaces_within_switch_parentheses = false ij_javascript_spaces_within_type_assertion = false ij_javascript_spaces_within_union_types = true ij_javascript_spaces_within_while_parentheses = false ij_javascript_special_else_if_treatment = true ij_javascript_ternary_operation_signs_on_next_line = false ij_javascript_ternary_operation_wrap = off ij_javascript_union_types_wrap = on_every_item ij_javascript_use_chained_calls_group_indents = false ij_javascript_use_double_quotes = true ij_javascript_use_path_mapping = always ij_javascript_use_public_modifier = false ij_javascript_use_semicolon_after_statement = true ij_javascript_var_declaration_wrap = normal ij_javascript_while_brace_force = never ij_javascript_while_on_new_line = false ij_javascript_wrap_comments = false [{*.zsh,*.bash,*.sh}] ij_shell_binary_ops_start_line = false ij_shell_keep_column_alignment_padding = false ij_shell_minify_program = false ij_shell_redirect_followed_by_space = false ij_shell_switch_cases_indented = false [{.babelrc,.prettierrc,.stylelintrc,.eslintrc,jest.config,*.json,*.jsb3,*.jsb2,*.bowerrc}] ij_json_keep_blank_lines_in_code = 2 ij_json_keep_indents_on_empty_lines = false ij_json_keep_line_breaks = true ij_json_space_after_colon = true ij_json_space_after_comma = true ij_json_space_before_colon = true ij_json_space_before_comma = false ij_json_spaces_within_braces = true ij_json_spaces_within_brackets = true ij_json_wrap_long_lines = false [{*.ats,*.ts,*.tsx}] tab_width = 2 ij_continuation_indent_size = 2 ij_typescript_align_imports = false ij_typescript_align_multiline_array_initializer_expression = false ij_typescript_align_multiline_binary_operation = false ij_typescript_align_multiline_chained_methods = false ij_typescript_align_multiline_extends_list = false ij_typescript_align_multiline_for = true ij_typescript_align_multiline_parameters = true ij_typescript_align_multiline_parameters_in_calls = false ij_typescript_align_multiline_ternary_operation = false ij_typescript_align_object_properties = 0 ij_typescript_align_union_types = false ij_typescript_align_var_statements = 0 ij_typescript_array_initializer_new_line_after_left_brace = false ij_typescript_array_initializer_right_brace_on_new_line = false ij_typescript_array_initializer_wrap = off ij_typescript_assignment_wrap = off ij_typescript_binary_operation_sign_on_next_line = false ij_typescript_binary_operation_wrap = off ij_typescript_blacklist_imports = rxjs/Rx, node_modules/**/*, @angular/material, @angular/material/typings/** ij_typescript_blank_lines_after_imports = 2 ij_typescript_blank_lines_around_class = 1 ij_typescript_blank_lines_around_field = 0 ij_typescript_blank_lines_around_field_in_interface = 0 ij_typescript_blank_lines_around_function = 0 ij_typescript_blank_lines_around_method = 0 ij_typescript_blank_lines_around_method_in_interface = 0 ij_typescript_block_brace_style = end_of_line ij_typescript_call_parameters_new_line_after_left_paren = false ij_typescript_call_parameters_right_paren_on_new_line = false ij_typescript_call_parameters_wrap = off ij_typescript_catch_on_new_line = true ij_typescript_chained_call_dot_on_new_line = true ij_typescript_class_brace_style = next_line_if_wrapped ij_typescript_comma_on_new_line = false ij_typescript_do_while_brace_force = never ij_typescript_else_on_new_line = false ij_typescript_enforce_trailing_comma = keep ij_typescript_extends_keyword_wrap = off ij_typescript_extends_list_wrap = off ij_typescript_field_prefix = _ ij_typescript_file_name_style = relaxed ij_typescript_finally_on_new_line = true ij_typescript_for_brace_force = never ij_typescript_for_statement_new_line_after_left_paren = false ij_typescript_for_statement_right_paren_on_new_line = false ij_typescript_for_statement_wrap = off ij_typescript_force_quote_style = true ij_typescript_force_semicolon_style = false ij_typescript_function_expression_brace_style = next_line_if_wrapped ij_typescript_if_brace_force = never ij_typescript_import_merge_members = global ij_typescript_import_prefer_absolute_path = global ij_typescript_import_sort_members = true ij_typescript_import_sort_module_name = false ij_typescript_import_use_node_resolution = true ij_typescript_imports_wrap = normal ij_typescript_indent_case_from_switch = true ij_typescript_indent_chained_calls = true ij_typescript_indent_package_children = 0 ij_typescript_jsdoc_include_types = false ij_typescript_jsx_attribute_value = braces ij_typescript_keep_blank_lines_in_code = 2 ij_typescript_keep_first_column_comment = true ij_typescript_keep_indents_on_empty_lines = false ij_typescript_keep_line_breaks = true ij_typescript_keep_simple_blocks_in_one_line = true ij_typescript_keep_simple_methods_in_one_line = true ij_typescript_line_comment_add_space = true ij_typescript_line_comment_at_first_column = false ij_typescript_method_brace_style = next_line_if_wrapped ij_typescript_method_call_chain_wrap = off ij_typescript_method_parameters_new_line_after_left_paren = false ij_typescript_method_parameters_right_paren_on_new_line = false ij_typescript_method_parameters_wrap = off ij_typescript_object_literal_wrap = on_every_item ij_typescript_parentheses_expression_new_line_after_left_paren = false ij_typescript_parentheses_expression_right_paren_on_new_line = false ij_typescript_place_assignment_sign_on_next_line = false ij_typescript_prefer_as_type_cast = false ij_typescript_prefer_parameters_wrap = false ij_typescript_reformat_c_style_comments = false ij_typescript_space_after_colon = true ij_typescript_space_after_comma = true ij_typescript_space_after_dots_in_rest_parameter = false ij_typescript_space_after_generator_mult = true ij_typescript_space_after_property_colon = true ij_typescript_space_after_quest = true ij_typescript_space_after_type_colon = true ij_typescript_space_after_unary_not = false ij_typescript_space_before_async_arrow_lparen = true ij_typescript_space_before_catch_keyword = true ij_typescript_space_before_catch_left_brace = true ij_typescript_space_before_catch_parentheses = true ij_typescript_space_before_class_lbrace = true ij_typescript_space_before_class_left_brace = true ij_typescript_space_before_colon = true ij_typescript_space_before_comma = false ij_typescript_space_before_do_left_brace = true ij_typescript_space_before_else_keyword = true ij_typescript_space_before_else_left_brace = true ij_typescript_space_before_finally_keyword = true ij_typescript_space_before_finally_left_brace = true ij_typescript_space_before_for_left_brace = true ij_typescript_space_before_for_parentheses = true ij_typescript_space_before_for_semicolon = false ij_typescript_space_before_function_left_parenth = true ij_typescript_space_before_generator_mult = false ij_typescript_space_before_if_left_brace = true ij_typescript_space_before_if_parentheses = true ij_typescript_space_before_method_call_parentheses = false ij_typescript_space_before_method_left_brace = true ij_typescript_space_before_method_parentheses = false ij_typescript_space_before_property_colon = false ij_typescript_space_before_quest = true ij_typescript_space_before_switch_left_brace = true ij_typescript_space_before_switch_parentheses = true ij_typescript_space_before_try_left_brace = true ij_typescript_space_before_type_colon = false ij_typescript_space_before_unary_not = false ij_typescript_space_before_while_keyword = true ij_typescript_space_before_while_left_brace = true ij_typescript_space_before_while_parentheses = true ij_typescript_spaces_around_additive_operators = true ij_typescript_spaces_around_arrow_function_operator = true ij_typescript_spaces_around_assignment_operators = true ij_typescript_spaces_around_bitwise_operators = true ij_typescript_spaces_around_equality_operators = true ij_typescript_spaces_around_logical_operators = true ij_typescript_spaces_around_multiplicative_operators = true ij_typescript_spaces_around_relational_operators = true ij_typescript_spaces_around_shift_operators = true ij_typescript_spaces_around_unary_operator = false ij_typescript_spaces_within_array_initializer_brackets = true ij_typescript_spaces_within_brackets = false ij_typescript_spaces_within_catch_parentheses = false ij_typescript_spaces_within_for_parentheses = false ij_typescript_spaces_within_if_parentheses = false ij_typescript_spaces_within_imports = true ij_typescript_spaces_within_interpolation_expressions = false ij_typescript_spaces_within_method_call_parentheses = false ij_typescript_spaces_within_method_parentheses = false ij_typescript_spaces_within_object_literal_braces = true ij_typescript_spaces_within_object_type_braces = true ij_typescript_spaces_within_parentheses = false ij_typescript_spaces_within_switch_parentheses = false ij_typescript_spaces_within_type_assertion = false ij_typescript_spaces_within_union_types = true ij_typescript_spaces_within_while_parentheses = false ij_typescript_special_else_if_treatment = true ij_typescript_ternary_operation_signs_on_next_line = false ij_typescript_ternary_operation_wrap = off ij_typescript_union_types_wrap = on_every_item ij_typescript_use_chained_calls_group_indents = false ij_typescript_use_double_quotes = false ij_typescript_use_path_mapping = always ij_typescript_use_public_modifier = false ij_typescript_use_semicolon_after_statement = true ij_typescript_var_declaration_wrap = normal ij_typescript_while_brace_force = never ij_typescript_while_on_new_line = false ij_typescript_wrap_comments = false nonara-ts-patch-ba6d37a/.gitattributes000066400000000000000000000000531472416516200201030ustar00rootroot00000000000000# Set end of line to LF * text=auto eol=lf nonara-ts-patch-ba6d37a/.github/000077500000000000000000000000001472416516200165525ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.github/FUNDING.yml000066400000000000000000000000211472416516200203600ustar00rootroot00000000000000github: [nonara] nonara-ts-patch-ba6d37a/.github/workflows/000077500000000000000000000000001472416516200206075ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.github/workflows/build.yml000066400000000000000000000020601472416516200224270ustar00rootroot00000000000000name: Build on: pull_request: push: branches: - master - v3-beta - next jobs: build: runs-on: ubuntu-latest strategy: matrix: # NOTE - 21+ is failing due to odd bug - maybe bug in node - see https://github.com/nonara/ts-patch/issues/153 node-version: [ 18.x, 20.x ] steps: - name: Checkout uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - name: Cache dependencies uses: actions/cache@v2 with: path: | ~/.cache/yarn node_modules key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} restore-keys: | ${{ runner.os }}-yarn- - name: Install Packages run: yarn install --frozen-lockfile - name: Build run: yarn build - name: Test run: yarn run test && yarn run perf env: CI: true FORCE_COLOR: 1 nonara-ts-patch-ba6d37a/.github/workflows/publish.yml000066400000000000000000000017751472416516200230120ustar00rootroot00000000000000name: Publish on: workflow_dispatch: push: tags: - v*.*.* jobs: publish: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - name: Setup Node.js 19.x to publish to npmjs.org uses: actions/setup-node@v1 with: node-version: '20.x' registry-url: 'https://registry.npmjs.org' - name: Install Packages run: yarn install --frozen-lockfile - name: Build run: yarn build - name: Test run: yarn run test env: CI: true FORCE_COLOR: 1 - name: Generate Release Body run: npx extract-changelog-release > RELEASE_BODY.md - name: Publish to NPM run: yarn publish dist --non-interactive env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} - name: Create GitHub Release uses: ncipollo/release-action@v1 with: bodyFile: "RELEASE_BODY.md" token: ${{ secrets.GITHUB_TOKEN }} nonara-ts-patch-ba6d37a/.gitignore000066400000000000000000000023131472416516200172010ustar00rootroot00000000000000# Yarn **/yarn.lock !/yarn.lock # Built *.d.ts *.js.map generator.stats.json .nyc_output dist coverage package-lock.json *.tsbuildinfo generated/ # Extensions *.seed *.log *.csv *.dat *.out *.pid *.gz # Personal .env .vscode .idea/jsLibraryMappings.xml todo/ TODO.ts # Junk temp/ .DS_Store tmp node_modules ### JetBrains ### # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 # User-specific stuff .idea/**/workspace.xml .idea/**/tasks.xml .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf # Generated files .idea/**/contentModel.xml # Sensitive or high-churn files .idea/**/dataSources/ .idea/**/dataSources.ids .idea/**/dataSources.local.xml .idea/**/sqlDataSources.xml .idea/**/dynamic.xml .idea/**/uiDesigner.xml .idea/**/dbnavigator.xml # Gradle .idea/**/gradle.xml .idea/**/libraries # Mongo Explorer plugin .idea/**/mongoSettings.xml # File-based project format *.iws # JIRA plugin atlassian-ide-plugin.xml # Cursive Clojure plugin .idea/replstate.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties fabric.properties # Editor-based Rest Client .idea/httpRequests nonara-ts-patch-ba6d37a/.idea/000077500000000000000000000000001472416516200161725ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.idea/.gitignore000066400000000000000000000000461472416516200201620ustar00rootroot00000000000000# Default ignored files /workspace.xmlnonara-ts-patch-ba6d37a/.idea/codeStyles/000077500000000000000000000000001472416516200203105ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.idea/codeStyles/Project.xml000066400000000000000000000022421472416516200224400ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/codeStyles/codeStyleConfig.xml000066400000000000000000000002251472416516200241120ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/compiler.xml000066400000000000000000000002571472416516200205320ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/inspectionProfiles/000077500000000000000000000000001472416516200220515ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/.idea/inspectionProfiles/Project_Default.xml000066400000000000000000000143271472416516200256540ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/jsonSchemas.xml000066400000000000000000000016051472416516200211730ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/misc.xml000066400000000000000000000004641472416516200176530ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/modules.xml000066400000000000000000000004141472416516200203630ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/ts-patch.iml000066400000000000000000000021251472416516200204200ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/vcs.xml000066400000000000000000000007741472416516200175170ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.idea/webResources.xml000066400000000000000000000006721472416516200213710ustar00rootroot00000000000000 nonara-ts-patch-ba6d37a/.npmignore000066400000000000000000000000161472416516200172060ustar00rootroot00000000000000*.tsbuildinfo nonara-ts-patch-ba6d37a/CHANGELOG.md000066400000000000000000000275651472416516200170420ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. ## [3.3.0](https://github.com/nonara/ts-patch/compare/v3.2.1...v3.3.0) (2024-12-04) ### Features * Add support for ts 5.7+ (closes [#174](https://github.com/nonara/ts-patch/issues/174)) ([396766c](https://github.com/nonara/ts-patch/commit/396766c2e1dbe767a99c2cd277470d3731e87623)) ### [3.2.1](https://github.com/nonara/ts-patch/compare/v3.2.0...v3.2.1) (2024-06-26) ### Bug Fixes * Added TS 5.5.2 support ([31eb80f](https://github.com/nonara/ts-patch/commit/31eb80f1dcca45d15917e4b6621769f80e57ebe1)) ## [3.2.0](https://github.com/nonara/ts-patch/compare/v3.1.2...v3.2.0) (2024-06-03) ### Features * Added support for TS 5.5 ([2c4954d](https://github.com/nonara/ts-patch/commit/2c4954d91def5f0654804bfbf64704720f605840)) ### [3.1.2](https://github.com/nonara/ts-patch/compare/v3.1.1...v3.1.2) (2024-01-10) ### Bug Fixes * don't break if other plugin is added ([f2b591e](https://github.com/nonara/ts-patch/commit/f2b591e1a78636d009af048689f2ae1c0bb89bea)) ### [3.1.1](https://github.com/nonara/ts-patch/compare/v3.1.0...v3.1.1) (2023-12-06) ### Bug Fixes * parseAllJsDoc breaking with < ts 5.3 ([d21e02e](https://github.com/nonara/ts-patch/commit/d21e02ef6401f04301972f8f107799b8c287275b)) ## [3.1.0](https://github.com/nonara/ts-patch/compare/v3.0.2...v3.1.0) (2023-12-05) ### Features * Added Plugin Package Configuration + parseAllJsDoc (closes [#134](https://github.com/nonara/ts-patch/issues/134) closes [#133](https://github.com/nonara/ts-patch/issues/133)) ([15570d0](https://github.com/nonara/ts-patch/commit/15570d05e422dd02635eb3c63dc6b3a036cb543a)) * Added support for chaining transformers in single factory (closes [#122](https://github.com/nonara/ts-patch/issues/122) closes [#120](https://github.com/nonara/ts-patch/issues/120)) ([aabf389](https://github.com/nonara/ts-patch/commit/aabf3894a610047fade6d2d9fb9949f17afe09df)) ### Bug Fixes * TsExtras 'ts' type registering as 'any' (fixes [#127](https://github.com/nonara/ts-patch/issues/127)) ([069411e](https://github.com/nonara/ts-patch/commit/069411e49819aa87c880c7c5ff2ab04ecb68eea3)) * tsp.currentLibrary was not set (detail) ([24d8031](https://github.com/nonara/ts-patch/commit/24d8031bafcd6483fa762ed9ad8437c4a4070093)) ### [3.0.2](https://github.com/nonara/ts-patch/compare/v3.0.1...v3.0.2) (2023-07-20) ### Bug Fixes * Plugins returning TransformerBasePlugin not supported (fixes [#113](https://github.com/nonara/ts-patch/issues/113)) ([12ee3a2](https://github.com/nonara/ts-patch/commit/12ee3a23b9afebb6a42c046b33f257a2bde2467c)) ### [3.0.1](https://github.com/nonara/ts-patch/compare/v3.0.0...v3.0.1) (2023-06-22) ### Bug Fixes * Added explicit error if ts is patched and cached backup is removed ([ac25743](https://github.com/nonara/ts-patch/commit/ac25743140f8f3954aceb8c0e43a731eeeab03a1)) * ESM temp files not cleaned up ([8802054](https://github.com/nonara/ts-patch/commit/8802054481a9f2b4847001cb227db029e0475a72)) * Lock file deletion check ([#102](https://github.com/nonara/ts-patch/issues/102)) ([cacf908](https://github.com/nonara/ts-patch/commit/cacf9084fd4e5a2a1263103f8dc52d2dd7062402)) ## [3.0.0](https://github.com/nonara/ts-patch/compare/v2.1.0...v3.0.0) (2023-06-13) ### ⚠ BREAKING CHANGES * Rewrote for new major v3 (see detail) ([cd69c1c](https://github.com/nonara/ts-patch/commit/cd69c1c02b2e4674731178def7d217d5699bde25)), closes [#58](https://github.com/nonara/ts-patch/issues/58) [#75](https://github.com/nonara/ts-patch/issues/75) [#83](https://github.com/nonara/ts-patch/issues/83) [#93](https://github.com/nonara/ts-patch/issues/93) [#85](https://github.com/nonara/ts-patch/issues/85) ### Features * Added Live Compiler (on-the-fly, in-memory patching), which allows ttypescript migration * Added experimental ES Module support (closes #58) * Added mutex locks (closes #75) * Updated to support TS v5+ (closes #83 closes #93) * Added caching ### Bug Fixes * Fixed patching for non-standard libraries (cannot guarantee they will work as expected in IDEs) (closes #85) ## [2.1.0](https://github.com/nonara/ts-patch/compare/v2.0.2...v2.1.0) (2022-12-08) ### Features * Updated to support TS 4.9 ([26f6099](https://github.com/nonara/ts-patch/commit/26f6099543d258a2a430f8344b482aba85ac9b0e)) ### [2.0.2](https://github.com/nonara/ts-patch/compare/v2.0.1...v2.0.2) (2022-08-10) ### Changes * Upgraded dependencies ([a878131](https://github.com/nonara/ts-patch/commit/a87813190eb31b918574509e4dfe4ef3b427b212)) ### [2.0.1](https://github.com/nonara/ts-patch/compare/v1.4.5...v2.0.1) (2021-11-01) ### Bug Fixes * Corrected path error in previous release ([7c56d56](https://github.com/nonara/ts-patch/commit/7c56d56b5165affb9c58a3c65c2753391f3e967a)) ## [2.0.0](https://github.com/nonara/ts-patch/compare/v1.4.5...v2.0.0) (2021-11-01) ### Summary This is not the planned rewrite, but the codebase was in desperate need of an update. The patch build system with rollup was failing with newer versions and was hacky under the best of circumstances, anyway. This new version has a proper custom build system that produces a much leaner patch. Additionally, I reorganized the codebase, improved tests, and dropped old TS support. _Note: If you absolutely need it, it will still work with older TS. Simply fork and remove the version check_ ### Changes - Soft deprecated `--basedir` (use `--dir`) - Zero bundled dependencies in patch (much lighter) - ⚠️ Hard deprecated `--persist` option (use `package.json` -> `prepare` script) - ⚠️ Requires TS >= 4.0 _(⚠️ denotes potential "breaking" change)_ ### Development Changes - Removed rollup and created light-weight custom build system - Cleaned up file structure - Improved test speed & methodology - Changed patch detection signature ### [1.4.5](https://github.com/nonara/ts-patch/compare/v1.4.4...v1.4.5) (2021-10-25) ### Bug Fixes * compilation fails if basedir resolves to cwd ([#65](https://github.com/nonara/ts-patch/issues/65)) ([9bac698](https://github.com/nonara/ts-patch/commit/9bac698993cd287de6d62caba48205bf53b4e52e)) ### [1.4.4](https://github.com/nonara/ts-patch/compare/v1.4.3...v1.4.4) (2021-08-27) ### Bug Fixes * `--basedir` flag fails if dir is not a subdir of a package ([5912288](https://github.com/nonara/ts-patch/commit/5912288f36f98a1722252d150a456c139e3f8382)) ### [1.4.3](https://github.com/nonara/ts-patch/compare/v1.4.2...v1.4.3) (2021-08-23) ### Bug Fixes * Relative transform paths do not resolve from project root dir with compiler API (fixes [#59](https://github.com/nonara/ts-patch/issues/59)) ([e38655a](https://github.com/nonara/ts-patch/commit/e38655ac20f3905e61bcf8bfc03b97a5386b76f8)) * ts 3.6.5 does not patch properly (fixes [#55](https://github.com/nonara/ts-patch/issues/55)) ([1babac9](https://github.com/nonara/ts-patch/commit/1babac9284d330983a9658794680a5058e7c64c0)) ### [1.4.2](https://github.com/nonara/ts-patch/compare/v1.4.1...v1.4.2) (2021-08-01) ### Bug Fixes * Patch fails on ts v3.1 - 3.5 (fixes [#54](https://github.com/nonara/ts-patch/issues/54)) ([0fabe3c](https://github.com/nonara/ts-patch/commit/0fabe3c85129357a6ad453e48739dd1759efe18d)) ### [1.4.1](https://github.com/nonara/ts-patch/compare/v1.4.0...v1.4.1) (2021-07-13) ### Bug Fixes * Only patch 'tsc.js' and 'typescript.js' by default (closes [#52](https://github.com/nonara/ts-patch/issues/52)) ([4d029f6](https://github.com/nonara/ts-patch/commit/4d029f666abdf5e2862c773eeba97eeddbb80089)) ## [1.4.0](https://github.com/nonara/ts-patch/compare/v1.3.4...v1.4.0) (2021-07-13) ### Features * Add tsserver.js to supported libraries ([08262ed](https://github.com/nonara/ts-patch/commit/08262ede07c6e69b178751013988da772661ef02)) ### Bug Fixes * Require ts-node installation to be handled by user (fixes [#51](https://github.com/nonara/ts-patch/issues/51)) ([979338c](https://github.com/nonara/ts-patch/commit/979338ca5f0642b233de46dd6d293daa7f552ac4)) ### [1.3.4](https://github.com/nonara/ts-patch/compare/v1.3.3...v1.3.4) (2021-06-30) ### Bug Fixes * Install adds ts-node to deps instead of devDeps (fixes [#38](https://github.com/nonara/ts-patch/issues/38)) ([a2d586b](https://github.com/nonara/ts-patch/commit/a2d586b286a4af0650faf69d3163115442aec8ab)) ### [1.3.3](https://github.com/nonara/ts-patch/compare/v1.3.2...v1.3.3) (2021-04-23) ### Bug Fixes * **patch:** Patched emit does not pass all arguments (fixes [#36](https://github.com/nonara/ts-patch/issues/36)) ([9b130bc](https://github.com/nonara/ts-patch/commit/9b130bc8fd1a5bf3e7b33f796990ed7383aa5449)) ### [1.3.2](https://github.com/nonara/ts-patch/compare/v1.3.1...v1.3.2) (2021-01-31) ## [1.3.1] (11-25-2020) ### Fixed - Fixed #21 (Could not specify `--basedir` with dir name other than `typescript` - affected yarn aliasing) ## [1.3.0] (07-26-2020) ### Added - Added ability to specify tsconfig.json file for transformer (`tsConfig` option) Note: This opens up the door to specify compilerOptions, which can be useful - Added path mapping support (requires [tsconfig-paths](https://npmjs.com/tsconfig-paths)) ## [1.2.2] (05-23-2020) ### Fixed - Possible recursion issue with program transformer - In some older TS versions, tsc wasn't passing diagnostics array - Various CLI bugs ### Added - Added 'library' to TspExtras - install and patch actions now will proceed to run if already patched but current version is out-dated ### Code - Substantial re-design of certain parts (see release commit message for more) ## [1.2.0] (05-20-2020) ### Changed: `beforeEmit` -> `tranformProgram` The mechanism of action for `Program` transformation has been moved from inside `program.emit()` to `ts.createProgram()`. In the new methodology, the `Program` instance is transformed at the point of creation _before_ it is returned from the factory function, which is a far better approach. While the option name has been updated to reflect the new behaviour, the old `beforeEmit` can still function as an alias to the new behaviour, so this is not a breaking change. ### Added: Inspect or alter diagnostics Using the `program` type entry point, the `extras` field has been revised. | property | status | description | | -------- | ------ | ----------- | | diagnostics | _new_ | Reference to `Diagnostic[]` created during `ts.emitFilesAndReportErrors()` (works with tsc also) | addDiagnostic | _changed_ | Directly add `Diagnostic` to `diagnostics` array | | removeDiagnostic | _new_ | Directly remove `Diagnostic` from `diagnostics` array (uses splice, for safe removal) See `README.md` for full detail. ## [1.1.0] (05-08-2020) ### Added - Added `beforeEmit` option, which allows 'transforming' `Program` instance before `program.emit()` is called. ## [1.0] (2019 - 2020) ### Fixed - Updated for Node v14 _(Addresses [#7](https://github.com/nonara/ts-patch/issues/8), [shelljs/shelljs#991](https://github.com/shelljs/shelljs/issues/991))_ - Adjusted ts-node compilerOptions to ES2018 _(Fixes [#7](https://github.com/nonara/ts-patch/issues/7))_ - Exposed & fixed `addDiagnostic` helper _(Fixes [#6](https://github.com/nonara/ts-patch/issues/6))_ - Rolled `resolve` package into patch _(Fixes [#5](https://github.com/nonara/ts-patch/issues/5))_ - Converted EOL to LF (MacOS support) _(Fixes [#3](https://github.com/nonara/ts-patch/issues/3) [#4](https://github.com/nonara/ts-patch/issues/4))_ - Edge cases occurred in which TypeScript based transformers using CommonJS were not being interpretted properly. _(Should address [issue #1](https://github.com/nonara/ts-patch/issues/1))_ [1.3.1]: https://github.com/nonara/ts-patch/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/nonara/ts-patch/compare/v1.2.2...v1.3.0 [1.2.2]: https://github.com/nonara/ts-patch/compare/v1.1.0...v1.2.2 [1.2.0]: https://github.com/nonara/ts-patch/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/nonara/ts-patch/compare/v1.0.10...v1.1.0 [1.0]: https://github.com/nonara/ts-patch/releases/tag/v1.0.0...v1.0.10 nonara-ts-patch-ba6d37a/LICENSE.md000066400000000000000000000020451472416516200166170ustar00rootroot00000000000000Copyright 2021 Ron Spickenagel 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. nonara-ts-patch-ba6d37a/README.md000066400000000000000000000333511472416516200164760ustar00rootroot00000000000000[![npm version](https://badge.fury.io/js/ts-patch.svg)](https://badge.fury.io/js/ts-patch) [![NPM Downloads](https://img.shields.io/npm/dm/ts-patch.svg?style=flat)](https://npmjs.org/package/ts-patch) ![Build Status](https://github.com/nonara/ts-patch/workflows/Build/badge.svg) # ts-patch Patch typescript to allow custom transformers (plugins) during build. Plugins are specified in `tsconfig.json`, or provided programmatically in `CompilerOptions`. _Migrating from ttypescript is easy! See: [Method 1: Live Compiler](#method-1-live-compiler)_ ## Features * Patch typescript installation via on-the-fly, in-memory patching _or_ as a persistent patch * Can patch individual libraries (see `ts-patch /?`) * Hook build process by transforming the `Program` (see: [Transforming Program](#transforming-program)) * Add, remove, or modify diagnostics (see: [Altering Diagnostics](#altering-diagnostics)) * Fully compatible with legacy [ttypescript](https://github.com/cevek/ttypescript) projects * **(new)** Experimental support for ES Module based transformers # Table of Contents * [ts-patch](#ts-patch) * [Features](#features) * [Table of Contents](#table-of-contents) * [Installation](#installation) * [Usage](#usage) * [Method 1: Live Compiler](#method-1-live-compiler) * [Method 2: Persistent Patch](#method-2-persistent-patch) * [Configuration](#configuration) * [Plugin Options](#plugin-options) * [Writing Transformers](#writing-transformers) * [Source Transformers](#source-transformers) * [Source Transformer Entry Point](#source-transformer-entry-point) * [Source Transformer Example](#source-transformer-example) * [Altering Diagnostics](#altering-diagnostics) * [Note](#note) * [Program Transformers](#program-transformers) * [Program Transformer Entry Point](#program-transformer-entry-point) * [Configuring Program Transformers](#configuring-program-transformers) * [Program Transformer Example](#program-transformer-example) * [Plugin Package Configuration](#plugin-package-configuration) * [Example](#example) * [Resources](#resources) * [Recommended Reading](#recommended-reading) * [Recommended Tools](#recommended-tools) * [Discussion](#discussion) * [Advanced Options](#advanced-options) * [Maintainers](#maintainers) * [Help Wanted](#help-wanted) * [License](#license) # Installation 1. Install package ```sh add -D ts-patch ``` # Usage ## Method 1: Live Compiler The live compiler patches on-the-fly, each time it is run. **Via commandline:** Simply use `tspc` (instead of `tsc`) **With tools such as ts-node, webpack, ts-jest, etc:** specify the compiler as `ts-patch/compiler` ## Method 2: Persistent Patch Persistent patch modifies the typescript installation within the node_modules path. It requires additional configuration to remain persisted, but it carries less load time and complexity compared to the live compiler. 1. Install the patch ```shell # For advanced options, see: ts-patch /? ts-patch install ``` 2. Add `prepare` script (keeps patch persisted after npm install) `package.json` ```jsonc { /* ... */ "scripts": { "prepare": "ts-patch install -s" } } ``` # Configuration **tsconfig.json**: Add transformers to `compilerOptions` in `plugins` array. **Examples** ```jsonc { "compilerOptions": { "plugins": [ // Source Transformers { "transform": "transformer-module" }, { "transform": "transformer2", "extraOption": 123 }, { "transform": "trans-with-mapping", "resolvePathAliases": true }, { "transform": "esm-transformer", "isEsm": true }, // Program Transformer { "transform": "transformer-module5", "transformProgram": true } ] } } ``` ## Plugin Options | Option | Type | Description | |--------------------|---------|:--------------------------------------------------------------------------------------------------------------| | **transform** | string | Module name or path to transformer _(*.ts or *.js)_ | | after | boolean | Apply transformer after stock TS transformers | | afterDeclarations | boolean | Apply transformer to declaration (*.d.ts) files | | transformProgram | boolean | Transform `Program` during `ts.createProgram()` _(see: [Program Transformers](#program-transformers))_ | | isEsm | boolean | Transformer is ES Module (_note: experimental_ — requires [esm](https://www.npmjs.com/package/esm)) | | resolvePathAliases | boolean | Resolve path aliases in transformer (requires [tsconfig-paths](https://www.npmjs.com/package/tsconfig-paths)) | | type | string | See: [Source Transformer Entry Point](#source-transformer-entry-point) (default: 'program') | | import | string | Name of exported transformer function _(defaults to `default` export)_ | | tsConfig | string | tsconfig.json file _for transformer_ (allows specifying compileOptions, path mapping support, etc) | | _..._ | | Provide your own custom options, which will be passed to the transformer | _Note: Required options are bold_ # Writing Transformers For an overview of the typescript compiler (such as what a `SourceFile` and `Program` is) see: [Typescript Compiler Notes](https://github.com/microsoft/TypeScript-Compiler-Notes). ## Source Transformers Source Transformers will transform the AST of SourceFiles during compilation, allowing you to alter the output of the JS or declarations files. ### Source Transformer Entry Point ```ts (program: ts.Program, config: PluginConfig, extras: TransformerExtras) => ts.TransformerFactory ``` **PluginConfig**: [Type Declaration](https://github.com/nonara/ts-patch/blob/master/projects/core/shared/plugin-types.ts) **TransformerExtras**: [Type Declaration](https://github.com/nonara/ts-patch/blob/master/projects/core/shared/plugin-types.ts) **ts.TransformerFactory**: `(context: ts.TransformationContext) => (sourceFile: ts.SourceFile) => ts.SourceFile` _Note: Additional [legacy signatures](https://github.com/cevek/ttypescript#pluginconfigtype) are supported, but it is not recommended to develop a new transformer using them._ ### Source Transformer Example Transformers can be written in JS or TS. ```ts import type * as ts from 'typescript'; import type { TransformerExtras, PluginConfig } from 'ts-patch'; /** Changes string literal 'before' to 'after' */ export default function (program: ts.Program, pluginConfig: PluginConfig, { ts: tsInstance }: TransformerExtras) { return (ctx: ts.TransformationContext) => { const { factory } = ctx; return (sourceFile: ts.SourceFile) => { function visit(node: ts.Node): ts.Node { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } ``` **Live Examples**: [`{ transform: "typescript-transform-paths" }`](https://github.com/LeDDGroup/typescript-transform-paths) [`{ transform: "typescript-is/lib/transform-inline/transformer" }`](https://github.com/woutervh-/typescript-is) [`{ transform: "typia/lib/transform" }`](https://github.com/samchon/typia) ([💻playground](https://typia.io/playground)) [`{ transform: "@nestia/core/lib/transform" }`](https://github.com/samchon/nestia) ### Altering Diagnostics Diagnostics can be altered in a Source Transformer. To alter diagnostics you can use the following, provided from the `TransformerExtras` parameter: | property | description | |--------------------|-----------------------------------------------------| | diagnostics | Reference to `Diagnostic` array | | addDiagnostic() | Safely add `Diagnostic` to `diagnostics` array | | removeDiagnostic() | Safely remove `Diagnostic` from `diagnostics` array | ### Note _This alters diagnostics during _emit only_. If you want to alter diagnostics in your IDE as well, you'll need to create a LanguageService plugin to accompany your source transformer_ ## Program Transformers Sometimes you want to do more than just transform source code. For example you may want to: - TypeCheck code after it's been transformed - Generate code and add it to the program - Add or remove emit files during transformation For this, we've introduced what we call a Program Transformer. The transform action takes place during `ts.createProgram`, and allows re-creating the `Program` instance that typescript uses. ### Program Transformer Entry Point ```ts (program: ts.Program, host: ts.CompilerHost | undefined, options: PluginConfig, extras: ProgramTransformerExtras) => ts.Program ``` **ProgramTransformerExtras** >>> [Type Declaration](https://github.com/nonara/ts-patch/blob/master/projects/core/shared/plugin-types.ts) ### Configuring Program Transformers To configure a Program Transformer, supply `"transformProgram": true` in the config transformer entry. _Note: The `before`, `after`, and `afterDeclarations` options do not apply to a Program Transformer and will be ignored_ [See Config Example](#configuration) ### Program Transformer Example ```TypeScript /** * Add a file to Program */ import * as path from 'path'; import type * as ts from 'typescript'; import type { ProgramTransformerExtras, PluginConfig } from 'ts-patch'; export const newFile = path.resolve(__dirname, 'added-file.ts'); export default function ( program: ts.Program, host: ts.CompilerHost | undefined, options: PluginConfig, { ts: tsInstance }: ProgramTransformerExtras ) { return tsInstance.createProgram( /* rootNames */ program.getRootFileNames().concat([ newFile ]), program.getCompilerOptions(), host, /* oldProgram */ program ); } ``` **Note:** For a more complete example, see [Transforming Program with additional AST transformations](https://github.com/nonara/ts-patch/discussions/29#discussioncomment-325979) **Live Examples**: [`{ transform: "@typescript-virtual-barrel/compiler-plugin", transformProgram: true }`](https://github.com/zaguiini/typescript-virtual-barrel) [`{ transform: "ts-overrides-plugin", transformProgram: true }`](https://github.com/DiFuks/ts-overrides-plugin) ## Plugin Package Configuration The plugin package configuration allows you to specify custom options for your TypeScript plugin. This configuration is defined in the `package.json` of your plugin under the `tsp` property. An example use case is enabling `parseAllJsDoc` if you require full JSDoc parsing in tsc for your transformer in TS v5.3+. (see: [5.3 JSDoc parsing changes](https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/#optimizations-by-skipping-jsdoc-parsing)) For all available options, see the `PluginPackageConfig` type in [plugin-types.ts](https://github.com/nonara/ts-patch/blob/master/projects/core/shared/plugin-types.ts) ### Example ```jsonc { "name": "your-plugin-name", "version": "1.0.0", "tsp": { "tscOptions": { "parseAllJsDoc": true } } } ``` ## Resources ### Recommended Reading - How-To: [Advice for working with the TS Compiler API](https://github.com/nonara/ts-patch/discussions/31) - How-To: [TypeScript Transformer Handbook](https://github.com/madou/typescript-transformer-handbook) - Article: [How to Write a TypeScript Transform (Plugin)](https://dev.doctorevidence.com/how-to-write-a-typescript-transform-plugin-fc5308fdd943) - Article: [Creating a TypeScript Transformer](https://43081j.com/2018/08/creating-a-typescript-transform?source=post_page-----731e2b0b66e6----------------------) ### Recommended Tools | Tool | Type | Description | |----------------------------------------------------------------------|-------------|---------------------------------------------------------------------------------------------| | [TS AST Viewer](https://ts-ast-viewer.com/) | Web App | Allows you to see the `Node` structure and other TS properties of your source code. | | [ts-expose-internals](https://github.com/nonara/ts-expose-internals) | NPM Package | Exposes internal types and methods of the TS compiler API | ### Discussion - `#compiler-internals-and-api` on [TypeScript Discord Server](https://discord.com/invite/typescript) - TSP [Discussions](https://github.com/nonara/ts-patch/discussions) Board # Advanced Options **(env) `TSP_SKIP_CACHE`** Skips patch cache when patching via cli or live compiler. **(env) `TSP_COMPILER_TS_PATH`** Specify typescript library path to use for `ts-patch/compiler` (defaults to `require.resolve('typescript')`) **(env) `TSP_CACHE_DIR`** Override patch cache directory **(cli) `ts-patch clear-cache`** Cleans patch cache & lockfiles # Maintainers

Ron S.
## Help Wanted If you're interested in helping and are knowledgeable with the TS compiler codebase, feel free to reach out! # License This project is licensed under the MIT License, as described in `LICENSE.md` nonara-ts-patch-ba6d37a/jest.config.ts000066400000000000000000000014741472416516200200010ustar00rootroot00000000000000import type { Config } from '@jest/types'; import * as os from 'os'; const config: Config.InitialOptions = { testEnvironment: "node", preset: 'ts-jest', roots: [ '/test/tests' ], testRegex: '.*(test|spec)\\.tsx?$', moduleFileExtensions: [ 'ts', 'tsx', 'js', 'jsx', 'json', 'node' ], transform: { '^.+\\.(ts|tsx)$': ['ts-jest', { tsconfig: './test/tsconfig.json' }], }, modulePaths: [ "/node_modules" ], // coveragePathIgnorePatterns: [ // 'src/installer/lib/system/errors.ts$' // ], globalSetup: '/test/src/prepare.ts', globalTeardown: '/test/src/cleanup.ts', testTimeout: 10000, transformIgnorePatterns: [ '/node_modules/(?!(ts-transformer-keys|ts-transformer-enumerate|ts-nameof)/)' ], maxConcurrency: os.cpus().length } export default config; nonara-ts-patch-ba6d37a/package.json000066400000000000000000000073441472416516200175100ustar00rootroot00000000000000{ "name": "ts-patch", "version": "3.3.0", "description": "Patch typescript to support custom transformers in tsconfig.json", "main": "./dist/index.js", "types": "./dist/index.d.ts", "scripts": { "compile": "yarn run compile:core && yarn run compile:patch", "build": "yarn run clean && yarn run compile:patch && yarn run compile:core", "compile:core": "tsc -p projects/core", "compile:patch": "tsc -p projects/patch", "------------ ": "-------------", "clean": "npx -y rimraf -g dist coverage *.tsbuildinfo test/.tmp", "clean:global": "yarn run clean && npx -y rimraf -g ./**/node_modules ./**/yarn.lock", "reset": "yarn run clean:global && yarn install && yarn build", "------------ ": "-------------", "test": "jest", "perf": "cd test && yarn run perf", "------------": "-------------", "prepare": "ts-patch install -s && yarn prepare:test", "prepare:test": "cd test && yarn install", "postbuild": "node scripts/postbuild.js" }, "private": true, "keywords": [ "typescript", "transform", "transformer", "plugin", "config", "ast" ], "author": { "name": "Ron S.", "url": "http://twitter.com/ron" }, "license": "MIT", "repository": { "type": "git", "url": "git+ssh://git@github.com/nonara/ts-patch.git" }, "bugs": { "url": "https://github.com/nonara/ts-patch/issues" }, "homepage": "https://github.com/nonara/ts-patch#readme", "dependencies": { "chalk": "^4.1.2", "global-prefix": "^4.0.0", "minimist": "^1.2.8", "resolve": "^1.22.2", "semver": "^7.6.3", "strip-ansi": "^6.0.1" }, "bin": { "ts-patch": "./dist/bin/ts-patch.js", "tspc": "./dist/bin/tspc.js" }, "devDependencies": { "@types/esm": "^3.2.2", "@types/jest": "^29.5.10", "@types/minimist": "^1.2.2", "@types/mock-fs": "^4.13.1", "@types/node": "^16.11.5", "@types/resolve": "^1.20.1", "@types/semver": "^7.3.13", "@types/shelljs": "^0.8.9", "esm": "^3.2.25", "jest": "^29.7.0", "rimraf": "^5.0.7", "shelljs": "^0.8.5", "standard-version": "^9.5.0", "ts-jest": "^29.1.1", "ts-node": "^10.9.1", "ts-patch": "^3.2.1", "tsconfig-paths": "^4.2.0", "typescript": "5.5.2", "ts-next": "npm:typescript@beta", "ts-expose-internals": "npm:ts-expose-internals@5.4.5" }, "workspaces": { "packages": [ "projects/path", "projects/core" ], "nohoist": [ "jest", "ts-jest", "typescript" ] }, "directories": { "resources": "./dist/resources" }, "standard-version": { "types": [ { "type": "feat", "section": "Features" }, { "type": "feature", "section": "Features" }, { "type": "fix", "section": "Bug Fixes" }, { "type": "perf", "section": "Performance Improvements" }, { "type": "revert", "section": "Reverts" }, { "type": "docs", "section": "Documentation", "hidden": true }, { "type": "style", "section": "Styles", "hidden": true }, { "type": "chore", "section": "Miscellaneous Chores", "hidden": true }, { "type": "refactor", "section": "Code Refactoring", "hidden": true }, { "type": "test", "section": "Tests", "hidden": true }, { "type": "build", "section": "Build System", "hidden": true }, { "type": "ci", "section": "Continuous Integration", "hidden": true }, { "type": "change", "section": "Changes" } ] } } nonara-ts-patch-ba6d37a/projects/000077500000000000000000000000001472416516200170435ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/000077500000000000000000000000001472416516200177735ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/plugin.ts000066400000000000000000000026751472416516200216530ustar00rootroot00000000000000import type * as ts from 'typescript'; import * as path from 'path'; type TS = typeof ts; /* ****************************************************************************************************************** * * Program Transformer - Merge rootDirs * ****************************************************************************************************************** */ export default function transformProgram( program: ts.Program, host: ts.CompilerHost, opt: any, { ts }: { ts: TS } ) { host ??= ts.createCompilerHost(program.getCompilerOptions(), true); const rootDirs = program.getCompilerOptions().rootDirs ?? []; hookWriteRootDirsFilenames(); return ts.createProgram(program.getRootFileNames(), program.getCompilerOptions(), host, program); function hookWriteRootDirsFilenames() { // TODO - tsei const sourceDir = (program).getCommonSourceDirectory(); const outputDir = program.getCompilerOptions().outDir!; const originalWriteFile = host.writeFile; host.writeFile = (fileName: string, data: string, ...args: any[]) => { let srcPath = path.resolve(sourceDir, path.relative(outputDir, fileName)); for (const dir of rootDirs) { const relPath = path.relative(dir, srcPath); // TODO - tsei if (relPath.slice(0, 2) !== '..') fileName = (ts).normalizePath(path.resolve(outputDir, relPath)); } return (originalWriteFile)(fileName, data, ...args); } } } nonara-ts-patch-ba6d37a/projects/core/resolver-hook.js000066400000000000000000000034721472416516200231360ustar00rootroot00000000000000const path = require('path'); const Module = require('module'); /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ /** * Enable rootDirs merge support for require (used with ts-node) */ function hookRequire() { if (rootDirs.length > 0) { const originalRequire = Module.prototype.require; Module.prototype.require = function (request) { if (!path.isAbsolute(request) && request.startsWith('.')) { const moduleDir = path.dirname(this.filename); const moduleRootDir = rootDirs.find(rootDir => moduleDir.startsWith(rootDir)); if (moduleRootDir) { const moduleRelativeFromRoot = path.relative(moduleRootDir, moduleDir); if (moduleRootDir) { for (const rootDir of rootDirs) { const possiblePath = path.join(rootDir, moduleRelativeFromRoot, request); let resolvedPath; try { resolvedPath = require.resolve(possiblePath); } catch (e) { continue; } return originalRequire.call(this, resolvedPath); } } } } return originalRequire.call(this, request); }; } } // endregion /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const tsConfig = require(path.join(__dirname, 'tsconfig.json')); const rootDirs = tsConfig.compilerOptions.rootDirs.map(rootDir => path.join(__dirname, rootDir)); hookRequire(); nonara-ts-patch-ba6d37a/projects/core/shared/000077500000000000000000000000001472416516200212415ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/shared/plugin-types.ts000066400000000000000000000112071472416516200242520ustar00rootroot00000000000000/** * NOTE: This file is used during the build process for patch as well */ // Note: Leave as import-star, since we don't ship built file with esModuleInterop import type * as ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Plugin /* ****************************************************************************************************************** */ export interface PluginConfig { [x:string]: any /** * Language Server TypeScript Plugin name */ name?: string; /** * Path to transformer or transformer module name */ transform?: string; /** * Resolve Path Aliases? */ resolvePathAliases?: boolean; /** * tsconfig.json file (for transformer) */ tsConfig?: string; /** * The optional name of the exported transform plugin in the transform module. */ import?: string; /** * Is the transformer an ES Module */ isEsm?: boolean /** * Plugin entry point format type, default is program */ type?: 'ls' | 'program' | 'config' | 'checker' | 'raw' | 'compilerOptions'; /** * Apply transformer after internal TypeScript transformers */ after?: boolean; /** * Apply transformer on d.ts files */ afterDeclarations?: boolean; /** * Transform *Program* instance (alters during createProgram()) (`type`, `after`, & `afterDeclarations` settings will * not apply) Entry point must be (program: Program, host?: CompilerHost) => Program */ transformProgram?: boolean; } export type TransformerList = Required; export type TransformerPlugin = TransformerBasePlugin | TsTransformerFactory; export type TsTransformerFactory = ts.TransformerFactory export type PluginFactory = LSPattern | ProgramPattern | ConfigPattern | CompilerOptionsPattern | TypeCheckerPattern | RawPattern; export interface TransformerBasePlugin { before?: ts.TransformerFactory | ts.TransformerFactory[]; after?: ts.TransformerFactory | ts.TransformerFactory[]; afterDeclarations?: ts.TransformerFactory | ts.TransformerFactory[]; } // endregion /* ****************************************************************************************************************** */ // region: Extras /* ****************************************************************************************************************** */ export type DiagnosticMap = WeakMap; export type TransformerExtras = { /** * Originating TypeScript instance */ ts: typeof ts; /** * TypeScript library file event was triggered in (ie. 'tsserverlibrary' or 'typescript') */ library: string addDiagnostic: (diag: ts.Diagnostic) => number, removeDiagnostic: (index: number) => void, diagnostics: readonly ts.Diagnostic[], } export type ProgramTransformerExtras = { /** * Originating TypeScript instance */ ts: typeof ts; } // endregion /* ****************************************************************************************************************** */ // region: Signatures /* ****************************************************************************************************************** */ export type ProgramTransformer = ( program: ts.Program, host: ts.CompilerHost | undefined, config: PluginConfig, extras: ProgramTransformerExtras ) => ts.Program; export type LSPattern = (ls: ts.LanguageService, config: {}) => TransformerPlugin; export type CompilerOptionsPattern = (compilerOpts: ts.CompilerOptions, config: {}) => TransformerPlugin; export type ConfigPattern = (config: {}) => TransformerPlugin; export type TypeCheckerPattern = (checker: ts.TypeChecker, config: {}) => TransformerPlugin; export type ProgramPattern = ( program: ts.Program, config: {}, extras: TransformerExtras ) => TransformerPlugin; export type RawPattern = ( context: ts.TransformationContext, program: ts.Program, config: {} ) => ts.Transformer; // endregion /* ****************************************************************************************************************** */ // region: Plugin Package /* ****************************************************************************************************************** */ export interface PluginPackageConfig { tscOptions?: { /** * Sets the JSDocParsingMode to ParseAll * * @see https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/#optimizations-by-skipping-jsdoc-parsing * @default false */ parseAllJsDoc?: boolean; } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/000077500000000000000000000000001472416516200205625ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/actions/000077500000000000000000000000001472416516200222225ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/actions/check.ts000066400000000000000000000050471472416516200236550ustar00rootroot00000000000000import { LogLevel, PatchError } from '../system'; import chalk from 'chalk'; import { getTsPackage } from '../ts-package'; import { PatchDetail } from "../patch/patch-detail"; import { getTsModule } from "../module"; import { getInstallerOptions, InstallerOptions } from "../options"; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ interface CheckResult { [moduleName: string]: PatchDetail | undefined; } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Check if files can be patched */ export function check(moduleName?: string | string[], opts?: Partial): CheckResult export function check(moduleNames?: string[], opts?: Partial): CheckResult export function check(moduleNameOrNames?: string | string[], opts?: Partial): CheckResult { let targetModuleNames = moduleNameOrNames ? [ moduleNameOrNames ].flat() : undefined; const options = getInstallerOptions(opts); const { logger: log, dir } = options; /* Load Package */ const tsPackage = getTsPackage(dir); const { packageDir, version } = tsPackage; targetModuleNames ??= tsPackage.moduleNames; /* Check Modules */ log(`Checking TypeScript ${chalk.blueBright(`v${version}`)} installation in ${chalk.blueBright(packageDir)}\r\n`); let res: CheckResult = {}; for (const moduleName of targetModuleNames) { /* Validate */ if (!tsPackage.moduleNames.includes(moduleName)) throw new PatchError(`${moduleName} is not a valid TypeScript module in ${packageDir}`); /* Report */ const tsModule = getTsModule(tsPackage, moduleName, { skipCache: options.skipCache }); const { patchDetail } = tsModule.moduleFile; if (patchDetail !== undefined) { const { isOutdated } = patchDetail; log([ '+', `${chalk.blueBright(moduleName)} is patched with ts-patch version ` + `${chalk[isOutdated ? 'redBright' : 'blueBright'](patchDetail.tspVersion)} ${isOutdated ? '(out of date)' : ''}` ]); } else log([ '-', `${chalk.blueBright(moduleName)} is not patched.` ]); res[moduleName] = patchDetail; log('', LogLevel.verbose); } return res; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/actions/index.ts000066400000000000000000000002001472416516200236710ustar00rootroot00000000000000export * from './patch' export * from './unpatch' export * from './check' export * from './install' export * from './uninstall' nonara-ts-patch-ba6d37a/projects/core/src/actions/install.ts000066400000000000000000000013351472416516200242420ustar00rootroot00000000000000import chalk from 'chalk'; import { getInstallerOptions, InstallerOptions, patch } from '..'; import { defaultInstallLibraries } from '../config'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Patch TypeScript modules */ export function install(opts?: Partial) { const options = getInstallerOptions(opts); const { logger: log } = options; const ret = patch(defaultInstallLibraries, options); if (ret) log([ '+', chalk.green(`ts-patch installed!`) ]); return ret; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/actions/patch.ts000066400000000000000000000067271472416516200237050ustar00rootroot00000000000000import { LogLevel, PatchError, TspError, } from '../system'; import { getTsPackage } from '../ts-package'; import chalk from 'chalk'; import { getModuleFile, getTsModule, ModuleFile } from '../module'; import path from 'path'; import { getInstallerOptions, InstallerOptions } from '../options'; import { writeFileWithLock } from '../utils'; import { getPatchedSource } from '../patch/get-patched-source'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Patch a TypeScript module */ export function patch(moduleName: string, opts?: Partial): boolean export function patch(moduleNames: string[], opts?: Partial): boolean export function patch(moduleNameOrNames: string | string[], opts?: Partial): boolean { const targetModuleNames = [ moduleNameOrNames ].flat(); if (!targetModuleNames.length) throw new PatchError(`Must provide at least one module name to patch`); const options = getInstallerOptions(opts); const { logger: log, dir, skipCache } = options; /* Load Package */ const tsPackage = getTsPackage(dir); /* Get modules to patch and patch info */ const moduleFiles: [ string, ModuleFile ][] = targetModuleNames.map(m => [ m, getModuleFile(tsPackage.getModulePath(m)) ]); /* Determine files not already patched or outdated */ const patchableFiles = moduleFiles.filter(entry => { const [ moduleName, moduleFile ] = entry; if (!moduleFile.patchDetail || moduleFile.patchDetail.isOutdated) return true; else { log([ '!', `${chalk.blueBright(moduleName)} is already patched with the latest version. For details, run: ` + chalk.bgBlackBright('ts-patch check') ]); return false; } }); if (!patchableFiles.length) return true; /* Patch modules */ const failedModulePaths: string[] = []; for (let entry of patchableFiles) { /* Load Module */ const { 1: moduleFile } = entry; const tsModule = getTsModule(tsPackage, moduleFile, { skipCache: true }); const { moduleName, modulePath, moduleContentFilePath } = tsModule; log( [ '~', `Patching ${chalk.blueBright(moduleName)} in ${chalk.blueBright(path.dirname(modulePath ))}` ], LogLevel.verbose ); try { const { js, dts, loadedFromCache } = getPatchedSource(tsModule, { skipCache, log }); /* Write Patched Module */ log( [ '~', `Writing patched ${chalk.blueBright(moduleName)} to ` + `${chalk.blueBright(moduleContentFilePath)}${loadedFromCache ? ' (cached)' : ''}` ], LogLevel.verbose ); writeFileWithLock(moduleContentFilePath, js!); if (dts) writeFileWithLock(tsModule.dtsPath!, dts!); log([ '+', chalk.green(`Successfully patched ${chalk.bold.yellow(moduleName)}.\r\n`) ], LogLevel.verbose); } catch (e) { if (e instanceof TspError || options.logLevel >= LogLevel.verbose) log([ '!', e.message ]); failedModulePaths.push(tsModule.modulePath); } } if (failedModulePaths.length > 1) { log([ '!', `Some files can't be patched! You can run again with --verbose to get specific error detail. The following files are unable to be ` + `patched:\n - ${failedModulePaths.join('\n - ')}` ]); return false; } return true; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/actions/uninstall.ts000066400000000000000000000014201472416516200246000ustar00rootroot00000000000000import chalk from 'chalk'; import { defaultInstallLibraries } from '../config'; import { unpatch } from './unpatch'; import { getInstallerOptions, InstallerOptions } from "../options"; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Remove patches from TypeScript modules */ export function uninstall(opts?: Partial) { const options = getInstallerOptions(opts); const { logger: log } = options; const ret = unpatch(defaultInstallLibraries, opts); if (ret) log([ '-', chalk.green(`ts-patch removed!`) ]); return ret; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/actions/unpatch.ts000066400000000000000000000074401472416516200242410ustar00rootroot00000000000000import { LogLevel, PatchError, RestoreError } from '../system'; import chalk from 'chalk'; import path from 'path'; import { getTsPackage } from '../ts-package'; import { getModuleFile, getTsModule, ModuleFile } from '../module'; import fs from 'fs'; import { getInstallerOptions, InstallerOptions } from '../options'; import { copyFileWithLock } from '../utils'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function unpatch(moduleName: string, opts?: Partial): boolean export function unpatch(moduleNames: string[], opts?: Partial): boolean export function unpatch(moduleNameOrNames: string | string[], opts?: Partial): boolean { let res = false; const targetModuleNames = [ moduleNameOrNames ].flat(); if (!targetModuleNames.length) throw new PatchError(`Must provide at least one module name to patch`); const options = getInstallerOptions(opts); const { logger: log, dir } = options; /* Load Package */ const tsPackage = getTsPackage(dir); /* Get modules to patch and patch info */ const moduleFiles: [ string, ModuleFile ][] = targetModuleNames.map(m => [ m, getModuleFile(tsPackage.getModulePath(m)) ]); /* Determine patched files */ const unpatchableFiles = moduleFiles.filter(entry => { const [ moduleName, moduleFile ] = entry; if (moduleFile.patchDetail) return true; else { log([ '!', `${chalk.blueBright(moduleName)} is not patched. For details, run: ` + chalk.bgBlackBright('ts-patch check') ]); return false; } }); /* Restore files */ const errors: Record = {}; for (const entry of unpatchableFiles) { /* Load Module */ const { 1: moduleFile } = entry; const tsModule = getTsModule(tsPackage, moduleFile, { skipCache: true }); try { /* Get Backups */ const backupPaths: string[] = [] backupPaths.push(tsModule.backupCachePaths.js); if (tsModule.backupCachePaths.dts) backupPaths.push(tsModule.backupCachePaths.dts); const baseNames = backupPaths.map(p => path.basename(p)).join(' & '); log( [ '~', `Restoring ${chalk.blueBright(baseNames)} in ${chalk.blueBright(path.dirname(tsPackage.libDir))}` ], LogLevel.verbose ); /* Restore files */ for (const backupPath of backupPaths) { if (!fs.existsSync(backupPath)) throw new Error(`Cannot find backup file: ${backupPath}. Try reinstalling typescript.`); const moduleDir = path.dirname(tsModule.modulePath); /* Determine destination path (Need to use moduleContentPath if we're working with a cached module file */ const baseFileName = path.basename(backupPath); const destPathName = baseFileName === tsModule.moduleName ? path.basename(tsModule.moduleContentFilePath) : baseFileName; const destPath = path.join(moduleDir, destPathName); copyFileWithLock(backupPath, destPath); } log([ '+', chalk.green(`Successfully restored ${chalk.bold.yellow(baseNames)}.\r\n`) ], LogLevel.verbose); } catch (e) { errors[tsModule.moduleName] = e; } } /* Handle errors */ if (Object.keys(errors).length > 0) { Object.values(errors).forEach(e => { log([ '!', e.message ], LogLevel.verbose) }); log(''); throw new RestoreError( `[${Object.keys(errors).join(', ')}]`, 'Try reinstalling typescript.' + (options.logLevel < LogLevel.verbose ? ' (Or, run uninstall again with --verbose for specific error detail)' : '') ); } else { res = true; } return res; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/bin/000077500000000000000000000000001472416516200213325ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/bin/ts-patch.ts000066400000000000000000000004651472416516200234320ustar00rootroot00000000000000import * as cliModule from '../cli/cli' /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ cliModule.run(); nonara-ts-patch-ba6d37a/projects/core/src/bin/tspc.ts000066400000000000000000000006171472416516200226570ustar00rootroot00000000000000 /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ // Run if main module cli if (require.main === module) { require('../compiler/tsc'); } else { throw new Error('tspc must be run as a CLI'); } nonara-ts-patch-ba6d37a/projects/core/src/cli/000077500000000000000000000000001472416516200213315ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/cli/cli.ts000066400000000000000000000060521472416516200224530ustar00rootroot00000000000000import minimist from 'minimist'; import { createLogger, getCacheRoot, getLockFilePath, LogLevel } from '../system'; import { getTsPackage } from '../ts-package'; import chalk from 'chalk'; import * as actions from '../actions'; import { getCliOptions, getInstallerOptionsFromCliOptions } from './options'; import { getCliCommand } from './commands'; import { getHelpMenu } from './help-menu'; import { tspPackageJSON } from '../config'; import fs from 'fs'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export type CliConfig = Record // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function run(opt?: { cmdArgs?: string }) { /* Parse Input */ const args = minimist(opt?.cmdArgs?.split(' ') ?? process.argv.slice(2)); const cliOptions = getCliOptions(args); const cmd = getCliCommand(args); /* Setup */ const options = getInstallerOptionsFromCliOptions(cliOptions); const log = createLogger(options.logLevel, options.useColor, options.silent); try { /* Handle commands */ (() => { switch (cmd) { case 'help': return log(getHelpMenu(), LogLevel.system); case 'version': const { version: tsVersion, packageDir } = getTsPackage(options.dir); return log('\r\n' + chalk.bold.blue('ts-patch: ') + tspPackageJSON.version + '\r\n' + chalk.bold.blue('typescript: ') + tsVersion + chalk.gray(` [${packageDir}]`), LogLevel.system ); case 'install': return actions.install(options); case 'uninstall': return actions.uninstall(options); case 'patch': return actions.patch(args._.slice(1).join(' '), options); case 'unpatch': return actions.unpatch(args._.slice(1).join(' '), options); case 'check': return actions.check(undefined, options); case 'clear-cache': const cacheRoot = getCacheRoot(); /* Clear dir */ fs.rmSync(cacheRoot, { recursive: true, force: true }); /* Recreate Dirs */ getCacheRoot(); getLockFilePath(''); return log([ '+', 'Cleared cache & lock-files' ], LogLevel.system); default: log([ '!', 'Invalid command. Try ts-patch /? for more info' ], LogLevel.system) } })(); } catch (e) { log([ '!', chalk.bold.yellow(e.name && (e.name !== 'Error') ? `[${e.name}]: ` : 'Error: ') + chalk.red(e.message) ], LogLevel.system); } // Output for analysis by tests return ({ cmd, args, options }); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/cli/commands.ts000066400000000000000000000035341472416516200235070ustar00rootroot00000000000000import chalk from 'chalk'; import minimist from 'minimist'; import type { CliConfig } from './cli'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ /** @internal */ export const cliCommandsConfig: CliConfig = { install: { short: 'i', caption: `Installs ts-patch (to main libraries)` }, uninstall: { short: 'u', caption: 'Restores original typescript files' }, check: { short: 'c', caption: `Check patch status (use with ${chalk.cyanBright('--dir')} to specify TS package location)` }, patch: { short: void 0, paramCaption: '', caption: 'Patch specific module(s) ' + chalk.yellow('(advanced)') }, unpatch: { short: void 0, paramCaption: '', caption: 'Un-patch specific module(s) ' + chalk.yellow('(advanced)') }, 'clear-cache': { caption: 'Clears cache and lock-files' }, version: { short: 'v', caption: 'Show version' }, help: { short: '/?', caption: 'Show help menu' }, }; // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getCliCommand(args: minimist.ParsedArgs) { let cmd: string | undefined = args._[0] ? args._[0].toLowerCase() : void 0; /* Handle special cases */ if ((args.v) && (!cmd)) return 'version'; if (args.h) return 'help'; if (!cmd) return cmd; /* Get long command */ cmd = Object .entries(cliCommandsConfig) .find(([ long, { short } ]) => long === cmd || short === cmd)?.[0]; return cmd; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/cli/help-menu.ts000066400000000000000000000034451472416516200236010ustar00rootroot00000000000000import chalk from 'chalk'; import stripAnsi from 'strip-ansi'; import { cliCommandsConfig } from './commands'; import { cliOptionsConfig } from './options'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const LINE_INDENT = '\r\n\t'; const COL_WIDTH = 45; // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getHelpMenu() { return LINE_INDENT + chalk.bold.blue('ts-patch [command] ') + chalk.blue('') + '\r\n' + LINE_INDENT + // Commands Object .entries(cliCommandsConfig) .map(([ cmd, { short, caption, paramCaption } ]) => formatLine([ cmd, short ], caption, paramCaption)) .join(LINE_INDENT) + // Options '\r\n' + LINE_INDENT + chalk.bold('Options') + LINE_INDENT + Object .entries(cliOptionsConfig) .map(([ long, { short, inverse, caption, paramCaption } ]) => formatLine([ short && `${chalk.cyanBright('-' + short)}`, long && `${chalk.cyanBright(`${inverse ? '--no-' : '--'}${long}`)}` ], caption, paramCaption)) .join(LINE_INDENT); function formatLine(left: (string | undefined)[], caption: string, paramCaption: string = '') { const leftCol = left.filter(Boolean).join(chalk.blue(', ')) + ' ' + chalk.yellow(paramCaption); const dots = chalk.grey('.'.repeat(COL_WIDTH - stripAnsi(leftCol).length)); return `${leftCol} ${dots} ${caption}`; } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/cli/options.ts000066400000000000000000000055541472416516200234050ustar00rootroot00000000000000import minimist from 'minimist'; import type { CliConfig } from './cli'; import { LogLevel, OptionsError } from '../system'; import { getInstallerOptions, InstallerOptions } from "../options"; import { getGlobalTsDir } from "../utils"; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface CliOptions { silent: boolean; global: boolean; verbose: boolean; dir: string; color: boolean; } // endregion /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ /** @internal */ export const cliOptionsConfig: CliConfig = { silent: { short: 's', caption: 'Run silently' }, global: { short: 'g', caption: 'Target global TypeScript installation' }, verbose: { short: 'v', caption: 'Chat it up' }, cache: { inverse: true, caption: 'Skip cache' }, dir: { short: 'd', paramCaption: '', caption: 'TypeScript directory or directory to resolve typescript package from' }, color: { inverse: true, caption: 'Strip ansi colours from output' } }; // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getCliOptions(args: minimist.ParsedArgs) { let res: CliOptions = {}; for (const [ key, { short } ] of Object.entries(cliOptionsConfig)) { if (args.hasOwnProperty(key) || (short && args.hasOwnProperty(short))) { (res)[key] = args.hasOwnProperty(key) ? args[key] : args[short!]; } } return res; } export function getInstallerOptionsFromCliOptions(cliOptions: CliOptions): InstallerOptions { let partialOptions: Partial = {}; /* Dir option */ if (cliOptions.global && cliOptions.dir) throw new OptionsError(`Cannot specify both --global and --dir`); if ('dir' in cliOptions) partialOptions.dir = cliOptions.dir; if ('global' in cliOptions) partialOptions.dir = getGlobalTsDir(); /* LogLevel option */ if (cliOptions.silent && cliOptions.verbose) throw new OptionsError(`Cannot specify both --silent and --verbose`); if (cliOptions.silent) { partialOptions.logLevel = LogLevel.system; partialOptions.silent = true; } else if (cliOptions.verbose) partialOptions.logLevel = LogLevel.verbose; /* Color option */ if (cliOptions.color) partialOptions.useColor = cliOptions.color; return getInstallerOptions(partialOptions); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/compiler/000077500000000000000000000000001472416516200223745ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/compiler/package.json000066400000000000000000000000701472416516200246570ustar00rootroot00000000000000{ "name": "typescript", "main": "./typescript.js" } nonara-ts-patch-ba6d37a/projects/core/src/compiler/tsc.js000066400000000000000000000012501472416516200235210ustar00rootroot00000000000000const indexPath = '../'; const path = require('path'); const { getLiveModule } = require(indexPath); const { runInThisContext } = require("vm"); /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const { js, tsModule } = getLiveModule('tsc.js'); const script = runInThisContext(` (function (exports, require, module, __filename, __dirname) { ${js} }); `); script.call(exports, exports, require, module, tsModule.modulePath, path.dirname(tsModule.modulePath)); nonara-ts-patch-ba6d37a/projects/core/src/compiler/tsserver.js000066400000000000000000000012551472416516200246120ustar00rootroot00000000000000const indexPath = '../'; const path = require('path'); const { getLiveModule } = require(indexPath); const { runInThisContext } = require("vm"); /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const { js, tsModule } = getLiveModule('tsserver.js'); const script = runInThisContext(` (function (exports, require, module, __filename, __dirname) { ${js} }); `); script.call(exports, exports, require, module, tsModule.modulePath, path.dirname(tsModule.modulePath)); nonara-ts-patch-ba6d37a/projects/core/src/compiler/tsserverlibrary.js000066400000000000000000000012641472416516200261770ustar00rootroot00000000000000const indexPath = '../'; const path = require('path'); const { getLiveModule } = require(indexPath); const { runInThisContext } = require("vm"); /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const { js, tsModule } = getLiveModule('tsserverlibrary.js'); const script = runInThisContext(` (function (exports, require, module, __filename, __dirname) { ${js} }); `); script.call(exports, exports, require, module, tsModule.modulePath, path.dirname(tsModule.modulePath)); nonara-ts-patch-ba6d37a/projects/core/src/compiler/typescript.js000066400000000000000000000012571472416516200251450ustar00rootroot00000000000000const indexPath = '../'; const path = require('path'); const { getLiveModule } = require(indexPath); const { runInThisContext } = require("vm"); /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const { js, tsModule } = getLiveModule('typescript.js'); const script = runInThisContext(` (function (exports, require, module, __filename, __dirname) { ${js} }); `); script.call(exports, exports, require, module, tsModule.modulePath, path.dirname(tsModule.modulePath)); nonara-ts-patch-ba6d37a/projects/core/src/config.ts000066400000000000000000000043341472416516200224030ustar00rootroot00000000000000import path from 'path'; import fs from "fs"; import ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Library Config /* ****************************************************************************************************************** */ /** * Root directory for ts-patch */ // TODO - This should be improved at some point export const appRoot = (() => { const moduleDir = __dirname; const chkFile = (pkgFile: string) => (fs.existsSync(pkgFile) && (require(pkgFile).name === 'ts-patch')) ? path.dirname(pkgFile) : void 0; const res = chkFile(path.join(moduleDir, 'package.json')) || chkFile(path.join(moduleDir, '../../../package.json')); if (!res) throw new Error(`Error getting app root. No valid ts-patch package file found in ` + moduleDir); return res; })(); /** * Package json for ts-patch */ export const tspPackageJSON = require(path.resolve(appRoot, 'package.json')); export const RESOURCES_PATH = path.join(appRoot, tspPackageJSON.directories.resources); export const defaultNodePrinterOptions: ts.PrinterOptions = { newLine: ts.NewLineKind.LineFeed, removeComments: false }; // endregion /* ****************************************************************************************************************** */ // region: Patch Config /* ****************************************************************************************************************** */ export const defaultInstallLibraries = [ 'tsc.js', 'typescript.js' ]; export const corePatchName = ``; export const modulePatchFilePath = path.resolve(appRoot, tspPackageJSON.directories.resources, 'module-patch.js'); export const dtsPatchFilePath = path.resolve(appRoot, tspPackageJSON.directories.resources, 'module-patch.d.ts'); export const execTscCmd = 'execTsc'; // endregion /* ****************************************************************************************************************** */ // region: Cache Config /* ****************************************************************************************************************** */ export const cachedFilePatchedPrefix = 'patched.'; export const lockFileDir = 'locks'; // endregion nonara-ts-patch-ba6d37a/projects/core/src/index.ts000066400000000000000000000003101472416516200222330ustar00rootroot00000000000000export { InstallerOptions, getInstallerOptions } from './options'; export { install, uninstall, patch, check } from './actions' export { getLiveModule } from './module' export * from './plugin-types' nonara-ts-patch-ba6d37a/projects/core/src/module/000077500000000000000000000000001472416516200220475ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/module/get-live-module.ts000066400000000000000000000017441472416516200254240ustar00rootroot00000000000000import path from 'path'; import { getTsModule, TsModule } from './ts-module'; import { getTsPackage } from '../ts-package'; import { getPatchedSource } from '../patch/get-patched-source'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getLiveModule(moduleName: TsModule.Name) { const skipCache = process.env.TSP_SKIP_CACHE === 'true'; const tsPath = process.env.TSP_COMPILER_TS_PATH ? path.resolve(process.env.TSP_COMPILER_TS_PATH) : require.resolve('typescript'); /* Open the TypeScript module */ const tsPackage = getTsPackage(tsPath); const tsModule = getTsModule(tsPackage, moduleName, { skipCache }); /* Get patched version */ const { js } = getPatchedSource(tsModule, { skipCache, skipDts: true }); return { js, tsModule }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/module/index.ts000066400000000000000000000002001472416516200235160ustar00rootroot00000000000000export * from './ts-module'; export * from './module-source'; export * from './module-file'; export * from './get-live-module'; nonara-ts-patch-ba6d37a/projects/core/src/module/module-file.ts000066400000000000000000000100621472416516200246200ustar00rootroot00000000000000import fs from 'fs'; import { PatchDetail } from '../patch/patch-detail'; import path from 'path'; import { getHash, withFileLock } from '../utils'; import { TsModule } from './ts-module'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const SHORT_CHUNK_SIZE = 1024; const LONG_CHUNK_SIZE = 64_536; // endregion /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface ModuleFile { moduleName: string patchDetail?: PatchDetail filePath: string contentFilePath: string get content(): string getHash(): string } // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function readFile(filePath: string, headersOnly?: boolean) { return withFileLock(filePath, () => { let CHUNK_SIZE = headersOnly ? SHORT_CHUNK_SIZE : LONG_CHUNK_SIZE; let result = ''; let doneReadingHeaders = false; let bytesRead; let buffer = Buffer.alloc(CHUNK_SIZE); const headerLines: string[] = []; let isLastHeaderIncomplete = false; const fd = fs.openSync(filePath, 'r'); try { readFileLoop: while ((bytesRead = fs.readSync(fd, buffer, 0, CHUNK_SIZE, null)) > 0) { const chunkString = buffer.toString('utf-8', 0, bytesRead); /* Handle Header */ if (!doneReadingHeaders) { const lines = chunkString.split('\n'); lineLoop: for (let i = 0; i < lines.length; i++) { const line = lines[i]; if (i === 0 && isLastHeaderIncomplete) { headerLines[headerLines.length - 1] += line; } else { if (line.startsWith('///')) { headerLines.push(line); } else { doneReadingHeaders = true; if (!headersOnly) { result += lines.slice(i).join('\n'); CHUNK_SIZE = LONG_CHUNK_SIZE; buffer = Buffer.alloc(CHUNK_SIZE); break lineLoop; } else { break readFileLoop; } } } } if (!doneReadingHeaders) isLastHeaderIncomplete = !chunkString.endsWith('\n'); } else { /* Handle content */ result += chunkString; } } return { headerLines, content: headersOnly ? undefined : result }; } finally { fs.closeSync(fd); } }); } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getModuleFile(filePath: string, loadFullContent?: boolean): ModuleFile { /* Determine shim redirect file - see: https://github.com/nonara/ts-patch/issues/174 */ const moduleName = path.basename(filePath); const contentFilePath = TsModule.getContentFilePathForModulePath(filePath); /* Get PatchDetail */ let { headerLines, content } = readFile(contentFilePath, !loadFullContent); const patchDetail = PatchDetail.fromHeader(headerLines); return { moduleName, filePath, contentFilePath, patchDetail, get content() { if (content == null) content = readFile(this.contentFilePath, false).content; return content!; }, getHash(): string { return getHash(this.content); } }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/module/module-source.ts000066400000000000000000000044411472416516200252050ustar00rootroot00000000000000import { createSourceSection, SourceSection } from './source-section'; import { TsModule } from './ts-module'; import { sliceModule } from '../slice/module-slice'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface ModuleSource { fileHeader: SourceSection; bodyHeader?: SourceSection; body: SourceSection[]; fileFooter?: SourceSection; usesTsNamespace: boolean; getSections(): [ sectionName: SourceSection['sectionName'], section: SourceSection | undefined ][]; bodyWrapper?: { start: string; end: string; } } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getModuleSource(tsModule: TsModule): ModuleSource { const moduleFile = tsModule.getUnpatchedModuleFile(); const { firstSourceFileStart, fileEnd, wrapperPos, bodyPos, sourceFileStarts, bodyWrapper } = sliceModule(moduleFile, tsModule.package.version); const fileHeaderEnd = wrapperPos?.start ?? firstSourceFileStart; return { fileHeader: createSourceSection(moduleFile, 'file-header', 0, fileHeaderEnd), bodyHeader: wrapperPos && createSourceSection(moduleFile, 'body-header', bodyPos.start, firstSourceFileStart, 2), body: sourceFileStarts.map(([ srcFileName, startPos ], i) => { const endPos = sourceFileStarts[i + 1]?.[1] ?? bodyPos?.end ?? fileEnd; return createSourceSection(moduleFile, 'body', startPos, endPos, wrapperPos != null ? 2 :0, srcFileName); }), fileFooter: wrapperPos && createSourceSection(moduleFile, 'file-footer', wrapperPos.end, fileEnd), usesTsNamespace: wrapperPos != null, getSections() { return [ [ 'file-header', this.fileHeader ], [ 'body-header', this.bodyHeader ], ...this.body.map((section, i) => [ `body`, section ] as [ SourceSection['sectionName'], SourceSection ]), [ 'file-footer', this.fileFooter ], ]; }, bodyWrapper, } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/module/source-section.ts000066400000000000000000000063331472416516200253660ustar00rootroot00000000000000import ts from 'typescript'; import { ModuleFile } from './module-file'; import path from 'path'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface SourceSection { readonly sectionName: 'file-header' | 'body-header' | 'body' | 'file-footer'; readonly srcFileName?: string; readonly pos: { start: number; end: number }; indentLevel: number; hasTransformed?: boolean; hasUpdatedSourceText?: boolean; get sourceText(): string; updateSourceText(newText: string): void; getSourceFile(): ts.SourceFile; getOriginalSourceFile(): ts.SourceFile; transform(transformers: ts.TransformerFactory[]): void; print(printer?: ts.Printer): string; } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function createSourceSection( moduleFile: ModuleFile, sectionName: SourceSection['sectionName'], startPos: number, endPos: number, indentLevel: number = 0, srcFileName?: string, ): SourceSection { let sourceText: string | undefined; let originalSourceFile: ts.SourceFile | undefined; let sourceFile: ts.SourceFile | undefined; let sourceFileName: string | undefined; return { hasTransformed: false, hasUpdatedSourceText: false, sectionName, srcFileName, indentLevel, pos: { start: startPos, end: endPos }, get sourceText() { return sourceText ??= moduleFile.content.slice(startPos, endPos); }, getSourceFile() { if (!sourceFile) { if (this.hasUpdatedSourceText) return createSourceFile(this); else return this.getOriginalSourceFile(); } return sourceFile; }, updateSourceText(newText: string) { sourceText = newText; sourceFile = undefined; }, getOriginalSourceFile() { originalSourceFile ??= createSourceFile(this); return originalSourceFile; }, transform(transformers: ts.TransformerFactory[]) { const result = ts.transform(this.getSourceFile(), transformers); sourceFile = result.transformed[0]; this.hasTransformed = true; this.indentLevel = 0; }, print(printer?: ts.Printer) { if (!this.hasTransformed) return this.sourceText; printer ??= ts.createPrinter(); return printer.printFile(this.getSourceFile()); } } function createSourceFile(sourceSection: SourceSection) { return ts.createSourceFile( getSourceFileName(), sourceSection.sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS ); } function getSourceFileName() { if (!sourceFileName) { sourceFileName = srcFileName; if (!sourceFileName) { const baseName = path.basename(moduleFile.filePath, path.extname(moduleFile.filePath)); sourceFileName = `${baseName}.${sectionName}.ts`; } } return sourceFileName; } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/module/ts-module.ts000066400000000000000000000127501472416516200243350ustar00rootroot00000000000000import path from 'path'; import fs from 'fs'; import type { TsPackage } from '../ts-package'; import { getModuleSource, ModuleSource } from './module-source'; import { getCachePath, TspError } from '../system'; import { getModuleFile, ModuleFile } from './module-file'; import { cachedFilePatchedPrefix } from '../config'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ export namespace TsModule { export const names = [ 'tsc.js', 'tsserverlibrary.js', 'typescript.js', 'tsserver.js' ]; export const contentFileMap: Record = { 'tsc.js': '_tsc.js', 'tsserver.js': '_tsserver.js' } satisfies Partial>; export function getContentFileName(moduleName: typeof names[number]): string { return contentFileMap[moduleName] || moduleName; } /* Determine shim redirect file - see: https://github.com/nonara/ts-patch/issues/174 */ export function getContentFilePathForModulePath(modulePath: string): string { const baseName = path.basename(modulePath); const redirectFile = contentFileMap[baseName]; const maybeModuleContentPath = redirectFile && path.join(path.dirname(modulePath), redirectFile); const moduleContentPath = maybeModuleContentPath && fs.existsSync(maybeModuleContentPath) ? maybeModuleContentPath : modulePath; return moduleContentPath; } } // endregion /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface TsModule { package: TsPackage; majorVer: number; minorVer: number; isPatched: boolean; moduleName: TsModule.Name; modulePath: string; moduleContentFilePath: string; moduleFile: ModuleFile; dtsPath: string | undefined; cacheKey: string; backupCachePaths: { js: string, dts?: string }; patchedCachePaths: { js: string, dts?: string }; getUnpatchedModuleFile(): ModuleFile; getUnpatchedSource(): ModuleSource; } export namespace TsModule { export type Name = (typeof names)[number] | string; } export interface GetTsModuleOptions { skipCache?: boolean } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getTsModule(tsPackage: TsPackage, moduleName: TsModule.Name, options?: GetTsModuleOptions): TsModule export function getTsModule(tsPackage: TsPackage, moduleFile: ModuleFile, options?: GetTsModuleOptions): TsModule export function getTsModule( tsPackage: TsPackage, moduleNameOrModuleFile: TsModule.Name | ModuleFile, options?: GetTsModuleOptions ): TsModule { const skipCache = options?.skipCache; /* Get Module File */ let moduleFile: ModuleFile | undefined; let moduleName: string | undefined; let modulePath: string | undefined; if (typeof moduleNameOrModuleFile === "object" && moduleNameOrModuleFile.content) { moduleFile = moduleNameOrModuleFile; moduleName = moduleFile.moduleName; modulePath = moduleFile.filePath; } else { moduleName = moduleNameOrModuleFile as TsModule.Name; } /* Handle Local Cache */ if (!skipCache && tsPackage.moduleCache.has(moduleName)) return tsPackage.moduleCache.get(moduleName)!; /* Load File (if not already) */ if (!modulePath) modulePath = path.join(tsPackage.libDir, moduleName); if (!moduleFile) moduleFile = getModuleFile(modulePath); /* Get DTS if exists */ const maybeDtsFile = modulePath.replace(/\.js$/, '.d.ts'); const dtsPath = fs.existsSync(maybeDtsFile) ? maybeDtsFile : undefined; const dtsName = dtsPath && path.basename(dtsPath); /* Get Cache Paths */ const cacheKey = moduleFile.patchDetail?.originalHash || moduleFile.getHash(); const backupCachePaths = { js: getCachePath(cacheKey, moduleName), dts: dtsName && getCachePath(cacheKey, dtsName) } const patchedCachePaths = { js: getCachePath(cacheKey, cachedFilePatchedPrefix + moduleName), dts: dtsName && getCachePath(cacheKey, cachedFilePatchedPrefix + dtsName) } /* Create Module */ const isPatched = !!moduleFile.patchDetail; let originalModuleFile: ModuleFile | undefined; const tsModule: TsModule = { package: tsPackage, majorVer: tsPackage.majorVer, minorVer: tsPackage.minorVer, isPatched, moduleName, modulePath, moduleFile, moduleContentFilePath: moduleFile.contentFilePath, dtsPath, cacheKey, backupCachePaths, patchedCachePaths, getUnpatchedSource() { return getModuleSource(this); }, getUnpatchedModuleFile() { if (!originalModuleFile) { if (isPatched) { if (!fs.existsSync(backupCachePaths.js)) throw new TspError(`Cannot find backup cache file for ${moduleName}. Please wipe node_modules and reinstall.`); originalModuleFile = getModuleFile(backupCachePaths.js); } else { originalModuleFile = isPatched ? getModuleFile(backupCachePaths.js) : moduleFile!; } } return originalModuleFile; } }; tsPackage.moduleCache.set(moduleName, tsModule); return tsModule; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/options.ts000066400000000000000000000033611472416516200226300ustar00rootroot00000000000000import { createLogger, Logger, LogLevel } from './system'; import { PartialSome } from "./utils"; /* ****************************************************************************************************************** */ // region: Locals /* ****************************************************************************************************************** */ type PreAppOptions = PartialSome // endregion /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ export interface InstallerOptions { logLevel: LogLevel; useColor: boolean; dir: string; silent: boolean; logger: Logger; skipCache: boolean; } export namespace InstallerOptions { export function getDefaults() { return { logLevel: LogLevel.normal, useColor: true, dir: process.cwd(), silent: false, skipCache: false } satisfies PreAppOptions } } // endregion /* ******************************************************************************************************************** * Parser * ********************************************************************************************************************/ export function getInstallerOptions(options?: Partial): InstallerOptions { if (!options && typeof options === "object" && Object.isSealed(options)) return options as InstallerOptions; const res = { ...InstallerOptions.getDefaults(), ...options } as PreAppOptions; return Object.seal({ ...res, logger: res.logger ?? createLogger(res.logLevel, res.useColor, res.silent) }); } nonara-ts-patch-ba6d37a/projects/core/src/patch/000077500000000000000000000000001472416516200216615ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/patch/get-patched-source.ts000066400000000000000000000057051472416516200257230ustar00rootroot00000000000000import { Logger, LogLevel } from '../system'; import chalk from 'chalk'; import path from 'path'; import { copyFileWithLock, mkdirIfNotExist, readFileWithLock, writeFileWithLock } from '../utils'; import fs from 'fs'; import { getModuleFile, TsModule } from '../module'; import { patchModule } from './patch-module'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface GetPatchedSourceOptions { log?: Logger skipCache?: boolean skipDts?: boolean } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getPatchedSource(tsModule: TsModule, options?: GetPatchedSourceOptions): { js: string, dts: string | undefined, loadedFromCache: boolean } { const { backupCachePaths, patchedCachePaths } = tsModule; const { log, skipCache } = options || {}; /* Write backup if not patched */ if (!tsModule.isPatched) { for (const [ key, backupPath ] of Object.entries(backupCachePaths)) { const srcPath = key === 'dts' ? tsModule.dtsPath : tsModule.moduleContentFilePath; if (key === 'dts' && options?.skipDts) continue; if (!srcPath) continue; log?.([ '~', `Writing backup cache to ${chalk.blueBright(backupPath)}` ], LogLevel.verbose); const cacheDir = path.dirname(backupPath); mkdirIfNotExist(cacheDir); copyFileWithLock(srcPath, backupPath); } } /* Get Patched Module */ const canUseCache = !skipCache && !tsModule.moduleFile.patchDetail?.isOutdated && (!patchedCachePaths.dts || fs.existsSync(patchedCachePaths.dts)) && fs.existsSync(patchedCachePaths.js) && !getModuleFile(patchedCachePaths.js).patchDetail?.isOutdated; let js: string | undefined; let dts: string | undefined; if (canUseCache) { js = readFileWithLock(patchedCachePaths.js); dts = !options?.skipDts && patchedCachePaths.dts ? readFileWithLock(patchedCachePaths.dts) : undefined; } else { const res = patchModule(tsModule, options?.skipDts); js = res.js; dts = res.dts; /* Write patched cache */ if (!skipCache) { const cacheDir = path.dirname(patchedCachePaths.js); for (const [ key, patchPath ] of Object.entries(patchedCachePaths)) { const srcPath = key === 'dts' ? dts : js; if (key === 'dts' && options?.skipDts) continue; if (!srcPath) continue; log?.([ '~', `Writing patched cache to ${chalk.blueBright(patchPath)}` ], LogLevel.verbose); mkdirIfNotExist(cacheDir); writeFileWithLock(patchPath, srcPath); } } } return { js, dts, loadedFromCache: canUseCache }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/patch-detail.ts000066400000000000000000000065151472416516200245770ustar00rootroot00000000000000import { TsModule } from '../module'; import { corePatchName, tspPackageJSON } from '../config'; import semver from 'semver'; import { getHash } from '../utils'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ export const tspHeaderBlockStart = '/// tsp-module:'; export const tspHeaderBlockStop = '/// :tsp-module'; export const currentPatchDetailVersion = '0.1.0'; // endregion /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface PatchDetail { tsVersion: string tspVersion: string patchDetailVersion: string moduleName: TsModule.Name originalHash: string hash: string patches: PatchDetail.PatchEntry[] } export namespace PatchDetail { export interface PatchEntry { library: string version: string patchName?: string hash?: string blocksCache?: boolean } } // endregion /* ****************************************************************************************************************** */ // region: PatchDetail (class) /* ****************************************************************************************************************** */ export class PatchDetail { /* ********************************************************* */ // region: Methods /* ********************************************************* */ get isOutdated() { const packageVersion = tspPackageJSON.version; return semver.gt(packageVersion, this.tspVersion); } toHeader() { const lines = JSON.stringify(this, null, 2) .split('\n') .map(line => `/// ${line}`) .join('\n'); return `${tspHeaderBlockStart}\n${lines}\n${tspHeaderBlockStop}`; } static fromHeader(header: string | string[]) { const headerLines = Array.isArray(header) ? header : header.split('\n'); let patchDetail: PatchDetail | undefined; const startIdx = headerLines.findIndex(line => line === tspHeaderBlockStart) + 1; let endIdx = headerLines.findIndex(line => line === tspHeaderBlockStop); if (endIdx === -1) headerLines.length; if (startIdx && endIdx) { const patchInfoStr = headerLines .slice(startIdx, endIdx) .map(line => line.replace('/// ', '')) .join('\n'); patchDetail = Object.assign(new PatchDetail(), JSON.parse(patchInfoStr) as PatchDetail); } return patchDetail; } static fromModule(tsModule: TsModule, patchedContent: string, patches: PatchDetail.PatchEntry[] = []) { patches.unshift({ library: 'ts-patch', patchName: corePatchName, version: tspPackageJSON.version }); const patchDetail = { tsVersion: tsModule.package.version, tspVersion: tspPackageJSON.version, patchDetailVersion: currentPatchDetailVersion, moduleName: tsModule.moduleName, originalHash: tsModule.cacheKey, hash: getHash(patchedContent), patches: patches } satisfies Omit return Object.assign(new PatchDetail(), patchDetail); } // endregion } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/patch-module.ts000066400000000000000000000163511472416516200246210ustar00rootroot00000000000000import ts from 'typescript'; import fs from 'fs'; import { defaultNodePrinterOptions, dtsPatchFilePath, execTscCmd, modulePatchFilePath } from '../config'; import { getTsModule, TsModule } from '../module'; import { addOriginalCreateProgramTransformer, createMergeStatementsTransformer, createProgramExportFiles, fixTsEarlyReturnTransformer, hookTscExecTransformer, patchCreateProgramTransformer, patchEmitterTransformer } from './transformers'; import { SourceSection } from '../module/source-section'; import { PatchError } from '../system'; import { readFileWithLock } from '../utils'; import { PatchDetail } from './patch-detail'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const dtsPatchSrc = '\n' + fs.readFileSync(dtsPatchFilePath, 'utf-8'); const jsPatchSrc = fs.readFileSync(modulePatchFilePath, 'utf-8') // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function patchModule(tsModule: TsModule, skipDts: boolean = false): { js: string, dts?: string } { let shouldWrap: boolean = false; switch (tsModule.moduleName) { case 'tsc.js': case 'tsserver.js': case 'tsserverlibrary.js': case 'typescript.js': shouldWrap = true; } const source = tsModule.getUnpatchedSource(); const { bodyWrapper } = source; const printableBodyFooters: (SourceSection | string)[] = []; const printableFooters: (SourceSection | string)[] = []; /* Splice in full compiler functionality (if not already present) */ if (tsModule.moduleName !== 'typescript.js') { const typescriptModule = getTsModule(tsModule.package, 'typescript.js'); const tsSource = typescriptModule.getUnpatchedSource(); /* Merge Headers & Footer */ mergeStatements(source.fileHeader, tsSource.fileHeader); source.bodyHeader = tsSource.bodyHeader; mergeStatements(source.fileFooter, tsSource.fileFooter); /* Replace body */ for (let i = source.body.length - 1; i >= 0; i--) { const bodySection = source.body[i]; if (tsSource.body.some(s => s.srcFileName === bodySection.srcFileName)) { source.body.splice(i, 1); } } source.body.unshift(...tsSource.body); /* Fix early return */ // NOTE - This exists up until TS 5.4, but isn't there for 5.5+ if (tsModule.majorVer <= 5 && tsModule.minorVer <= 4) { const typescriptSection = source.body.find(s => s.srcFileName === 'src/typescript/typescript.ts'); if (!typescriptSection) throw new PatchError(`Could not find Typescript source section`); typescriptSection.transform([ fixTsEarlyReturnTransformer ]); printableBodyFooters.push(`return returnResult;`); } } /* Patch Program */ const programSection = source.body.find(s => s.srcFileName === 'src/compiler/program.ts'); if (!programSection) throw new PatchError(`Could not find Program source section`); programSection.transform([ patchCreateProgramTransformer ]); /* Add originalCreateProgram to exports */ let createProgramAdded = false; for (const fileName of createProgramExportFiles) { // As of TS 5.5, we have to handle cases of multiple instances of the same file name. In this case, we need to // handle both src/typescript/typescript.ts const sections = source.body.filter(s => s.srcFileName === fileName); for (const section of sections) { try { section.transform([ addOriginalCreateProgramTransformer ]); createProgramAdded = true; } catch (e) { if (!(e instanceof PatchError)) throw e; } } } if (!createProgramAdded) throw new PatchError(`Could not find any of the createProgram export files`); /* Patch emitter (for diagnostics tools) */ const emitterSection = source.body.find(s => s.srcFileName === 'src/compiler/watch.ts'); if (!emitterSection) throw new PatchError(`Could not find Emitter source section`); emitterSection.transform([ patchEmitterTransformer ]); /* Move executeCommandLine outside of closure */ if (tsModule.moduleName === 'tsc.js') { const tscSection = source.body.find(s => s.srcFileName === 'src/tsc/tsc.ts'); if (!tscSection) throw new PatchError(`Could not find Tsc source section`); tscSection.transform([ hookTscExecTransformer ]); printableFooters.push(`tsp.${execTscCmd}();`); } /* Print the module */ const printedJs = printModule(); /* Get Dts */ let dts: string | undefined; if (!skipDts && tsModule.dtsPath) { const dtsText = readFileWithLock(tsModule.dtsPath); dts = dtsPatchSrc + '\n' + dtsText; } /* Get JS */ const libraryName = tsModule.moduleName.replace(/\.js$/, ''); const patchDetail = PatchDetail.fromModule(tsModule, printedJs); const js = patchDetail.toHeader() + '\n' + jsPatchSrc + '\n' + `tsp.currentLibrary = '${libraryName}';\n`+ printedJs; return { dts, js }; function getPrintList() { const list: [item: (string | SourceSection | undefined), indent?: number][] = []; let indentLevel = 0; /* File Header */ list.push([ source.fileHeader, indentLevel ]); /* Body Wrapper Open */ if (shouldWrap) { if (bodyWrapper) list.push([ `\n${bodyWrapper.start}\n`, indentLevel ]); indentLevel = 2; } /* Body Header*/ list.push([ source.bodyHeader, indentLevel ]); /* Body */ source.body.forEach(section => list.push([ section, indentLevel ])); /* Body Footers */ printableBodyFooters.forEach(f => list.push([ f, indentLevel ])); /* Body Wrapper Close */ if (shouldWrap) { indentLevel = 0; if (bodyWrapper) list.push([ `\n${bodyWrapper.end}\n`, indentLevel ]); } /* File Footer */ list.push([ source.fileFooter, indentLevel ]); printableFooters.forEach(f => list.push([ f, indentLevel ])); return list; } function printModule() { const printer = ts.createPrinter(defaultNodePrinterOptions); let outputStr = ``; for (const [ item, indentLevel ] of getPrintList()) { let printed: string; let addedIndent: number | undefined; if (item === undefined) continue; if (typeof item === 'string') { printed = item; } else { printed = item.print(printer); if (indentLevel && item.indentLevel < indentLevel) { addedIndent = indentLevel - item.indentLevel; } } if (addedIndent) printed = printed.replace(/^/gm, ' '.repeat(addedIndent)); outputStr += printed; } return outputStr; } function mergeStatements( baseSection: SourceSection | undefined, addedSection: SourceSection | undefined, ) { if (!baseSection || !addedSection) { if (addedSection) baseSection = addedSection; return; } const baseSourceFile = baseSection.getSourceFile(); const addedSourceFile = addedSection.getSourceFile(); const transformer = createMergeStatementsTransformer(baseSourceFile, addedSourceFile); baseSection.transform([ transformer ]); } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/000077500000000000000000000000001472416516200244065ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/add-original-create-program.ts000066400000000000000000000113121472416516200322140ustar00rootroot00000000000000import ts from 'typescript'; import { PatchError } from '../../system'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ export const createProgramExportFiles = [ /* TS < 5.4 */ 'src/typescript/_namespaces/ts.ts', /* TS >= 5.4 */ 'src/server/_namespaces/ts.ts', 'src/typescript/typescript.ts' ] // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function addOriginalCreateProgramTransformer(context: ts.TransformationContext) { const { factory } = context; let patchSuccess = false; return (sourceFile: ts.SourceFile) => { if (!createProgramExportFiles.includes(sourceFile.fileName)) throw new Error('Wrong emitter file sent to transformer! This should be unreachable.'); const res = factory.updateSourceFile(sourceFile, ts.visitNodes(sourceFile.statements, visitNodes) as unknown as ts.Statement[]); if (!patchSuccess) throw new PatchError('Failed to patch typescript originalCreateProgram!'); return res; function visitNodes(node: ts.Statement): ts.VisitResult { /* Handle: __export({ ... }) */ if ( ts.isExpressionStatement(node) && ts.isCallExpression(node.expression) && node.expression.expression.getText() === '__export' ) { const exportObjectLiteral = node.expression.arguments[1]; if (ts.isObjectLiteralExpression(exportObjectLiteral)) { const originalCreateProgramProperty = factory.createPropertyAssignment( 'originalCreateProgram', factory.createArrowFunction( undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), factory.createIdentifier('originalCreateProgram') ) ); const updatedExportObjectLiteral = factory.updateObjectLiteralExpression( exportObjectLiteral, [ ...exportObjectLiteral.properties, originalCreateProgramProperty ] ); const updatedNode = factory.updateExpressionStatement( node, factory.updateCallExpression( node.expression, node.expression.expression, undefined, [ node.expression.arguments[0], updatedExportObjectLiteral ] ) ); patchSuccess = true; return updatedNode; } } /* Handle: 1 && (module.exports = { ... }) (ts5.5+) */ if ( ts.isExpressionStatement(node) && ts.isBinaryExpression(node.expression) && node.expression.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken && ts.isParenthesizedExpression(node.expression.right) && ts.isBinaryExpression(node.expression.right.expression) && node.expression.right.expression.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.expression.right.expression.left) && node.expression.right.expression.left.expression.getText() === 'module' && node.expression.right.expression.left.name.getText() === 'exports' && ts.isObjectLiteralExpression(node.expression.right.expression.right) ) { // Add originalCreateProgram to the object literal const originalCreateProgramProperty = factory.createShorthandPropertyAssignment('originalCreateProgram'); const updatedObjectLiteral = factory.updateObjectLiteralExpression( node.expression.right.expression.right, [ ...node.expression.right.expression.right.properties, originalCreateProgramProperty ] ); // Update the node const updatedNode = factory.updateExpressionStatement( node, factory.updateBinaryExpression( node.expression, node.expression.left, node.expression.operatorToken, factory.updateParenthesizedExpression( node.expression.right, factory.updateBinaryExpression( node.expression.right.expression, node.expression.right.expression.left, node.expression.right.expression.operatorToken, updatedObjectLiteral ) ) ) ); patchSuccess = true; return updatedNode; } return node; } }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/fix-ts-early-return.ts000066400000000000000000000026611472416516200306240ustar00rootroot00000000000000import ts, { isReturnStatement } from 'typescript'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function fixTsEarlyReturnTransformer(context: ts.TransformationContext) { const { factory } = context; let patchSuccess = false; return (sourceFile: ts.SourceFile) => { if (sourceFile.fileName !== 'src/typescript/typescript.ts') throw new Error('Wrong emitter file sent to transformer! This should be unreachable.'); const res = factory.updateSourceFile(sourceFile, ts.visitNodes(sourceFile.statements, visitNodes) as unknown as ts.Statement[]); if (!patchSuccess) throw new Error('Failed to patch typescript early return!'); return res; function visitNodes(node: ts.Statement): ts.VisitResult { if (isReturnStatement(node)) { patchSuccess = true; return factory.createVariableStatement( undefined, factory.createVariableDeclarationList( [factory.createVariableDeclaration( factory.createIdentifier("returnResult"), undefined, undefined, node.expression! )], ts.NodeFlags.None ) ) } return node; } }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/hook-tsc-exec.ts000066400000000000000000000034151472416516200274320ustar00rootroot00000000000000import ts from 'typescript'; import { execTscCmd } from '../../config'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function hookTscExecTransformer(context: ts.TransformationContext) { const { factory } = context; let patchSuccess = false; return (sourceFile: ts.SourceFile) => { if (sourceFile.fileName !== 'src/tsc/tsc.ts') throw new Error('Wrong emitter file sent to transformer! This should be unreachable.'); const res = factory.updateSourceFile(sourceFile, ts.visitNodes(sourceFile.statements, visitNodes) as unknown as ts.Statement[]); if (!patchSuccess) throw new Error('Failed to patch tsc exec statement early return!'); return res; function visitNodes(node: ts.Statement): ts.VisitResult { if (ts.isExpressionStatement(node) && ts.isCallExpression(node.expression) && ts.isIdentifier(node.expression.expression) && node.expression.expression.text === 'executeCommandLine' ) { patchSuccess = true; return factory.createExpressionStatement(factory.createBinaryExpression( factory.createPropertyAccessExpression( factory.createIdentifier("tsp"), factory.createIdentifier("execTsc") ), factory.createToken(ts.SyntaxKind.EqualsToken), factory.createArrowFunction( undefined, undefined, [], undefined, factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), node.expression ) )); } return node; } } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/index.ts000066400000000000000000000003361472416516200260670ustar00rootroot00000000000000export * from './fix-ts-early-return' export * from './patch-create-program' export * from './patch-emitter' export * from './merge-statements' export * from './add-original-create-program' export * from './hook-tsc-exec' nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/merge-statements.ts000066400000000000000000000041101472416516200302360ustar00rootroot00000000000000import ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function createMergeStatementsTransformer( baseSourceFile: ts.SourceFile, sourceFile: ts.SourceFile ): ts.TransformerFactory { const replacements = new Map(); for (const node of sourceFile.statements) { if (ts.isVariableStatement(node)) { const name = (node.declarationList.declarations[0].name as ts.Identifier).text; replacements.set(name, node); } else if (ts.isFunctionDeclaration(node) && node.name) { const name = node.name.text; replacements.set(name, node); } } return (context: ts.TransformationContext) => { const { factory } = context; return (node: ts.SourceFile) => { if (node.fileName !== baseSourceFile.fileName) return node; const transformedStatements: ts.Statement[] = []; node.statements.forEach((statement) => { if (ts.isVariableStatement(statement)) { const name = (statement.declarationList.declarations[0].name as ts.Identifier).text; if (replacements.has(name)) { transformedStatements.push(replacements.get(name)!); replacements.delete(name); } else { transformedStatements.push(statement); } } else if (ts.isFunctionDeclaration(statement) && statement.name) { const name = statement.name.text; if (replacements.has(name)) { transformedStatements.push(replacements.get(name)!); replacements.delete(name); } else { transformedStatements.push(statement); } } else { transformedStatements.push(statement); } }); replacements.forEach((value) => transformedStatements.push(value)); return factory.updateSourceFile(node, transformedStatements); }; }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/patch-create-program.ts000066400000000000000000000043051472416516200307650ustar00rootroot00000000000000import ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function patchCreateProgramTransformer(context: ts.TransformationContext) { const { factory } = context; let patchSuccess = false; return (sourceFile: ts.SourceFile) => { if (sourceFile.fileName !== 'src/compiler/program.ts') throw new Error('Wrong program file sent to transformer! This should be unreachable.'); const res = factory.updateSourceFile(sourceFile, ts.visitNodes(sourceFile.statements, visitNode) as unknown as ts.Statement[]); if (!patchSuccess) throw new Error('Failed to patch createProgram function!'); return res; function visitNode(node: ts.Statement): ts.VisitResult { if (ts.isFunctionDeclaration(node) && node.name?.getText() === 'createProgram') { const originalCreateProgram = factory.updateFunctionDeclaration( node, node.modifiers, node.asteriskToken, factory.createIdentifier('originalCreateProgram'), node.typeParameters, node.parameters, node.type, node.body ); // function createProgram() { return tsp.originalCreateProgram(...arguments); } const newCreateProgram = factory.createFunctionDeclaration( undefined, undefined, 'createProgram', undefined, [], undefined, factory.createBlock([ factory.createReturnStatement( factory.createCallExpression( factory.createPropertyAccessExpression( factory.createIdentifier('tsp'), factory.createIdentifier('createProgram') ), undefined, [ factory.createSpreadElement(factory.createIdentifier('arguments')) ] ) ), ]) ); patchSuccess = true; return [ newCreateProgram, originalCreateProgram ]; } return node; } } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/patch/transformers/patch-emitter.ts000066400000000000000000000050011472416516200275200ustar00rootroot00000000000000import ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function patchEmitterTransformer(context: ts.TransformationContext) { const { factory } = context; let patchSuccess = false; return (sourceFile: ts.SourceFile) => { if (sourceFile.fileName !== 'src/compiler/watch.ts') throw new Error('Wrong emitter file sent to transformer! This should be unreachable.'); const res = factory.updateSourceFile(sourceFile, ts.visitNodes(sourceFile.statements, visitRootNodes) as unknown as ts.Statement[]); if (!patchSuccess) throw new Error('Failed to patch emitFilesAndReportErrors function!'); return res; function visitRootNodes(node: ts.Statement): ts.VisitResult { if (ts.isFunctionDeclaration(node) && node.name && node.name.getText() === 'emitFilesAndReportErrors') { const newBodyStatements = ts.visitNodes(node.body!.statements, visitEmitterNodes) as unknown as ts.Statement[]; return factory.updateFunctionDeclaration( node, node.modifiers, node.asteriskToken, node.name, node.typeParameters, node.parameters, node.type, factory.updateBlock(node.body!, newBodyStatements) ); } return node; } function visitEmitterNodes(node: ts.Statement): ts.VisitResult { if ( ts.isVariableStatement(node) && node.declarationList.declarations.some( (declaration) => ts.isVariableDeclaration(declaration) && declaration.name.getText() === 'emitResult' ) ) { // tsp.diagnosticMap.set(program, allDiagnostics); const insertedMapSetterNode = factory.createExpressionStatement(factory.createCallExpression( factory.createPropertyAccessExpression( factory.createPropertyAccessExpression( factory.createIdentifier('tsp'), factory.createIdentifier('diagnosticMap') ), factory.createIdentifier('set') ), undefined, [ factory.createIdentifier('program'), factory.createIdentifier('allDiagnostics') ] )); patchSuccess = true; return [ insertedMapSetterNode, node ]; } return node; } }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/slice/000077500000000000000000000000001472416516200216615ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/slice/module-slice.ts000066400000000000000000000033261472416516200246170ustar00rootroot00000000000000import { ModuleFile } from '../module'; import { Position } from '../system'; import semver from 'semver'; import { sliceTs54 } from './ts54'; import { sliceTs55 } from './ts55'; import { sliceTs552 } from './ts552'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface ModuleSlice { moduleFile: ModuleFile firstSourceFileStart: number wrapperPos?: Position bodyPos: Position fileEnd: number sourceFileStarts: [ name: string, position: number ][] bodyWrapper?: { start: string; end: string; } } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function sliceModule(moduleFile: ModuleFile, tsVersion: string) { const baseVersion = semver.coerce(tsVersion, { includePrerelease: false }); if (!baseVersion) throw new Error(`Could not parse TS version: ${tsVersion}`); if (semver.lt(baseVersion, '5.0.0')) { throw new Error(`Cannot patch TS version <5`); } if (semver.lt(baseVersion, '5.5.0')) { return sliceTs54(moduleFile); } if (semver.lt(baseVersion, '5.5.2')) { return sliceTs55(moduleFile); } return sliceTs552(moduleFile); } /** @internal */ export namespace ModuleSlice { export const createError = (msg?: string) => new Error(`Could not recognize TS format during slice!` + (msg ? ` — ${msg}` : '')); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/slice/ts54.ts000066400000000000000000000046241472416516200230360ustar00rootroot00000000000000import { ModuleFile } from '../module'; import { ModuleSlice } from './module-slice'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Slice 5.0 - 5.4 */ export function sliceTs54(moduleFile: ModuleFile): ModuleSlice { let firstSourceFileStart: number; let wrapperStart: number | undefined; let wrapperEnd: number | undefined; let bodyStart: number; let bodyEnd: number; let sourceFileStarts: [ name: string, position: number ][] = []; const { content } = moduleFile; /* Find Wrapper or First File */ let matcher = /^(?:\s*\/\/\s*src\/)|(?:var\s+ts\s*=.+)/gm; const firstMatch = matcher.exec(content); if (!firstMatch?.[0]) throw ModuleSlice.createError(); /* Handle wrapped */ if (firstMatch[0].startsWith('var')) { wrapperStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length + 1; /* Find First File */ matcher = /^\s*\/\/\s*src\//gm; matcher.lastIndex = wrapperStart; const firstFileMatch = matcher.exec(content); if (!firstFileMatch?.[0]) throw ModuleSlice.createError(); firstSourceFileStart = firstFileMatch.index; /* Find Wrapper end */ matcher = /^}\)\(\)\s*;?/gm; matcher.lastIndex = firstFileMatch.index; const wrapperEndMatch = matcher.exec(content); if (!wrapperEndMatch?.[0]) throw ModuleSlice.createError(); bodyEnd = wrapperEndMatch.index - 1; wrapperEnd = wrapperEndMatch.index + wrapperEndMatch[0].length; } /* Handle non-wrapped */ else { firstSourceFileStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length; bodyEnd = content.length; } /* Get Source File Positions */ matcher = /^\s*\/\/\s*(src\/.+)$/gm; matcher.lastIndex = firstSourceFileStart; for (let match = matcher.exec(content); match != null; match = matcher.exec(content)) { sourceFileStarts.push([ match[1], match.index ]); } return { moduleFile, firstSourceFileStart, wrapperPos: wrapperStart != null ? { start: wrapperStart, end: wrapperEnd! } : undefined, fileEnd: content.length, bodyPos: { start: bodyStart, end: bodyEnd }, sourceFileStarts, bodyWrapper: { start: 'var ts = (() => {', end: '})();' } }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/slice/ts55.ts000066400000000000000000000051221472416516200230310ustar00rootroot00000000000000import { ModuleFile } from '../module'; import { ModuleSlice } from './module-slice'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Slice 5.5+ */ export function sliceTs55(moduleFile: ModuleFile): ModuleSlice { let firstSourceFileStart: number; let wrapperStart: number | undefined; let wrapperEnd: number | undefined; let bodyStart: number; let bodyEnd: number; let sourceFileStarts: [ name: string, position: number ][] = []; const { content } = moduleFile; /* Find Wrapper or First File */ let matcher = /^(?:\s*\/\/\s*src\/)|(?:var\s+ts\s*=.+)/gm; const firstMatch = matcher.exec(content); if (!firstMatch?.[0]) throw ModuleSlice.createError(); let bodyWrapper: undefined | { start: string; end: string } = undefined; /* Handle wrapped */ if (firstMatch[0].startsWith('var')) { wrapperStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length + 1; /* Find First File */ matcher = /^\s*\/\/\s*src\//gm; matcher.lastIndex = wrapperStart; const firstFileMatch = matcher.exec(content); if (!firstFileMatch?.[0]) throw ModuleSlice.createError(); firstSourceFileStart = firstFileMatch.index; /* Find Wrapper end */ // TODO - We may later want to find a better approach, but this will work for now matcher = /^}\)\(typeof module !== "undefined" .+$/gm; matcher.lastIndex = firstFileMatch.index; const wrapperEndMatch = matcher.exec(content); if (!wrapperEndMatch?.[0]) throw ModuleSlice.createError(); bodyEnd = wrapperEndMatch.index - 1; wrapperEnd = wrapperEndMatch.index + wrapperEndMatch[0].length; bodyWrapper = { start: firstMatch[0], end: wrapperEndMatch[0] }; } /* Handle non-wrapped */ else { firstSourceFileStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length; bodyEnd = content.length; } /* Get Source File Positions */ matcher = /^\s*\/\/\s*(src\/.+)$/gm; matcher.lastIndex = firstSourceFileStart; for (let match = matcher.exec(content); match != null; match = matcher.exec(content)) { sourceFileStarts.push([ match[1], match.index ]); } return { moduleFile, firstSourceFileStart, wrapperPos: wrapperStart != null ? { start: wrapperStart, end: wrapperEnd! } : undefined, fileEnd: content.length, bodyPos: { start: bodyStart, end: bodyEnd }, sourceFileStarts, bodyWrapper }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/slice/ts552.ts000066400000000000000000000051271472416516200231200ustar00rootroot00000000000000import { ModuleFile } from '../module'; import { ModuleSlice } from './module-slice'; /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Slice 5.5.2+ */ export function sliceTs552(moduleFile: ModuleFile): ModuleSlice { let firstSourceFileStart: number; let wrapperStart: number | undefined; let wrapperEnd: number | undefined; let bodyStart: number; let bodyEnd: number; let sourceFileStarts: [ name: string, position: number ][] = []; const { content } = moduleFile; /* Find Wrapper or First File */ let matcher = /^(?:\s*\/\/\s*src\/)|(?:var\s+ts\s*=.+)/gm; const firstMatch = matcher.exec(content); if (!firstMatch?.[0]) throw ModuleSlice.createError(); let bodyWrapper: undefined | { start: string; end: string } = undefined; /* Handle wrapped */ if (firstMatch[0].startsWith('var')) { wrapperStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length + 1; /* Find First File */ matcher = /^\s*\/\/\s*src\//gm; matcher.lastIndex = wrapperStart; const firstFileMatch = matcher.exec(content); if (!firstFileMatch?.[0]) throw ModuleSlice.createError(); firstSourceFileStart = firstFileMatch.index; /* Find Wrapper end */ // TODO - We may later want to find a better approach, but this will work for now matcher = /^}\)\({ get exports\(\) { return ts; }.+$/gm; matcher.lastIndex = firstFileMatch.index; const wrapperEndMatch = matcher.exec(content); if (!wrapperEndMatch?.[0]) throw ModuleSlice.createError(); bodyEnd = wrapperEndMatch.index - 1; wrapperEnd = wrapperEndMatch.index + wrapperEndMatch[0].length; bodyWrapper = { start: firstMatch[0], end: wrapperEndMatch[0] }; } /* Handle non-wrapped */ else { firstSourceFileStart = firstMatch.index; bodyStart = firstMatch.index + firstMatch[0].length; bodyEnd = content.length; } /* Get Source File Positions */ matcher = /^\s*\/\/\s*(src\/.+)$/gm; matcher.lastIndex = firstSourceFileStart; for (let match = matcher.exec(content); match != null; match = matcher.exec(content)) { sourceFileStarts.push([ match[1], match.index ]); } return { moduleFile, firstSourceFileStart, wrapperPos: wrapperStart != null ? { start: wrapperStart, end: wrapperEnd! } : undefined, fileEnd: content.length, bodyPos: { start: bodyStart, end: bodyEnd }, sourceFileStarts, bodyWrapper }; } // endregion nonara-ts-patch-ba6d37a/projects/core/src/system/000077500000000000000000000000001472416516200221065ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/system/cache.ts000066400000000000000000000027651472416516200235330ustar00rootroot00000000000000import path from 'path'; import * as os from 'os'; import { findCacheDirectory } from '../utils'; import { appRoot, lockFileDir } from '../config'; import fs from 'fs'; /* ****************************************************************************************************************** */ // region: Locals /* ****************************************************************************************************************** */ let cacheRoot: string | undefined; let lockFileRoot: string | undefined; // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getCacheRoot() { if (!cacheRoot) { cacheRoot = process.env.TSP_CACHE_DIR || findCacheDirectory({ name: 'ts-patch', cwd: path.resolve(appRoot, '..') }) || path.join(os.tmpdir(), 'ts-patch'); if (!fs.existsSync(cacheRoot)) fs.mkdirSync(cacheRoot, { recursive: true }); } return cacheRoot; } export function getCachePath(key: string, ...p: string[]) { return path.resolve(getCacheRoot(), key, ...p); } export function getLockFilePath(key: string) { if (!lockFileRoot) { lockFileRoot = path.join(getCacheRoot(), lockFileDir); if (!fs.existsSync(lockFileRoot)) fs.mkdirSync(lockFileRoot, { recursive: true }); } return path.join(getCacheRoot(), lockFileDir, key); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/system/errors.ts000066400000000000000000000026041472416516200237740ustar00rootroot00000000000000/* ******************************************************************************************************************** * Errors Classes * ********************************************************************************************************************/ export class TspError extends Error { } export class WrongTSVersion extends TspError {name = 'WrongTSVersion'} export class FileNotFound extends TspError {name = 'FileNotFound'} export class PackageError extends TspError {name = 'PackageError'} export class PatchError extends TspError {name = 'PatchError'} export class PersistenceError extends TspError {name = 'PersistenceError'} export class OptionsError extends TspError {name = 'OptionsError'} export class NPMError extends TspError {name = 'NPMError'} export class RestoreError extends TspError { constructor(public filename: string, message: string) { super(`Error restoring: ${filename}${message ? ' - ' + message : ''}`); this.name = 'RestoreError'; } } export class BackupError extends TspError { constructor(public filename: string, message: string) { super(`Error backing up ${filename}${message ? ' - ' + message : ''}`); this.name = 'BackupError'; } } export class FileWriteError extends TspError { constructor(public filename: string, message?: string) { super(`Error while trying to write to ${filename}${message ? `: ${message}` : ''}`); } } nonara-ts-patch-ba6d37a/projects/core/src/system/index.ts000066400000000000000000000001461472416516200235660ustar00rootroot00000000000000export * from './cache'; export * from './errors'; export * from './logger'; export * from './types'; nonara-ts-patch-ba6d37a/projects/core/src/system/logger.ts000066400000000000000000000034421472416516200237400ustar00rootroot00000000000000import chalk from 'chalk'; import stripAnsi from 'strip-ansi'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export enum LogLevel { system = 0, normal = 1, verbose = 2, } export type Logger = (msg: string | [ string, string ], logLevel?: LogLevel) => void; // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function createLogger(logLevel: LogLevel, useColour: boolean = true, isSilent: boolean = false): Logger { return function log(msg: string | [ string, string ], msgLogLevel: LogLevel = LogLevel.normal) { if (isSilent || msgLogLevel > logLevel) return; /* Handle Icon */ const printIcon = (icon: string) => chalk.bold.cyanBright(`[${icon}] `); let icon: string = ''; if (Array.isArray(msg)) { icon = msg[0]; // @formatter:off msg = (icon === '!') ? printIcon(chalk.bold.yellow(icon)) + chalk.yellow(msg[1]) : (icon === '~') ? printIcon(chalk.bold.cyanBright(icon)) + msg[1] : (icon === '=') ? printIcon(chalk.bold.greenBright(icon)) + msg[1] : (icon === '+') ? printIcon(chalk.bold.green(icon)) + msg[1] : (icon === '-') ? printIcon(chalk.bold.white(icon)) + msg[1] : msg[1]; // @formatter:on } /* Print message */ const isError = (icon === '!'); msg = !useColour ? stripAnsi(msg) : msg; (isError ? console.error : console.log)(msg); } } // endregion nonara-ts-patch-ba6d37a/projects/core/src/system/types.ts000066400000000000000000000005171472416516200236250ustar00rootroot00000000000000 /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface Position { start: number end: number } // endregion nonara-ts-patch-ba6d37a/projects/core/src/ts-package.ts000066400000000000000000000055301472416516200231540ustar00rootroot00000000000000import fs from 'fs'; import path from 'path'; import resolve from 'resolve'; import { PackageError } from './system'; import { TsModule } from './module'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface TsPackage { majorVer: number minorVer: number version: string packageFile: string packageDir: string cacheDir: string libDir: string moduleNames: TsModule.Name[] /** @internal */ moduleCache: Map getModulePath: (name: TsModule.Name) => string } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Get TypeScript package info - Resolve from dir, throws if not cannot find TS package */ export function getTsPackage(dir: string = process.cwd()): TsPackage { if (!fs.existsSync(dir)) throw new PackageError(`${dir} is not a valid directory`); const possiblePackageDirs = [ dir, () => path.dirname(resolve.sync(`typescript/package.json`, { basedir: dir })) ]; for (const d of possiblePackageDirs) { let packageDir: string; try { packageDir = typeof d === 'function' ? d() : d; } catch { break; } /* Parse package.json data */ const packageFile = path.join(packageDir, 'package.json'); if (!fs.existsSync(packageFile)) continue; const { name, version } = (() => { try { return JSON.parse(fs.readFileSync(packageFile, 'utf8')); } catch (e) { throw new PackageError(`Could not parse json data in ${packageFile}`); } })(); /* Validate */ if (name === 'typescript') { const [ sMajor, sMinor ] = version.split('.') const libDir = path.join(packageDir, 'lib'); const cacheDir = path.resolve(packageDir, '../.tsp/cache/'); /* Get all available module names in libDir */ const moduleNames: TsModule.Name[] = []; for (const fileName of fs.readdirSync(libDir)) if ((TsModule.names).includes(fileName)) moduleNames.push(fileName as TsModule.Name); const res: TsPackage = { version, majorVer: +sMajor, minorVer: +sMinor, packageFile, packageDir, moduleNames, cacheDir, libDir, moduleCache: new Map(), getModulePath: (moduleName: TsModule.Name) => { return path.join(libDir, moduleName as string); } } return res; } } throw new PackageError(`Could not find typescript package from ${dir}`); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/utils/000077500000000000000000000000001472416516200217225ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/core/src/utils/file-utils.ts000066400000000000000000000061171472416516200243540ustar00rootroot00000000000000import path from 'path'; import fs from 'fs'; import { getTsPackage } from '../ts-package'; import { getLockFilePath, PackageError } from '../system'; import { getHash } from './general'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const lockFileWaitMs = 2_000; // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function waitForLockRelease(lockFilePath: string) { const start = Date.now(); while (fs.existsSync(lockFilePath)) { sleep(100); if ((Date.now() - start) > lockFileWaitMs) throw new Error( `Could not acquire lock to write file. If problem persists, run ts-patch clear-cache and try again. `); } function sleep(ms: number) { const wakeUpTime = Date.now() + ms; while (Date.now() < wakeUpTime) {} } } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ /** * Attempts to locate global installation of TypeScript */ export function getGlobalTsDir() { const errors = []; const dir = require('global-prefix'); const check = (dir: string) => { try { return getTsPackage(dir) } catch (e) { errors.push(e); return {}; } }; const { packageDir } = (check(dir) || check(path.join(dir, 'lib'))); if (!packageDir) throw new PackageError(`Could not find global TypeScript installation! Are you sure it's installed globally?`); return packageDir; } export const mkdirIfNotExist = (dir: string) => !fs.existsSync(dir) && fs.mkdirSync(dir, { recursive: true }); export function withFileLock(filePath: string, fn: () => T): T { const lockFileName = getHash(filePath) + '.lock'; const lockFilePath = getLockFilePath(lockFileName); try { const lockFileDir = path.dirname(lockFilePath); if (!fs.existsSync(lockFileDir)) fs.mkdirSync(lockFileDir, { recursive: true }); waitForLockRelease(lockFilePath); fs.writeFileSync(lockFilePath, ''); return fn(); } finally { if (fs.existsSync(lockFilePath)) fs.rmSync(lockFilePath, { force: true }); } } export function writeFileWithLock(filePath: string, content: string): void { withFileLock(filePath, () => { fs.writeFileSync(filePath, content); }); } export function readFileWithLock(filePath: string): string { return withFileLock(filePath, () => { return fs.readFileSync(filePath, 'utf8'); }); } export function copyFileWithLock(src: string, dest: string): void { withFileLock(src, () => { withFileLock(dest, () => { fs.copyFileSync(src, dest); }); }); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/utils/find-cache-dir.ts000066400000000000000000000103341472416516200250300ustar00rootroot00000000000000/** * @credit https://github.com/sindresorhus/find-cache-di * @license MIT * @author Sindre Sorhus * @author James Talmage * * MIT License * * Copyright (c) Sindre Sorhus (https://sindresorhus.com) * Copyright (c) James Talmage (https://github.com/jamestalmage) * * 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. */ import process from 'node:process'; import path from 'node:path'; import fs from 'node:fs'; /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface FindCacheDirOptions { name: string; cwd?: string; // Default: process.cwd() create?: boolean; // Default: false } // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ const isWritable = (path: string) => { try { fs.accessSync(path, fs.constants.W_OK); return true; } catch { return false; } }; function useDirectory(directory: string, options: any) { if (options.create) { fs.mkdirSync(directory, { recursive: true }); } return directory; } function getNodeModuleDirectory(directory: string) { const nodeModules = path.join(directory, 'node_modules'); if ( !isWritable(nodeModules) && (fs.existsSync(nodeModules) || !isWritable(path.join(directory))) ) { return; } return nodeModules; } function findNearestPackageDir(startPath: string): string | null { const visitedDirs = new Set(); let currentPath = path.resolve(startPath); while (true) { const packageJsonPath = path.join(currentPath, 'package.json'); if (fs.existsSync(packageJsonPath)) { return path.dirname(packageJsonPath); } // Mark the current directory as visited visitedDirs.add(currentPath); // Move to the parent directory const parentPath = path.dirname(currentPath); // Check for a circular loop if (visitedDirs.has(parentPath) || parentPath === currentPath) { return null; } currentPath = parentPath; } } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function findCacheDirectory(options: FindCacheDirOptions) { /* Use ENV Cache Dir if present */ if (process.env.CACHE_DIR && ![ 'true', 'false', '1', '0' ].includes(process.env.CACHE_DIR)) return useDirectory(path.join(process.env.CACHE_DIR, options.name), options); /* Find Package Dir */ const startDir = options.cwd || process.cwd(); const pkgDir = findNearestPackageDir(startDir); if (!pkgDir) return undefined; /* Find Node Modules Dir */ const nodeModules = getNodeModuleDirectory(pkgDir); if (!nodeModules) return undefined; return useDirectory(path.join(pkgDir, 'node_modules', '.cache', options.name), options); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/utils/general.ts000066400000000000000000000015031472416516200237060ustar00rootroot00000000000000import crypto from "crypto"; /* ****************************************************************************************************************** */ // region: Type Utils /* ****************************************************************************************************************** */ /** * Make certain properties partial */ export type PartialSome = Omit & Pick, K> // endregion /* ****************************************************************************************************************** */ // region: Crypto Utils /* ****************************************************************************************************************** */ export function getHash(fileContent: string) { return crypto.createHash('md5').update(fileContent).digest('hex'); } // endregion nonara-ts-patch-ba6d37a/projects/core/src/utils/index.ts000066400000000000000000000001331472416516200233760ustar00rootroot00000000000000export * from './general'; export * from './file-utils'; export * from './find-cache-dir'; nonara-ts-patch-ba6d37a/projects/core/tsconfig.json000066400000000000000000000005531472416516200225050ustar00rootroot00000000000000{ "extends" : "../../tsconfig.base.json", "include" : [ "shared", "src" ], "compilerOptions" : { "rootDirs" : [ "src", "shared" ], "outDir" : "../../dist", "sourceMap" : true, "composite" : true, "declaration" : true, "plugins" : [ { "transform" : "./plugin.ts", "transformProgram" : true } ] } } nonara-ts-patch-ba6d37a/projects/patch/000077500000000000000000000000001472416516200201425ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/patch/package.json000066400000000000000000000002241472416516200224260ustar00rootroot00000000000000{ "name": "@tsp/patch", "version": "0.0.0", "private": true, "dependencies": { "typescript": "link:../../node_modules/typescript" } } nonara-ts-patch-ba6d37a/projects/patch/plugin.ts000066400000000000000000000114721472416516200220150ustar00rootroot00000000000000import type * as ts from 'typescript' import type { ProgramTransformerExtras } from 'ts-patch'; import * as fs from 'fs'; import * as path from 'path'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const srcTypesFileName = path.resolve(__dirname, '../core/shared/plugin-types.ts'); const destTypesFileName = path.resolve(__dirname, 'src/types/plugin-types.ts'); // endregion /* ****************************************************************************************************************** */ // region: Transformers /* ****************************************************************************************************************** */ function transformPatchDeclarationsFile(this: typeof ts, ctx: ts.TransformationContext) { const { factory } = ctx; const moduleName = factory.createIdentifier('ts'); return (sourceFile: ts.SourceFile) => { const statements = sourceFile .statements .filter(node => this.isModuleDeclaration(node) && this.getJSDocTags(node).some(t => t.tagName.text === 'build-types') ) .map((node: ts.ModuleDeclaration) => factory.updateModuleDeclaration(node, node.modifiers, moduleName, node.body) ); return factory.updateSourceFile( sourceFile, statements, sourceFile.isDeclarationFile ); } } function transformPluginTypes(this: typeof ts, ctx: ts.TransformationContext) { const { factory } = ctx; return (sourceFile: ts.SourceFile) => { const moduleDeclaration = factory.createModuleDeclaration( [ factory.createModifier(this.SyntaxKind.DeclareKeyword) ], factory.createIdentifier('tsp'), factory.createModuleBlock( sourceFile .statements // TODO - remove the casting once we have tsei again .filter(node => (this).isDeclaration(node) && this.getCombinedModifierFlags(node as unknown as ts.Declaration)) ), // TODO - remove the casting once we have tsei again this.NodeFlags.Namespace | this.NodeFlags.ExportContext | (this.NodeFlags).Ambient | this.NodeFlags.ContextFlags ); return factory.updateSourceFile(sourceFile, [ moduleDeclaration ]); } } // endregion /* ****************************************************************************************************************** * * Program Transformer - Build and insert plugin-types.ts * ****************************************************************************************************************** */ export function transformProgram( program: ts.Program, host: ts.CompilerHost, opt: any, { ts }: ProgramTransformerExtras ) { host ??= ts.createCompilerHost(program.getCompilerOptions(), true); const printer = ts.createPrinter({ removeComments: true, newLine: ts.NewLineKind.LineFeed }); // TODO - remove the casting once we have tsei again const srcFileName = (ts).normalizePath(srcTypesFileName); const destFileName = (ts).normalizePath(destTypesFileName); hookWriteFile(); generatePluginTypesAndInjectToProgram(); return ts.createProgram( program.getRootFileNames().concat([ destFileName ]), program.getCompilerOptions(), host, program ); function hookWriteFile() { const originalWriteFile = host.writeFile; host.writeFile = (fileName: string, data: string, ...args: any[]) => { /* Transform declarations */ if (/module-patch.d.ts$/.test(fileName)) { let sourceFile = ts.createSourceFile(fileName, data, ts.ScriptTarget.ES2016, true, ts.ScriptKind.TS); sourceFile = ts.transform(sourceFile, [ transformPatchDeclarationsFile.bind(ts) ]).transformed[0]; return (originalWriteFile)(fileName, printer.printFile(sourceFile), ...args); } /* Strip comments from js */ if (/module-patch.js$/.test(fileName)) { /* Wrap file in closure */ data = `var tsp = (function() {\n${data}\nreturn tsp;})();`; const sourceFile = ts.createSourceFile(fileName, data, ts.ScriptTarget.ES2016, false, ts.ScriptKind.JS); return (originalWriteFile)(fileName, printer.printFile(sourceFile), ...args); } return (originalWriteFile)(fileName, data, ...args); } } function generatePluginTypesAndInjectToProgram() { let sourceFile = ts.createSourceFile(srcFileName, fs.readFileSync(srcFileName, 'utf8'), ts.ScriptTarget.ES2015, true); sourceFile = ts.transform(sourceFile, [ transformPluginTypes.bind(ts) ]).transformed[0]; const moduleBody = `// @ts-nocheck\n/** AUTO-GENERATED - DO NOT EDIT */\n\n/** @build-types */\n` + printer.printFile(sourceFile); fs.writeFileSync(destFileName, moduleBody); } } nonara-ts-patch-ba6d37a/projects/patch/src/000077500000000000000000000000001472416516200207315ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/patch/src/plugin/000077500000000000000000000000001472416516200222275ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/patch/src/plugin/esm-intercept.ts000066400000000000000000000102371472416516200253610ustar00rootroot00000000000000namespace tsp { const Module = require('module'); const path = require('path'); const fs = require('fs'); const crypto = require('crypto'); /* ********************************************************* */ // region: Helpers /* ********************************************************* */ function getEsmLibrary() { try { return require('esm') as typeof import('esm'); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') throw new TsPatchError( `Plugin is an ESM module. To enable experimental ESM support, ` + `install the 'esm' package as a (dev)-dependency or global.` ); else throw e; } } // endregion /* ********************************************************* */ // region: Utils /* ********************************************************* */ export function registerEsmIntercept(registerConfig: RegisterConfig): () => void { const originalRequire = Module.prototype.require; const builtFiles = new Map(); const getHash = () => { let hash: string; do { hash = crypto.randomBytes(16).toString('hex'); } while (builtFiles.has(hash)); return hash; } /* Create cleanup function */ const cleanup = () => { /* Cleanup temp ESM files */ for (const { 1: filePath } of builtFiles) { delete require.cache[filePath]; try { fs.rmSync(filePath, { force: true, maxRetries: 3 }); } catch (e) { if (process.env.NODE_ENV !== 'production') console.warn(`[ts-patch] Warning: Failed to delete temporary esm cache file: ${filePath}.`); } } builtFiles.clear(); Module.prototype.require = originalRequire; } /* Set Hooks */ try { Module.prototype.require = wrappedRequire; } catch (e) { cleanup(); } /* ********************************************************* * * Helpers * ********************************************************* */ function wrappedRequire(this: unknown, request: string) { try { return originalRequire.apply(this, arguments); } catch (e) { if (e.code === 'ERR_REQUIRE_ESM') { const resolvedPath = Module._resolveFilename(request, this, false); const resolvedPathExt = path.extname(resolvedPath); if (Module._cache[resolvedPath]) return Module._cache[resolvedPath].exports; /* Compile TS */ let targetFilePath: string; if (tsExtensions.includes(resolvedPathExt)) { if (!builtFiles.has(resolvedPath)) { const tsCode = fs.readFileSync(resolvedPath, 'utf8'); // NOTE - I don't know why, but if you supply a *.ts file to tsNode.compile it will be output as cjs, // regardless of the tsConfig properly specifying ESNext for module and target. Notably, this issue seems // to have started with TS v5.5, // // To work around, we will tell ts-node that it's an "mts" file. const newPath = resolvedPath.replace(/\.ts$/, '.mts'); const jsCode = registerConfig.tsNodeInstance!.compile(tsCode, newPath); const outputFileName = getHash() + '.mjs'; const outputFilePath = path.join(getTmpDir('esm'), outputFileName); fs.writeFileSync(outputFilePath, jsCode, 'utf8'); builtFiles.set(resolvedPath, outputFilePath); targetFilePath = outputFilePath; } else { targetFilePath = builtFiles.get(resolvedPath)!; } } else { targetFilePath = resolvedPath; } /* Setup new module */ const newModule = new Module(request, this); newModule.filename = resolvedPath; newModule.paths = Module._nodeModulePaths(resolvedPath); /* Add to cache */ Module._cache[resolvedPath] = newModule; /* Load with ESM library */ const res = getEsmLibrary()(newModule)(targetFilePath); newModule.filename = resolvedPath; return res; } throw e; } } return cleanup; } // endregion } nonara-ts-patch-ba6d37a/projects/patch/src/plugin/plugin-creator.ts000066400000000000000000000204371472416516200255400ustar00rootroot00000000000000namespace tsp { const crypto = require('crypto'); /* ********************************************************* */ // region: Types /* ********************************************************* */ /** @internal */ interface CreateTransformersFromPatternOptions { factory: PluginFactory; config: PluginConfig; registerConfig: RegisterConfig; program: tsShim.Program; ls?: tsShim.LanguageService; } export namespace PluginCreator { export interface Options { resolveBaseDir: string; } } // endregion /* ********************************************************* */ // region: Helpers /* ********************************************************* */ function createTransformersFromPattern(opt: CreateTransformersFromPatternOptions): TransformerBasePlugin { const { factory, config, program, ls, registerConfig } = opt; const { transform, after, afterDeclarations, name, type, transformProgram, ...cleanConfig } = config; if (!transform) throw new TsPatchError('Not a valid config entry: "transform" key not found'); // @formatter:off const transformerKind = after ? 'after' : afterDeclarations ? 'afterDeclarations' : 'before'; // @formatter:on let pluginFactoryResult: TransformerPlugin; switch (config.type) { case 'ls': if (!ls) throw new TsPatchError(`Plugin ${transform} needs a LanguageService`); pluginFactoryResult = (factory as LSPattern)(ls, cleanConfig); break; case 'config': pluginFactoryResult = (factory as ConfigPattern)(cleanConfig); break; case 'compilerOptions': pluginFactoryResult = (factory as CompilerOptionsPattern)(program.getCompilerOptions(), cleanConfig); break; case 'checker': pluginFactoryResult = (factory as TypeCheckerPattern)(program.getTypeChecker(), cleanConfig); break; case undefined: case 'program': const { addDiagnostic, removeDiagnostic, diagnostics } = diagnosticExtrasFactory(program); pluginFactoryResult = (factory as ProgramPattern)(program, cleanConfig, { ts: tsp.getTsInstance(), addDiagnostic, removeDiagnostic, diagnostics, library: tsp.currentLibrary }); break; case 'raw': pluginFactoryResult = (ctx: tsShim.TransformationContext) => (factory as RawPattern)(ctx, program, cleanConfig); break; default: throw new TsPatchError(`Invalid plugin type found in tsconfig.json: '${config.type}'`); } /* Extract factories */ let transformerFactories: TsTransformerFactory[]; // noinspection FallThroughInSwitchStatementJS switch (typeof pluginFactoryResult) { // Single transformer factory case 'function': transformerFactories = [ pluginFactoryResult ]; break; // TransformerBasePlugin case 'object': const factoryOrFactories = pluginFactoryResult[transformerKind]; // Single transformer factory if (typeof factoryOrFactories === 'function') { transformerFactories = [ pluginFactoryResult[transformerKind] ]; break; } // Array of transformer factories else if (Array.isArray(factoryOrFactories)) { transformerFactories = [ ...factoryOrFactories ]; break; } // Deliberate fall-through default: throw new TsPatchError(`Invalid plugin result: expected a function or an object with a '${transformerKind}' property`); } /* Wrap factories */ const wrappedFactories: TsTransformerFactory[] = []; for (const transformerFactory of transformerFactories) { if (!transformerFactory || typeof transformerFactory !== 'function') throw new TsPatchError( `Invalid plugin entry point! Expected a transformer factory function or an object with a '${transformerKind}' property` ); /* Wrap w/ register */ const wrapper = wrapTransformerFactory(transformerFactory, registerConfig, true); wrappedFactories.push(wrapper); } const res: TransformerBasePlugin = { [transformerKind]: wrappedFactories }; return res; } function wrapTransformerFactory( transformerFn: TsTransformerFactory, requireConfig: RegisterConfig, wrapInnerFunction: boolean ): TsTransformerFactory { const wrapper: TsTransformerFactory = function tspWrappedFactory(...args: any[]) { let res: any; try { registerPlugin(requireConfig); if (!wrapInnerFunction) { res = (transformerFn as Function)(...args); } else { const resFn = (transformerFn as Function)(...args); if (typeof resFn !== 'function') throw new TsPatchError('Invalid plugin: expected a function'); res = wrapTransformerFactory(resFn, requireConfig, false); } } finally { unregisterPlugin(); } return res; } return wrapper; } // endregion /* ********************************************************* * * PluginCreator (Class) * ********************************************************* */ export class PluginCreator { public readonly plugins: TspPlugin[] = []; public readonly options: PluginCreator.Options; public readonly needsTscJsDocParsing: boolean; private readonly configs: PluginConfig[]; constructor(configs: PluginConfig[], options: PluginCreator.Options) { this.configs = configs; this.options = options; const { resolveBaseDir } = options; /* Create plugins */ this.plugins = configs .filter(config => config.transform !== undefined) .map(config => new TspPlugin(config, { resolveBaseDir })); /* Check if we need to parse all JSDoc comments */ this.needsTscJsDocParsing = this.plugins.some(plugin => plugin.packageConfig?.tscOptions?.parseAllJsDoc === true); } private mergeTransformers(into: TransformerList, source: tsShim.CustomTransformers | TransformerBasePlugin) { const slice = (input: T | T[]) => (Array.isArray(input) ? input.slice() : [ input ]); if (source.before) into.before.push(...slice(source.before)); if (source.after) into.after.push(...slice(source.after)); if (source.afterDeclarations) into.afterDeclarations.push(...slice(source.afterDeclarations)); return this; } public createSourceTransformers( params: { program: tsShim.Program } | { ls: tsShim.LanguageService }, customTransformers?: tsShim.CustomTransformers ): TransformerList { const transformers: TransformerList = { before: [], after: [], afterDeclarations: [] }; const [ ls, program ] = ('ls' in params) ? [ params.ls, params.ls.getProgram()! ] : [ void 0, params.program ]; for (const plugin of this.plugins) { if (plugin.kind !== 'SourceTransformer') continue; const { config } = plugin; const createFactoryResult = plugin.createFactory(); if (!createFactoryResult) continue; const { factory, registerConfig } = createFactoryResult; this.mergeTransformers( transformers, createTransformersFromPattern({ factory: factory as PluginFactory, registerConfig, config, program, ls }) ); } // Chain custom transformers at the end if (customTransformers) this.mergeTransformers(transformers, customTransformers); return transformers; } public createProgramTransformers(): Map { const res = new Map(); for (const plugin of this.plugins) { if (plugin.kind !== 'ProgramTransformer') continue; const { config } = plugin; const createFactoryResult = plugin.createFactory(); if (createFactoryResult === undefined) continue; const { registerConfig, factory: unwrappedFactory } = createFactoryResult; const factory = wrapTransformerFactory(unwrappedFactory as ProgramTransformer, registerConfig, false); const transformerKey = crypto .createHash('md5') .update(JSON.stringify({ factory, config })) .digest('hex'); res.set(transformerKey, [ factory, config ]); } return res; } } } nonara-ts-patch-ba6d37a/projects/patch/src/plugin/plugin.ts000066400000000000000000000144271472416516200241050ustar00rootroot00000000000000namespace tsp { const path = require('path'); const fs = require('fs'); const requireStack: string[] = []; /* ****************************************************** */ // region: Types /* ****************************************************** */ export namespace TspPlugin { export interface CreateOptions { resolveBaseDir: string } export type Kind = 'SourceTransformer' | 'ProgramTransformer' } // endregion /* ****************************************************** */ // region: Helpers /* ****************************************************** */ // Could likely fail if the plugin is in a symlinked directory or the package's main file is in a // directory above the package.json – however, I believe that the walking up method used here is the common // approach, so we'll consider these acceptable edge cases for now. function getPackagePath(entryFilePath: string): string | undefined { let currentDir = path.dirname(entryFilePath); const seenPaths = new Set(); while (currentDir !== path.parse(currentDir).root) { if (seenPaths.has(currentDir)) return undefined; seenPaths.add(currentDir); const potentialPkgPath = path.join(currentDir, 'package.json'); if (fs.existsSync(potentialPkgPath)) return potentialPkgPath; currentDir = path.resolve(currentDir, '..'); } return undefined; } // endregion /* ****************************************************** */ // region: TspPlugin /* ****************************************************** */ export class TspPlugin { public readonly config: PluginConfig; public readonly tsConfigPath: string | undefined; public readonly entryFilePath: string; public readonly importKey: string; public readonly packageConfig: PluginPackageConfig | undefined; public readonly kind: TspPlugin.Kind; private readonly _createOptions: TspPlugin.CreateOptions; constructor(config: PluginConfig, createOptions: TspPlugin.CreateOptions) { this.config = { ...config }; this.validateConfig(); this._createOptions = createOptions; this.importKey = config.import || 'default'; this.kind = config.transformProgram === true ? 'ProgramTransformer' : 'SourceTransformer'; const { resolveBaseDir } = createOptions; const configTransformValue = config.transform!; /* Resolve paths */ this.tsConfigPath = config.tsConfig && path.resolve(resolveBaseDir, config.tsConfig); const entryFilePath = require.resolve(configTransformValue, { paths: [ resolveBaseDir ] }); this.entryFilePath = entryFilePath; /* Get module PluginPackageConfig */ let pluginPackageConfig: PluginPackageConfig | undefined; const modulePackagePath = getPackagePath(entryFilePath); if (modulePackagePath) { const modulePkgJsonContent = fs.readFileSync(modulePackagePath, 'utf8'); const modulePkgJson = JSON.parse(modulePkgJsonContent) as { tsp?: PluginPackageConfig }; pluginPackageConfig = modulePkgJson.tsp; if (pluginPackageConfig === null || typeof pluginPackageConfig !== 'object') pluginPackageConfig = undefined; } this.packageConfig = pluginPackageConfig; } private validateConfig() { const { config } = this; const configTransformValue = config.transform; if (!configTransformValue) throw new TsPatchError(`Invalid plugin config: missing "transform" value`); if (config.resolvePathAliases && !config.tsConfig) { console.warn(`[ts-patch] Warning: resolvePathAliases needs a tsConfig value pointing to a tsconfig.json for transformer" ${configTransformValue}.`); } } createFactory() { const { entryFilePath, config, tsConfigPath, importKey } = this; const configTransformValue = config.transform!; /* Prevent circular require */ if (requireStack.includes(entryFilePath)) return; requireStack.push(entryFilePath); /* Check if ESM */ let isEsm: boolean | undefined = config.isEsm; if (isEsm == null) { const impliedModuleFormat = tsShim.getImpliedNodeFormatForFile( entryFilePath as tsShim.Path, undefined, tsShim.sys, { moduleResolution: tsShim.ModuleResolutionKind.Node16 } ); isEsm = impliedModuleFormat === tsShim.ModuleKind.ESNext; } const isTs = configTransformValue.match(/\.[mc]?ts$/) != null; const registerConfig: RegisterConfig = { isTs, isEsm, tsConfig: tsConfigPath, pluginConfig: config }; registerPlugin(registerConfig); try { /* Load plugin */ const commonjsModule = loadEntryFile(); const factoryModule = (typeof commonjsModule === 'function') ? { default: commonjsModule } : commonjsModule; const factory = factoryModule[importKey]; if (!factory) throw new TsPatchError( `tsconfig.json > plugins: "${configTransformValue}" does not have an export "${importKey}": ` + require('util').inspect(factoryModule) ); if (typeof factory !== 'function') { throw new TsPatchError( `tsconfig.json > plugins: "${configTransformValue}" export "${importKey}" is not a plugin: ` + require('util').inspect(factory) ); } return { factory, registerConfig: registerConfig }; } finally { requireStack.pop(); unregisterPlugin(); } function loadEntryFile(): PluginFactory | { [key: string]: PluginFactory } { /* Load plugin */ let res: PluginFactory | { [key: string]: PluginFactory } try { res = require(entryFilePath); } catch (e) { if (e.code === 'ERR_REQUIRE_ESM') { if (!registerConfig.isEsm) { unregisterPlugin(); registerConfig.isEsm = true; registerPlugin(registerConfig); return loadEntryFile(); } else { throw new TsPatchError( `Cannot load ESM transformer "${configTransformValue}" from "${entryFilePath}". Please file a bug report` ); } } else throw e; } return res; } } } // endregion } // endregion nonara-ts-patch-ba6d37a/projects/patch/src/plugin/register-plugin.ts000066400000000000000000000077761472416516200257400ustar00rootroot00000000000000/// namespace tsp { const path = require('path'); let configStack: RegisterConfig[] = []; /* ********************************************************* */ // region: Types /* ********************************************************* */ /** @internal */ export interface RegisterConfig { tsNodeInstance?: import('ts-node').Service tsConfigPathsCleanup?: () => void esmInterceptCleanup?: () => void isTs: boolean pluginConfig: PluginConfig isEsm: boolean tsConfig: string | undefined compilerOptions?: tsShim.CompilerOptions } // endregion /* ********************************************************* */ // region: Helpers /* ********************************************************* */ function getTsNode() { try { return require('ts-node') as typeof import('ts-node'); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') throw new TsPatchError( `Cannot use a typescript-based transformer without ts-node installed. `+ `Add ts-node as a (dev)-dependency or install globally.` ); else throw e; } } function getTsConfigPaths() { try { return require('tsconfig-paths') as typeof import('tsconfig-paths'); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') throw new TsPatchError( `resolvePathAliases requires the library: tsconfig-paths. `+ `Add tsconfig-paths as a (dev)-dependency or install globally.` ); else throw e; } } function getCompilerOptions(tsConfig: string) { const configFile = tsShim.readConfigFile(tsConfig, tsShim.sys.readFile); const parsedConfig = configFile && tsShim.parseJsonConfigFileContent( configFile.config, tsShim.sys, path.dirname(tsConfig) ); return parsedConfig.options; } // endregion /* ********************************************************* */ // region: Utils /* ********************************************************* */ export function unregisterPlugin() { const activeRegisterConfig = configStack.pop()!; if (activeRegisterConfig.tsConfigPathsCleanup) { activeRegisterConfig.tsConfigPathsCleanup(); delete activeRegisterConfig.tsConfigPathsCleanup; } if (activeRegisterConfig.tsNodeInstance) { activeRegisterConfig.tsNodeInstance.enabled(false); } if (activeRegisterConfig.esmInterceptCleanup) { activeRegisterConfig.esmInterceptCleanup(); delete activeRegisterConfig.esmInterceptCleanup; } } export function registerPlugin(registerConfig: RegisterConfig) { if (!registerConfig) throw new TsPatchError('requireConfig is required'); configStack.push(registerConfig); const { isTs, isEsm, tsConfig, pluginConfig } = registerConfig; /* Register ESM */ if (isEsm) { registerConfig.esmInterceptCleanup = registerEsmIntercept(registerConfig); } /* Register tsNode */ if (isTs) { const tsNode = getTsNode(); let tsNodeInstance: import('ts-node').Service; if (registerConfig.tsNodeInstance) { tsNodeInstance = registerConfig.tsNodeInstance; tsNode.register(tsNodeInstance); } else { tsNodeInstance = tsNode.register({ transpileOnly: true, ...(tsConfig ? { project: tsConfig } : { skipProject: true }), compilerOptions: { target: isEsm ? 'ESNext' : 'ES2018', jsx: 'react', esModuleInterop: true, module: isEsm ? 'ESNext' : 'commonjs', } }); } tsNodeInstance.enabled(true); registerConfig.tsNodeInstance = tsNodeInstance; } /* Register tsconfig-paths */ if (tsConfig && pluginConfig.resolvePathAliases) { registerConfig.compilerOptions ??= getCompilerOptions(tsConfig); const { paths, baseUrl } = registerConfig.compilerOptions; if (paths && baseUrl) { registerConfig.tsConfigPathsCleanup = getTsConfigPaths().register({ baseUrl, paths }); } } } // endregion } nonara-ts-patch-ba6d37a/projects/patch/src/shared.ts000066400000000000000000000035411472416516200225520ustar00rootroot00000000000000namespace tsp { const os = require('os'); const path = require('path'); const fs = require('fs'); /* ********************************************************* */ // region: Vars /* ********************************************************* */ export const diagnosticMap: tsp.DiagnosticMap = new WeakMap(); /** Injected during patch — library name minus extension */ export declare const currentLibrary: string; export const supportedExtensions = [ '.ts', '.mts', '.cts', '.js', '.mjs', '.cjs' ]; export const tsExtensions = [ '.ts', '.mts', '.cts' ]; // endregion /* ********************************************************* */ // region: Utils /* ********************************************************* */ /** @internal */ export function diagnosticExtrasFactory(program: tsShim.Program) { const diagnostics = diagnosticMap.get(program) || diagnosticMap.set(program, []).get(program)!; const addDiagnostic = (diag: tsShim.Diagnostic): number => diagnostics.push(diag); const removeDiagnostic = (index: number) => { diagnostics.splice(index, 1) }; return { addDiagnostic, removeDiagnostic, diagnostics }; } /** @internal */ export function getTmpDir(subPath?: string) { const tmpDir = path.resolve(os.tmpdir(), 'tsp', subPath); if (!fs.existsSync(tmpDir)) fs.mkdirSync(tmpDir, { recursive: true }); return tmpDir; } /** @internal */ export function getTsInstance() { return (typeof ts !== 'undefined' ? ts : module.exports) as typeof import('typescript'); } // endregion /* ********************************************************* */ // region: Other /* ********************************************************* */ export class TsPatchError extends Error { constructor(message: string, public diagnostic?: tsShim.Diagnostic) { super(message); } } // endregion } nonara-ts-patch-ba6d37a/projects/patch/src/ts/000077500000000000000000000000001472416516200213575ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/patch/src/ts/create-program.ts000066400000000000000000000132501472416516200246400ustar00rootroot00000000000000namespace tsp { const activeProgramTransformers = new Set(); const { dirname } = require('path'); /* ********************************************************* */ // region: Helpers /* ********************************************************* */ function getProjectDir(compilerOptions: tsShim.CompilerOptions) { return compilerOptions.configFilePath && dirname(compilerOptions.configFilePath); } function getProjectConfig(compilerOptions: tsShim.CompilerOptions, rootFileNames: ReadonlyArray) { let configFilePath = compilerOptions.configFilePath; let projectDir = getProjectDir(compilerOptions); if (configFilePath === undefined) { const baseDir = (rootFileNames.length > 0) ? dirname(rootFileNames[0]) : projectDir ?? process.cwd(); configFilePath = tsShim.findConfigFile(baseDir, tsShim.sys.fileExists); if (configFilePath) { const config = readConfig(configFilePath); compilerOptions = { ...config.options, ...compilerOptions }; projectDir = getProjectDir(compilerOptions); } } return ({ projectDir, compilerOptions }); } function readConfig(configFileNamePath: string) { const projectDir = dirname(configFileNamePath); const result = tsShim.readConfigFile(configFileNamePath, tsShim.sys.readFile); if (result.error) throw new TsPatchError('Error in tsconfig.json: ' + result.error.messageText); return tsShim.parseJsonConfigFileContent(result.config, tsShim.sys, projectDir, undefined, configFileNamePath); } function preparePluginsFromCompilerOptions(plugins: any): PluginConfig[] { if (!plugins) return []; // Old transformers system if ((plugins.length === 1) && plugins[0].customTransformers) { const { before = [], after = [] } = (plugins[0].customTransformers as { before: string[]; after: string[] }); return [ ...before.map((item: string) => ({ transform: item })), ...after.map((item: string) => ({ transform: item, after: true })), ]; } return plugins; } // endregion /* ********************************************************* * * Patched createProgram() * ********************************************************* */ export function createProgram( rootNamesOrOptions: ReadonlyArray | tsShim.CreateProgramOptions, options?: tsShim.CompilerOptions, host?: tsShim.CompilerHost, oldProgram?: tsShim.Program, configFileParsingDiagnostics?: ReadonlyArray ): tsShim.Program { let rootNames; /* Determine options */ const createOpts = !Array.isArray(rootNamesOrOptions) ? rootNamesOrOptions : void 0; if (createOpts) { rootNames = createOpts.rootNames; options = createOpts.options; host = createOpts.host; oldProgram = createOpts.oldProgram; configFileParsingDiagnostics = createOpts.configFileParsingDiagnostics; } else { options = options!; rootNames = rootNamesOrOptions as ReadonlyArray; } /* Get Config */ const projectConfig = getProjectConfig(options, rootNames); if ([ 'tsc', 'tsserver', 'tsserverlibrary' ].includes(tsp.currentLibrary)) { options = projectConfig.compilerOptions; if (createOpts) createOpts.options = options; } /* Prepare Plugins */ const plugins = preparePluginsFromCompilerOptions(options.plugins); const pluginCreator = new PluginCreator(plugins, { resolveBaseDir: projectConfig.projectDir ?? process.cwd() }); /* Handle JSDoc parsing in v5.3+ */ if (tsp.currentLibrary === 'tsc' && tsShim.JSDocParsingMode && pluginCreator.needsTscJsDocParsing) { host!.jsDocParsingMode = tsShim.JSDocParsingMode.ParseAll; } /* Invoke TS createProgram */ let program: tsShim.Program & { originalEmit?: tsShim.Program['emit'] } = createOpts ? tsShim.originalCreateProgram(createOpts) : tsShim.originalCreateProgram(rootNames, options, host, oldProgram, configFileParsingDiagnostics); /* Prevent recursion in Program transformers */ const programTransformers = pluginCreator.createProgramTransformers(); /* Transform Program */ for (const [ transformerKey, [ programTransformer, config ] ] of programTransformers) { if (activeProgramTransformers.has(transformerKey)) continue; activeProgramTransformers.add(transformerKey); const newProgram: any = programTransformer(program, host, config, { ts: tsp.getTsInstance() }); if (typeof newProgram?.['emit'] === 'function') program = newProgram; activeProgramTransformers.delete(transformerKey); } /* Hook emit method */ if (!program.originalEmit) { program.originalEmit = program.emit; program.emit = newEmit; } function newEmit( targetSourceFile?: tsShim.SourceFile, writeFile?: tsShim.WriteFileCallback, cancellationToken?: tsShim.CancellationToken, emitOnlyDtsFiles?: boolean, customTransformers?: tsShim.CustomTransformers, ...additionalArgs: any ): tsShim.EmitResult { /* Merge in our transformers */ const transformers = pluginCreator.createSourceTransformers({ program }, customTransformers); /* Invoke TS emit */ const result: tsShim.EmitResult = program.originalEmit!( targetSourceFile, writeFile, cancellationToken, emitOnlyDtsFiles, transformers, // @ts-ignore ...additionalArgs ); /* Merge in transformer diagnostics */ for (const diagnostic of tsp.diagnosticMap.get(program) || []) if (!result.diagnostics.includes(diagnostic)) (result.diagnostics).push(diagnostic) return result; } return program; } } nonara-ts-patch-ba6d37a/projects/patch/src/ts/shim.ts000066400000000000000000000033331472416516200226710ustar00rootroot00000000000000/** @internal */ namespace tsp { /** * Compensate for modules which do not wrap functions in a `ts` namespace. */ export const tsShim = new Proxy( {}, { get(_, key: string) { const target = tsp.getTsInstance(); if (target) { return (target)[key]; } else { try { return eval(key); } catch (e) { throw new TsPatchError(`Failed to find "${key}" in TypeScript shim`, e); } } }, } ) as typeof import('typescript'); export namespace tsShim { export type CompilerOptions = import('typescript').CompilerOptions; export type CreateProgramOptions = import('typescript').CreateProgramOptions; export type Program = import('typescript').Program; export type CompilerHost = import('typescript').CompilerHost; export type Diagnostic = import('typescript').Diagnostic; export type SourceFile = import('typescript').SourceFile; export type WriteFileCallback = import('typescript').WriteFileCallback; export type CancellationToken = import('typescript').CancellationToken; export type CustomTransformers = import('typescript').CustomTransformers; export type EmitResult = import('typescript').EmitResult; export type LanguageService = import('typescript').LanguageService; export type TransformationContext = import('typescript').TransformationContext; export type Node = import('typescript').Node; export type TransformerFactory = import('typescript').TransformerFactory; export type Bundle = import('typescript').Bundle; export type Path = import('typescript').Path; export type JSDocParsingMode = import('typescript').JSDocParsingMode; } } nonara-ts-patch-ba6d37a/projects/patch/src/types/000077500000000000000000000000001472416516200220755ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/projects/patch/src/types/plugin-types.ts000066400000000000000000000047461472416516200251200ustar00rootroot00000000000000// @ts-nocheck /** AUTO-GENERATED - DO NOT EDIT */ /** @build-types */ declare namespace tsp { export interface PluginConfig { [x: string]: any; name?: string; transform?: string; resolvePathAliases?: boolean; tsConfig?: string; import?: string; isEsm?: boolean; type?: 'ls' | 'program' | 'config' | 'checker' | 'raw' | 'compilerOptions'; after?: boolean; afterDeclarations?: boolean; transformProgram?: boolean; } export type TransformerList = Required; export type TransformerPlugin = TransformerBasePlugin | TsTransformerFactory; export type TsTransformerFactory = ts.TransformerFactory; export type PluginFactory = LSPattern | ProgramPattern | ConfigPattern | CompilerOptionsPattern | TypeCheckerPattern | RawPattern; export interface TransformerBasePlugin { before?: ts.TransformerFactory | ts.TransformerFactory[]; after?: ts.TransformerFactory | ts.TransformerFactory[]; afterDeclarations?: ts.TransformerFactory | ts.TransformerFactory[]; } export type DiagnosticMap = WeakMap; export type TransformerExtras = { ts: typeof ts; library: string; addDiagnostic: (diag: ts.Diagnostic) => number; removeDiagnostic: (index: number) => void; diagnostics: readonly ts.Diagnostic[]; }; export type ProgramTransformerExtras = { ts: typeof ts; }; export type ProgramTransformer = (program: ts.Program, host: ts.CompilerHost | undefined, config: PluginConfig, extras: ProgramTransformerExtras) => ts.Program; export type LSPattern = (ls: ts.LanguageService, config: {}) => TransformerPlugin; export type CompilerOptionsPattern = (compilerOpts: ts.CompilerOptions, config: {}) => TransformerPlugin; export type ConfigPattern = (config: {}) => TransformerPlugin; export type TypeCheckerPattern = (checker: ts.TypeChecker, config: {}) => TransformerPlugin; export type ProgramPattern = (program: ts.Program, config: {}, extras: TransformerExtras) => TransformerPlugin; export type RawPattern = (context: ts.TransformationContext, program: ts.Program, config: {}) => ts.Transformer; export interface PluginPackageConfig { tscOptions?: { parseAllJsDoc?: boolean; }; } } nonara-ts-patch-ba6d37a/projects/patch/src/types/typescript.ts000066400000000000000000000007101472416516200246510ustar00rootroot00000000000000/* ****************************************************************************************************************** * * Added Properties * ****************************************************************************************************************** */ /** @build-types */ declare namespace ts { /** @internal */ const createProgram: typeof import('typescript').createProgram; export const originalCreateProgram: typeof ts.createProgram; } nonara-ts-patch-ba6d37a/projects/patch/tsconfig.json000066400000000000000000000012131472416516200226460ustar00rootroot00000000000000{ "include": [ "src" ], "compilerOptions": { "outFile": "../../dist/resources/module-patch.js", "declaration": true, "types": [ "@types/node" ], "strict": true, "noUnusedLocals": false, "noImplicitReturns": true, "allowSyntheticDefaultImports": true, "stripInternal": true, "target": "ES2020", "downlevelIteration": true, "useUnknownInCatchVariables": false, "newLine": "LF", "moduleResolution": "Node", "esModuleInterop": true, "plugins": [ { "transform": "./plugin.ts", "transformProgram": true, "import": "transformProgram" } ] } } nonara-ts-patch-ba6d37a/scripts/000077500000000000000000000000001472416516200167015ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/scripts/postbuild.js000066400000000000000000000044771472416516200212600ustar00rootroot00000000000000#!/usr/bin/env node const shell = require('shelljs'); const path = require('path'); const fs = require('fs'); const glob = require('glob'); /* ******************************************************************************************************************** * Constants * ********************************************************************************************************************/ const BASE_DIR = path.resolve('.'); const SRC_DIR = path.resolve('./src'); const DIST_DIR = path.resolve('./dist'); const DIST_RESOURCE_DIR = path.join(DIST_DIR, 'resources'); const COMPILER_DIR = path.resolve('./projects/core/src/compiler'); /* ******************************************************************************************************************** * Post-Build Steps * ********************************************************************************************************************/ /* Uncomment this if you need to temporarily build without patched ts */ // shell.mv(path.join(DIST_DIR, 'src', '*'), DIST_DIR); // shell.mv(path.join(DIST_DIR, 'shared', '*'), DIST_DIR); // shell.rm('-rf', path.join(DIST_DIR, 'src')); // shell.rm('-rf', path.join(DIST_DIR, 'shared')); /* Build package.json */ const pkgJSON = JSON.parse(fs.readFileSync(path.join(BASE_DIR, 'package.json'), 'utf8')); delete pkgJSON.scripts; delete pkgJSON.private; delete pkgJSON.workspaces; delete pkgJSON.devDependencies; // Write & remove ./dist fs.writeFileSync( path.join(DIST_DIR, 'package.json'), JSON.stringify(pkgJSON, null, 2).replace(/(?<=['"].*?)dist\//g, '') ); /* Copy Live files */ shell.cp('-r', COMPILER_DIR, DIST_DIR); /* Copy Readme & Changelog */ shell.cp(path.resolve('./README.md'), DIST_DIR); shell.cp(path.resolve('./CHANGELOG.md'), DIST_DIR); shell.cp(path.resolve('./LICENSE.md'), DIST_DIR); /* Add shebang line to bin files */ const binFiles = glob .sync(path.join(DIST_DIR, 'bin', '*.js')) .map((filePath) => [ filePath, `#!/usr/bin/env node\n\n` + fs.readFileSync(filePath, 'utf8') ]); for (const [ filePath, fileContent] of binFiles) { const fileName = path.basename(filePath); fs.writeFileSync(path.join(DIST_DIR, 'bin', fileName), fileContent, 'utf8'); } /* Ensure EOL = LF in resources */ const resFiles = glob.sync(path.join(DIST_RESOURCE_DIR, '*').replace(/\\/g, '/')); shell.sed('-i', /\r+$/, '', resFiles); nonara-ts-patch-ba6d37a/test/000077500000000000000000000000001472416516200161715ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/.yarnrc000066400000000000000000000000231472416516200174630ustar00rootroot00000000000000--no-lockfile true nonara-ts-patch-ba6d37a/test/assets/000077500000000000000000000000001472416516200174735ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/000077500000000000000000000000001472416516200213245ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/main/000077500000000000000000000000001472416516200222505ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/main/package.json000066400000000000000000000001061472416516200245330ustar00rootroot00000000000000{ "name": "test-project", "private": true, "dependencies": {} } nonara-ts-patch-ba6d37a/test/assets/projects/main/src/000077500000000000000000000000001472416516200230375ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/main/src/index.ts000066400000000000000000000000001472416516200245040ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/main/tsconfig.json000066400000000000000000000004521472416516200247600ustar00rootroot00000000000000{ "include" : [ "src" ], "compilerOptions": { "outDir": "dist", "esModuleInterop": true, "strict": true, "lib": [ "ESNext" ], "target": "ESNext", "module": "CommonJS", "moduleResolution": "node", "newLine": "LF", "allowSyntheticDefaultImports": true } } nonara-ts-patch-ba6d37a/test/assets/projects/package-config/000077500000000000000000000000001472416516200241625ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/000077500000000000000000000000001472416516200254605ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/package.json000066400000000000000000000001411472416516200277420ustar00rootroot00000000000000{ "main" : "plugin.js", "tsp": { "tscOptions": { "parseAllJsDoc": true } } } nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/plugin.js000066400000000000000000000005151472416516200273150ustar00rootroot00000000000000const transformer1Factory = require('./transformers/transformer1'); const transformer2Factory = require('./transformers/transformer2'); module.exports = function(...args) { return { before: [transformer1Factory(...args), transformer2Factory(...args)], after: () => { throw new Error('after should be unreachable') } } } nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/transformers/000077500000000000000000000000001472416516200302055ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/transformers/transformer1.js000066400000000000000000000015201472416516200331640ustar00rootroot00000000000000/** * Change the value of a variable declaration to the value of all jsDoc comments */ function transformer1Factory(program, config, { ts }) { return context => { const { factory } = context; function visitor(node) { if (ts.isVariableDeclaration(node) && node.initializer) { const jsDocs = ts.getJSDocTags(node); if (jsDocs.length > 0) { const jsDocComment = jsDocs.map(doc => doc.comment).filter(comment => comment).join(' '); return factory.createVariableDeclaration( node.name, undefined, undefined, factory.createStringLiteral(jsDocComment) ); } } return ts.visitEachChild(node, visitor, context); } return sourceFile => ts.visitNode(sourceFile, visitor); }; } module.exports = transformer1Factory; nonara-ts-patch-ba6d37a/test/assets/projects/package-config/plugin/transformers/transformer2.js000066400000000000000000000011611472416516200331660ustar00rootroot00000000000000/** * Transform let to const */ function transformer2Factory(program, config, { ts }) { return context => { const { factory } = context; function visitor(node) { if (ts.isVariableStatement(node) && node.declarationList.flags & ts.NodeFlags.Let) { return factory.createVariableStatement( undefined, factory.createVariableDeclarationList(node.declarationList.declarations, ts.NodeFlags.Const) ); } return ts.visitEachChild(node, visitor, context); } return sourceFile => ts.visitNode(sourceFile, visitor); } } module.exports = transformer2Factory; nonara-ts-patch-ba6d37a/test/assets/projects/package-config/run-transform.js000066400000000000000000000045611472416516200273430ustar00rootroot00000000000000const path = require('path'); const { spawnSync } = require('child_process'); const { getLiveModule } = require('ts-patch'); const { runInThisContext } = require("vm"); /* ****************************************************************************************************************** * * Helpers * ****************************************************************************************************************** */ function runTsc(disableTspClause) { const pluginDir = path.resolve(__dirname, 'plugin'); const pluginPackageJsonPath = path.join(pluginDir, 'package.json'); process.env.TSP_SKIP_CACHE = true; const { js, tsModule } = getLiveModule('tsc.js'); let currentWriteFile = undefined; const fs = { ...require('fs'), mkdirSync: function (dirPath) { return; }, writeFileSync: function (filePath, data, options) { throw new Error('Should not be used'); }, openSync: function (filePath, flags, mode) { currentWriteFile = filePath; return 1; }, writeSync: function (fd, data, options) { // process.stdout.write(currentWriteFile + '\n'); // Check if the file is src/index.ts and output to stdout if (path.basename(currentWriteFile) === 'index.js') { process.stdout.write(data); } }, closeSync: function (fd) { currentWriteFile = undefined; }, readFileSync: function (filePath, options) { if (disableTspClause && path.normalize(filePath) === pluginPackageJsonPath) { return JSON.stringify({ }); } return require('fs').readFileSync(filePath, options); } } const myRequire = function (modulePath) { if (modulePath === 'fs') return fs; return require(modulePath); } Object.assign(myRequire, require); const script = runInThisContext(` (function (exports, require, module, __filename, __dirname) { process.argv = ['node', 'tsc.js', '--noEmit', 'false']; ${js} }); `); script.call(exports, exports, myRequire, module, tsModule.modulePath, path.dirname(tsModule.modulePath)); } /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const disableTspClause = process.argv[2] === '--disable'; runTsc(disableTspClause); nonara-ts-patch-ba6d37a/test/assets/projects/package-config/src/000077500000000000000000000000001472416516200247515ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/package-config/src/index.ts000066400000000000000000000001341472416516200264260ustar00rootroot00000000000000/** * @tag1 ExampleTag1 * @tag2 ExampleTag2 */ let myVar = 123; let anotherVar = "test"; nonara-ts-patch-ba6d37a/test/assets/projects/package-config/tsconfig.json000066400000000000000000000003151472416516200266700ustar00rootroot00000000000000{ "include": [ "src" ], "compilerOptions": { "outDir": "dist", "module": "commonjs", "target": "esnext", "noEmit": true, "plugins" : [ { "transform": "./plugin" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/000077500000000000000000000000001472416516200237115ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/base.ts000066400000000000000000000000241472416516200251670ustar00rootroot00000000000000export const b = 2; nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/package.json000066400000000000000000000002201472416516200261710ustar00rootroot00000000000000{ "name": "path-mapping-test", "main": "src/index.ts", "dependencies": { "ts-node" : "^10.9.1", "tsconfig-paths" : "^4.2.0" } } nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/src/000077500000000000000000000000001472416516200245005ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/src/a/000077500000000000000000000000001472416516200247205ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/src/a/a.ts000066400000000000000000000000311472416516200255020ustar00rootroot00000000000000export const aVar = "a"; nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/src/b.ts000066400000000000000000000000311472416516200252630ustar00rootroot00000000000000export const bVar = "b"; nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/src/index.ts000066400000000000000000000011361472416516200261600ustar00rootroot00000000000000// @ts-nocheck import * as ts from 'typescript'; import '@a/a'; import '@b'; const tryRequire = (path: string) => { try { require(path); } catch (e) { if (e.code === 'MODULE_NOT_FOUND') { return false; } else { throw e; } } return true; } export default function(program: ts.Program, pluginOptions: any) { return (ctx: ts.TransformationContext) => { process.stdout.write(`sub-path:${tryRequire('@a/a')}\n`); process.stdout.write(`path:${tryRequire('@b')}\n`); process.stdout.write(`non-mapped:${tryRequire('@c')}\n`); return (_: any) => _; }; } nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/tsconfig.json000066400000000000000000000005371472416516200264250ustar00rootroot00000000000000{ "include": [ "base.ts" ], "compilerOptions": { "outDir" : "dist", "moduleResolution" : "node", "module": "commonjs", "target": "ES2020", "noEmit": false, "plugins" : [ { "transform": "./src/index.ts", "tsConfig": "./tsconfig.plugin.json", "resolvePathAliases": "always", } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/path-mapping/tsconfig.plugin.json000066400000000000000000000003611472416516200277150ustar00rootroot00000000000000{ "include": [ "src" ], "compilerOptions": { "outDir": "dist", "module": "commonjs", "target": "ES2020", "noEmit": true, "baseUrl" : "src", "paths": { "@a/*": [ "./a/*" ], "@b": [ "./b" ], } } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/000077500000000000000000000000001472416516200233375ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/transform/package.json000066400000000000000000000002351472416516200256250ustar00rootroot00000000000000{ "name": "minimal-ts-patch", "main": "src/index.ts", "dependencies": { "esm": "^3.2.25", "ts-node" : "^10.9.1", "semver" : "^7.6.3" } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/run-transform.js000066400000000000000000000041021472416516200265070ustar00rootroot00000000000000const path = require('path'); const semver = require('semver'); /* ****************************************************************************************************************** * * Helpers * ****************************************************************************************************************** */ function getTransformedFile(transformerKind) { process.env.TSP_SKIP_CACHE = true; const tsInstance = require('ts-patch/compiler'); console.log(`'TS version: ${tsInstance.version}\nNode Version: ${process.version.slice(1)}`); const configPath = path.join(__dirname, `tsconfig.${transformerKind}.json`); const configText = tsInstance.sys.readFile(configPath); /* Parse config */ let compilerOptions; if (semver.lt(tsInstance.version, '5.5.0', { includePrerelease: false })) { const configParseResult = tsInstance.parseConfigFileTextToJson(configPath, configText); compilerOptions = configParseResult.config.compilerOptions; } else { const configSourceFile = tsInstance.createSourceFile(configPath, configText, tsInstance.ScriptTarget.Latest); const configParseResult = tsInstance.parseJsonSourceFileConfigFileContent(configSourceFile, tsInstance.sys, path.dirname(configPath), undefined, configPath); compilerOptions = configParseResult.options; } /* Overwrite options */ Object.assign(compilerOptions, { noEmit: false, skipLibCheck: true, outDir: 'dist', }); const emittedFiles = new Map(); const writeFile = (fileName, content) => emittedFiles.set(fileName, content); const program = tsInstance.createProgram({ rootNames: [ path.join(__dirname, 'src', 'index.ts') ], options: compilerOptions, }); program.emit(undefined, writeFile); return emittedFiles.get('dist/index.js'); } /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const args = process.argv.slice(2); console.log(getTransformedFile(args[0])); nonara-ts-patch-ba6d37a/test/assets/projects/transform/src/000077500000000000000000000000001472416516200241265ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/transform/src/index.ts000066400000000000000000000001351472416516200256040ustar00rootroot00000000000000const a = 'before'; // Intentional error — should be ignored declare const x: string = 3; nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/000077500000000000000000000000001472416516200260645ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/cjs/000077500000000000000000000000001472416516200266435ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/cjs/js-plugin.cjs000066400000000000000000000010411472416516200312500ustar00rootroot00000000000000const ts = require('typescript'); if (!__dirname) throw new Error('Not handled as cjs'); module.exports.default = (program, _, { ts: tsInstance }) => { return (ctx) => { const factory = ctx.factory; return (sourceFile) => { function visit(node) { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after-cjs'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/cjs/package.json000066400000000000000000000000311472416516200311230ustar00rootroot00000000000000{ "type": "commonjs" } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/cjs/plugin.cts000066400000000000000000000011041472416516200306500ustar00rootroot00000000000000import type * as ts from 'typescript'; export default function (program: ts.Program, _, { ts: tsInstance }: { ts: typeof ts }) { return (ctx: ts.TransformationContext) => { const factory = ctx.factory; return (sourceFile: ts.SourceFile) => { function visit(node: ts.Node): ts.Node { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after-cts'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/cjs/tsconfig.json000066400000000000000000000001661472416516200313550ustar00rootroot00000000000000{ "extends" : "../../tsconfig.json", "include" : [ "." ], "compilerOptions" : { "module" : "CommonJS" } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/000077500000000000000000000000001472416516200266505ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/js-plugin.mjs000066400000000000000000000010001472416516200312620ustar00rootroot00000000000000if (!import.meta.url) throw new Error('Not handled as esm'); export default function (program, _, { ts: tsInstance }) { return (ctx) => { const factory = ctx.factory; return (sourceFile) => { function visit(node) { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after-mjs'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/package.json000066400000000000000000000000271472416516200311350ustar00rootroot00000000000000{ "type": "module" } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/plugin.mts000066400000000000000000000012021472416516200306660ustar00rootroot00000000000000import type * as ts from 'typescript'; if (!import.meta.url) throw new Error('Not handled as esm'); export default function (program: ts.Program, _, { ts: tsInstance }: { ts: typeof ts }) { return (ctx: ts.TransformationContext) => { const factory = ctx.factory; return (sourceFile: ts.SourceFile) => { function visit(node: ts.Node): ts.Node { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after-mts'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/plugin.ts000066400000000000000000000012011472416516200305100ustar00rootroot00000000000000import type * as ts from 'typescript'; if (!import.meta.url) throw new Error('Not handled as esm'); export default function (program: ts.Program, _, { ts: tsInstance }: { ts: typeof ts }) { return (ctx: ts.TransformationContext) => { const factory = ctx.factory; return (sourceFile: ts.SourceFile) => { function visit(node: ts.Node): ts.Node { if (tsInstance.isStringLiteral(node) && node.text === 'before') { return factory.createStringLiteral('after-ts'); } return tsInstance.visitEachChild(node, visit, ctx); } return tsInstance.visitNode(sourceFile, visit); }; }; } nonara-ts-patch-ba6d37a/test/assets/projects/transform/transformers/esm/tsconfig.json000066400000000000000000000001641472416516200313600ustar00rootroot00000000000000{ "extends" : "../../tsconfig.json", "include" : [ "." ], "compilerOptions" : { "module" : "ESNext" } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.cjs.json000066400000000000000000000003561472416516200266300ustar00rootroot00000000000000{ "extends" : "./tsconfig", "compilerOptions" : { "module" : "CommonJS", "plugins": [ { "transform": "./transformers/cjs/js-plugin.cjs", "tsConfig": "./transformers/cjs/tsconfig.json" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.cts.json000066400000000000000000000003531472416516200266370ustar00rootroot00000000000000{ "extends" : "./tsconfig", "compilerOptions" : { "module" : "CommonJS", "plugins": [ { "transform": "./transformers/cjs/plugin.cts", "tsConfig": "./transformers/cjs/tsconfig.json" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.json000066400000000000000000000002221472416516200260420ustar00rootroot00000000000000{ "include": [ "src" ], "compilerOptions": { "outDir": "dist", "module": "commonjs", "target": "esnext", "noEmit": true } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.mjs.json000066400000000000000000000003561472416516200266420ustar00rootroot00000000000000{ "extends" : "./tsconfig", "compilerOptions" : { "module" : "CommonJS", "plugins": [ { "transform": "./transformers/esm/js-plugin.mjs", "tsConfig": "./transformers/esm/tsconfig.json" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.mts.json000066400000000000000000000003201472416516200266430ustar00rootroot00000000000000{ "extends" : "./tsconfig", "compilerOptions" : { "plugins": [ { "transform": "./transformers/esm/plugin.mts", "tsConfig": "./transformers/esm/tsconfig.json" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/transform/tsconfig.ts.json000066400000000000000000000003171472416516200264740ustar00rootroot00000000000000{ "extends" : "./tsconfig", "compilerOptions" : { "plugins": [ { "transform": "./transformers/esm/plugin.ts", "tsConfig": "./transformers/esm/tsconfig.json" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/000077500000000000000000000000001472416516200227405ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/webpack/esm-plugin.mjs000066400000000000000000000001731472416516200255340ustar00rootroot00000000000000export default function(program, pluginOptions) { return (ctx) => { throw new Error(`ts-patch worked (esm)`); }; } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/esm-plugin.mts000066400000000000000000000002071472416516200255440ustar00rootroot00000000000000export default function(program: any, pluginOptions: any) { return (ctx) => { throw new Error(`ts-patch worked (esmts)`); }; } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/hide-module.js000066400000000000000000000017151472416516200254760ustar00rootroot00000000000000const Module = require('module'); /* ****************************************************************************************************************** * * Config * ****************************************************************************************************************** */ const hiddenModules = (process.env.HIDE_MODULES || '').split(',').map(str => str.trim()); /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ const originalRequire = Module.prototype.require; Module.prototype.require = function(requestedModule) { if (hiddenModules.includes(requestedModule)) { const error = new Error(`Cannot find module '${requestedModule}'`); error.code = 'MODULE_NOT_FOUND'; throw error; } return originalRequire.call(this, requestedModule); }; nonara-ts-patch-ba6d37a/test/assets/projects/webpack/package.json000066400000000000000000000004101472416516200252210ustar00rootroot00000000000000{ "name": "webpack-tspatch-project", "version": "1.0.0", "scripts": { "build": "webpack" }, "devDependencies" : { "ts-loader": "^9.4.2", "webpack": "^5.79.0", "webpack-cli": "^5.0.1", "esm": "^3.2.25", "ts-node" : "^10.9.1" } } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/plugin.ts000066400000000000000000000003161472416516200246060ustar00rootroot00000000000000import type * as ts from 'typescript'; export default function(program: ts.Program, pluginOptions: any) { return (ctx: ts.TransformationContext) => { throw new Error(`ts-patch worked (cjs)`); }; } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/src/000077500000000000000000000000001472416516200235275ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/webpack/src/index.ts000066400000000000000000000000001472416516200251740ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/assets/projects/webpack/tsconfig.esm.json000066400000000000000000000002001472416516200262220ustar00rootroot00000000000000{ "extends": "./tsconfig.json", "compilerOptions": { "plugins": [ { "transform": "./esm-plugin.mjs" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/tsconfig.esmts.json000066400000000000000000000002001472416516200265710ustar00rootroot00000000000000{ "extends": "./tsconfig.json", "compilerOptions": { "plugins": [ { "transform": "./esm-plugin.mts" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/tsconfig.json000066400000000000000000000003641472416516200254520ustar00rootroot00000000000000{ "include": [ "src" ], "compilerOptions": { "module": "commonjs", "noEmit": true, "target": "ESNext", "declaration": false, "moduleResolution" : "Node", "plugins": [ { "transform": "./plugin.ts" } ] } } nonara-ts-patch-ba6d37a/test/assets/projects/webpack/webpack.config.js000066400000000000000000000006731472416516200261640ustar00rootroot00000000000000const path = require('path'); module.exports = { mode: 'development', entry: './src/index.ts', output: { path: path.resolve(__dirname, 'dist'), filename: 'bundle.js' }, module: { rules: [ { test: /\.(ts|tsx)$/, loader: require.resolve('ts-loader'), options: { compiler: 'ts-patch/typescript' } } ] }, resolve: { extensions: ['.ts', '.tsx', '.js'] } }; nonara-ts-patch-ba6d37a/test/package.json000066400000000000000000000005101472416516200204530ustar00rootroot00000000000000{ "private": true, "scripts" : { "perf": "ts-node -T --project tsconfig.json --files ./src/perf.ts" }, "dependencies": { "ts-latest": "npm:typescript@beta", "ts-node": "latest", "ts-patch": "link:../dist", "tsconfig-paths": "latest", "fs-extra": "^10.0.0", "@types/fs-extra": "^9.0.13" } } nonara-ts-patch-ba6d37a/test/src/000077500000000000000000000000001472416516200167605ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/src/cleanup.ts000066400000000000000000000002121472416516200207520ustar00rootroot00000000000000import { cleanTemp } from './project'; export default function() { try { cleanTemp(); } catch (e) { console.error(e); } } nonara-ts-patch-ba6d37a/test/src/config.ts000066400000000000000000000026111472416516200205750ustar00rootroot00000000000000import path from 'path'; // @ts-expect-error TODO - tsei import { normalizeSlashes } from 'typescript'; /* ****************************************************************************************************************** * * Locals * ****************************************************************************************************************** */ const getTsModule = (label: string, moduleSpecifier: string) => ({ moduleSpecifier, tsDir: path.resolve(testRootDir, 'node_modules', moduleSpecifier), label }); /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ export const testRootDir = normalizeSlashes(path.resolve(__dirname, '..')); export const rootDir = normalizeSlashes(path.resolve(__dirname, '../../')); export const resourcesDir = normalizeSlashes(path.resolve(__dirname, '../../dist/resources')); export const assetsDir = normalizeSlashes(path.resolve(__dirname, '../assets')); export const projectsDir = normalizeSlashes(path.resolve(assetsDir, 'projects')); export const tsModules = [ getTsModule('latest', 'ts-latest'), ] export const packageManagers = [ 'npm', 'yarn', 'pnpm', 'yarn3' ]; export type PackageManager = typeof packageManagers[number]; // endregion nonara-ts-patch-ba6d37a/test/src/perf.ts000066400000000000000000000072431472416516200202720ustar00rootroot00000000000000import { getTsPackage, TsPackage } from '../../projects/core/src/ts-package'; import { getTsModule, GetTsModuleOptions, TsModule } from '../../projects/core/src/module'; import { getPatchedSource, GetPatchedSourceOptions } from '../../projects/core/src/patch/get-patched-source'; import child_process from 'child_process'; import path from 'path'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const tsLatestPath = path.dirname(require.resolve('ts-latest/package.json')); // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function perf(name: string, opt: any = {}, fn: () => any) { const start = performance.now(); const res = fn(); const end = performance.now(); console.log(`${name} (${JSON.stringify(opt)}): \n — duration: ${end - start} ms\n`); return res; } function printOpt(opt: any) { const printOpt = { ...opt }; if (printOpt.tsPackage) printOpt.tsPackage = printOpt.tsPackage.packageDir; if (printOpt.tsModule) printOpt.tsModule = printOpt.tsModule.moduleName; return printOpt; } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function perfTsPackage(opt: { tsPath?: string } = {}) { opt.tsPath ??= tsLatestPath; perf(`tsPackage`, printOpt(opt), () => getTsPackage(opt.tsPath)); } export function perfTsModule(opt: { moduleName?: TsModule.Name, tsPackage?: TsPackage } & GetTsModuleOptions = {}) { opt.tsPackage ??= getTsPackage(tsLatestPath); opt.moduleName ??= 'typescript.js'; perf(`tsModule`, printOpt(opt), () => getTsModule(opt.tsPackage!, opt.moduleName!, opt)); } export function perfGetPatchedSource(opt: { tsModule?: TsModule } & GetPatchedSourceOptions = {}) { opt.tsModule ??= getTsModule(getTsPackage(tsLatestPath), 'typescript.js'); perf(`getPatchedSource`, printOpt(opt), () => getPatchedSource(opt.tsModule!, opt)); } export function perfTspc(opt: { skipCache?: boolean } = {}) { opt.skipCache ??= false; perf( `tspc`, printOpt(opt), () => { // Execute tspc command with node in a child process child_process.execSync(`node ${path.resolve(__dirname, '../../dist/bin/tspc.js --help')}`, { env: { ...process.env, TSP_SKIP_CACHE: opt.skipCache ? 'true' : 'false', TSP_COMPILER_TS_PATH: tsLatestPath, } }); } ); } export function perfTsc() { perf( `tsc`, {}, () => { child_process.execSync(`node ${path.join(tsLatestPath, 'lib/tsc.js')} --help`, { env: { ...process.env, TSP_COMPILER_TS_PATH: tsLatestPath, } }); } ); } // TODO - Add perfInstall with and without cache export function perfAll() { perfTsPackage(); perfTsModule(); perfGetPatchedSource(); perfTsc(); perfTspc({ skipCache: true }); perfTspc({ skipCache: false }); } // endregion /* ****************************************************************************************************************** * * Entry * ****************************************************************************************************************** */ if (require.main === module) perfAll(); nonara-ts-patch-ba6d37a/test/src/prepare.ts000066400000000000000000000002121472416516200207610ustar00rootroot00000000000000import { cleanTemp } from './project'; export default function() { try { cleanTemp(); } catch (e) { console.error(e); } } nonara-ts-patch-ba6d37a/test/src/project.ts000066400000000000000000000111501472416516200207740ustar00rootroot00000000000000import path from 'path'; import { PackageManager, projectsDir, rootDir } from './config'; import fs from 'fs'; import * as os from 'os'; import shell from 'shelljs'; import { PartialSome } from './utils/general'; import { execSync } from 'child_process'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const pkgManagerInstallCmd = { npm: 'npm install --no-audit --progress=false', yarn: 'yarn --no-progress --check-cache --no-audit', pnpm: 'npx pnpm install', yarn3: 'npx yarn install --skip-builds' } satisfies Record; const pkgManagerInstallerCmd = { npm: '', yarn: 'npm install --no-save --legacy-peer-deps yarn', yarn3: 'npm install --no-save --legacy-peer-deps yarn@berry', pnpm: 'npm install --no-save --legacy-peer-deps pnpm' } satisfies Record; // endregion /* ****************************************************************************************************************** */ // region: Types /* ****************************************************************************************************************** */ export interface PrepareOptions { projectName: string; /** @default 'latest' */ tsVersion: string; /** @default 'npm' */ packageManager: PackageManager; dependencies?: Record } export namespace PrepareOptions { export type Configurable = PartialSome> export const getDefaults = () => ({ packageManager: 'npm', tsVersion: 'beta' }) satisfies Partial; } // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function execCmd(cmd: string) { try { execSync(cmd, { stdio: [ 'ignore', 'pipe', 'pipe' ] }); } catch (e) { throw new Error(`Error during project cmd: ${e.stdout?.toString() + '\n' + e.stderr?.toString()}`); } } // endregion /* ****************************************************************************************************************** */ // region: Utils /* ****************************************************************************************************************** */ export function getProjectTempPath(projectName?: string, packageManager?: string, wipe?: boolean) { const tmpBasePath = process.env.TSP_TMP_DIR ?? os.tmpdir(); const tmpProjectPath = path.resolve(tmpBasePath, '.tsp-test/project', projectName ?? '', packageManager ?? ''); if (!fs.existsSync(tmpProjectPath)) fs.mkdirSync(tmpProjectPath, { recursive: true }); else if (wipe) shell.rm('-rf', path.join(tmpProjectPath, '*')); return tmpProjectPath; } export function getProjectPath(projectName: string) { return path.join(projectsDir, projectName); } export function prepareTestProject(opt: PrepareOptions.Configurable) { const options: PrepareOptions = { ...PrepareOptions.getDefaults(), ...opt }; const { projectName, packageManager } = options; const projectPath = getProjectPath(projectName); if (!fs.existsSync(projectPath)) throw new Error(`Project "${projectName}" does not exist`); const tmpProjectPath = getProjectTempPath(projectName, packageManager, true); /* Copy all files from projectPath to tmpProjectPath */ shell.cp('-R', path.join(projectPath, '*'), tmpProjectPath); shell.cd(tmpProjectPath); /* Copy ts-patch to node_modules */ const tspDir = path.join(tmpProjectPath, '.tsp'); if (!fs.existsSync(tspDir)) fs.mkdirSync(tspDir, { recursive: true }); shell.cp('-R', path.join(rootDir, 'dist/*'), tspDir); /* Install package manager */ if (pkgManagerInstallerCmd[packageManager]) execCmd(pkgManagerInstallerCmd[packageManager]); /* Install dependencies */ const pkgJson = JSON.parse(fs.readFileSync(path.join(tmpProjectPath, 'package.json'), 'utf8')); pkgJson.dependencies = { ...pkgJson.dependencies, ...options.dependencies, 'typescript': options.tsVersion, 'ts-patch': 'file:./.tsp' }; fs.writeFileSync(path.join(tmpProjectPath, 'package.json'), JSON.stringify(pkgJson, null, 2)); execCmd(pkgManagerInstallCmd[packageManager]); return { projectPath, tmpProjectPath }; } export function cleanTemp() { if (!process.env.TSP_TMP_DIR) fs.rmSync(getProjectTempPath(), { recursive: true, force: true, retryDelay: 200, maxRetries: 5 }); } // endregion nonara-ts-patch-ba6d37a/test/src/utils/000077500000000000000000000000001472416516200201205ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/src/utils/general.ts000066400000000000000000000005511472416516200221060ustar00rootroot00000000000000 /* ****************************************************************************************************************** */ // region: Type Utils /* ****************************************************************************************************************** */ export type PartialSome = Omit & Pick, K> // endregion nonara-ts-patch-ba6d37a/test/tests/000077500000000000000000000000001472416516200173335ustar00rootroot00000000000000nonara-ts-patch-ba6d37a/test/tests/actions.test.ts000066400000000000000000000223241472416516200223240ustar00rootroot00000000000000import fs from 'fs'; import { check } from '../../dist/actions'; import { TsModule } from '../../dist/module'; import { defaultInstallLibraries } from '../../dist/config'; import { getTsPackage, TsPackage } from '../../dist/ts-package'; import { PackageManager } from '../src/config'; import { prepareTestProject } from '../src/project'; import path from 'path'; import { InstallerOptions } from '../../dist'; import { LogLevel } from '../../dist/system'; import { execSync } from 'child_process'; import ts from 'typescript'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const verboseMode = !!process.env.VERBOSE; // const verboseMode = true; /* Options to use with install/uninstall */ const testingPackageManagers = [ 'npm', 'yarn', 'pnpm', // 'yarn3' ] satisfies PackageManager[]; const tspOptions: Partial = { logLevel: verboseMode ? LogLevel.verbose : LogLevel.system, silent: !verboseMode }; // endregion /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function getModulesSources(tsPackage: TsPackage, moduleNames?: string[]) { moduleNames ??= defaultInstallLibraries; return new Map(moduleNames.map(name => { const modulePath = tsPackage.getModulePath(name); const dtsPath = modulePath.replace(/\.js$/, '.d.ts'); const moduleContentPath = TsModule.getContentFilePathForModulePath(modulePath); const js = fs.readFileSync(moduleContentPath, 'utf-8'); const dts = fs.existsSync(dtsPath) ? fs.readFileSync(dtsPath, 'utf-8') : undefined; return [ name, { js, dts } ]; })); } function updatePackageJson(pkgPath: string, cb: (pkgJson: any) => void) { let pkgJson = JSON.parse(fs.readFileSync(pkgPath, 'utf-8')); cb(pkgJson); fs.writeFileSync(pkgPath, JSON.stringify(pkgJson, null, 2)); } function resetRequireCache(dir: string) { dir = path.dirname(require.resolve(dir)); for (const key in require.cache) { if (key.startsWith(dir)) { delete require.cache[key]; } } } function runAction(tspDir: string, kind: 'api' | 'cli', cmd: string) { switch (kind) { case 'api': const scriptCode = ` require('ts-patch').${cmd} `; fs.writeFileSync(path.join(tspDir, 'run-cmd.js'), scriptCode, 'utf-8'); execSync(`node run-cmd.js`, { cwd: tspDir }); break; case 'cli': const flags = verboseMode ? `--verbose` : '--silent'; execSync(`ts-patch ${cmd} ${flags}`, { cwd: tspDir }); } resetRequireCache(tspDir); const { getTsPackage } = require(path.join(tspDir, 'ts-package.js')); const { getTsModule } = require(path.join(tspDir, 'module')); const tsPackage = getTsPackage(); const modules = defaultInstallLibraries.map((m: any) => getTsModule(tsPackage, m)); return { modules, tsPackage }; } function runInstall(tspDir: string, kind: 'api' | 'cli') { let cmd: string; if (kind === 'api') { cmd = `install(${JSON.stringify(tspOptions)})`; } else { cmd = `install ${verboseMode ? '--verbose' : '--silent'}`; } return runAction(tspDir, kind, cmd); } function runUninstall(tspDir: string, kind: 'api' | 'cli') { let cmd: string; if (kind === 'api') { const tspOptions: Partial = { logLevel: LogLevel.verbose, }; cmd = `uninstall(${JSON.stringify(tspOptions)})`; } else { cmd = `uninstall --verbose`; } return runAction(tspDir, kind, cmd); } // endregion /* ******************************************************************************************************************** * Tests * ********************************************************************************************************************/ describe(`TSP Actions`, () => { // TODO - Parallelize describe.each(testingPackageManagers)(`%s`, (packageManager) => { /* Install */ describe(`Install`, () => { let projectPath: string; let tmpProjectPath: string; let tspDir: string; let tsDir: string; let cachePath: string; let originalModulesSrc: Map; beforeAll(() => { const prepRes = prepareTestProject({ projectName: 'main', packageManager }); projectPath = prepRes.projectPath; tmpProjectPath = prepRes.tmpProjectPath; const tsPackage = getTsPackage(tsDir); originalModulesSrc = getModulesSources(tsPackage); tspDir = path.resolve(tmpProjectPath, 'node_modules', 'ts-patch'); tsDir = path.resolve(tmpProjectPath, 'node_modules', 'typescript'); cachePath = path.resolve(tspDir, '../.cache/ts-patch'); }); describe.each([ [ '', '0.0.0' ], [ ' (overwrite w/ higher version)', '1.1.1' ] ])(`Install %s`, (caption, installedTspVersion) => { let tsPackage: TsPackage; let modules: TsModule[]; beforeAll(() => { /* Set version */ updatePackageJson(path.join(tspDir, 'package.json'), (pkgData) => pkgData.version = installedTspVersion); tsPackage = getTsPackage(tsDir); /* Install */ const runRes = runInstall(tspDir, 'api'); modules = runRes.modules; }); test(`Original modules backed up`, () => { for (const m of modules) { const origSrcEntry = originalModulesSrc.get(m.moduleName)!; if (m.dtsPath) { const backupSrc = fs.readFileSync(m.backupCachePaths.dts!, 'utf-8'); expect(backupSrc).toBe(origSrcEntry.dts); } const backupSrc = fs.readFileSync(m.backupCachePaths.js!, 'utf-8'); expect(backupSrc).toBe(origSrcEntry.js); } }); test(`All modules patched`, () => { modules.forEach(m => { expect(m.isPatched).toBe(true); expect(m.moduleFile.patchDetail?.tspVersion).toBe(installedTspVersion); }) }); test(`check() is accurate`, () => { const checkResult = check(undefined, tspOptions); const unpatchedModuleNames = tsPackage.moduleNames.filter(m => !defaultInstallLibraries.includes(m)); unpatchedModuleNames.forEach(m => expect(checkResult[m]).toBeUndefined()); defaultInstallLibraries.forEach(m => expect(checkResult[m]?.tspVersion).toBe(installedTspVersion)); }); test(`No semantic errors in typescript.d.ts`, () => { const dtsFilePath = path.join(tsDir, 'typescript.d.ts'); const compilerOptions = Object.assign(ts.getDefaultCompilerOptions(), { target: ts.ScriptTarget.ES2018, lib: [ 'es2018' ], skipDefaultLibCheck: true }); const program = ts.createProgram([ dtsFilePath ], compilerOptions); const diagnostics = program.getSemanticDiagnostics(); // Using toHaveLength causes indefinite hang expect(diagnostics.length).toBe(0); }); }); }); /* Uninstall */ describe(`Uninstall`, () => { let projectPath: string; let tmpProjectPath: string; let tspDir: string; let tsDir: string; let cachePath: string; let modules: TsModule[]; let originalModulesSrc: Map; let tsPackage: TsPackage; beforeAll(() => { const prepRes = prepareTestProject({ projectName: 'main', packageManager }); projectPath = prepRes.projectPath; tmpProjectPath = prepRes.tmpProjectPath; tsPackage = getTsPackage(tsDir); originalModulesSrc = getModulesSources(tsPackage); tspDir = path.resolve(tmpProjectPath, 'node_modules', 'ts-patch'); tsDir = path.resolve(tmpProjectPath, 'node_modules', 'typescript'); cachePath = path.resolve(tspDir, '../.cache/ts-patch'); /* Install */ let runRes = runInstall(tspDir, 'api'); modules = runRes.modules; modules.forEach(m => { expect(m.isPatched).toBe(true); }); /* Uninstall */ runRes = runUninstall(tspDir, 'api'); modules = runRes.modules; }); test(`All modules unpatched`, () => { modules.forEach(m => { expect(m.isPatched).toBe(false); expect(m.moduleFile.patchDetail).toBeUndefined(); }); }); test(`All files match originals`, () => { for (const m of modules) { const origSrcEntry = originalModulesSrc.get(m.moduleName)!; if (m.dtsPath) { const src = fs.readFileSync(m.dtsPath, 'utf-8'); expect(src).toBe(origSrcEntry.dts); } const contentFilePath = TsModule.getContentFilePathForModulePath(m.modulePath); const src = fs.readFileSync(contentFilePath, 'utf-8'); expect(src).toBe(origSrcEntry.js); } }); test(`check() is accurate`, () => { const checkResult = check(undefined, tspOptions); tsPackage.moduleNames.forEach(m => expect(checkResult[m]).toBeUndefined()); }); }); }); }); nonara-ts-patch-ba6d37a/test/tests/package-config.test.ts000066400000000000000000000027601472416516200235240ustar00rootroot00000000000000import { execSync } from 'child_process'; import path from 'path'; import { assetsDir } from '../src/config'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const modes = ['enabled', 'disabled']; // endregion /* ****************************************************************************************************************** * * Tests * ****************************************************************************************************************** */ describe(`Project Package Config`, () => { const projectPath = path.resolve(assetsDir, 'projects/package-config'); describe.each(modes)(`Config present = %s`, (mode) => { let output: string; beforeAll(() => { const command = `node run-transform.js ${mode === 'disabled' ? '--disable' : ''}`; output = execSync(command, { cwd: projectPath }).toString('utf8'); }); test(`Tags are ${mode === 'enabled' ? '' : 'not '}identified`, () => { const expectedOutput = mode === 'enabled' ? 'const myVar = "ExampleTag1 ExampleTag2";' : 'const myVar = 123;'; expect(output).toMatch(new RegExp(`^${expectedOutput}$`, 'm')); }); test(`Chained transformer works`, () => { // All lines should be prefixed with `const ` instead of `let ` expect(output).toMatch(/^const /m); }); }); }); nonara-ts-patch-ba6d37a/test/tests/path-mapping.test.ts000066400000000000000000000025401472416516200232470ustar00rootroot00000000000000import { prepareTestProject } from '../src/project'; import { execSync } from 'child_process'; import path from 'path'; /* ****************************************************************************************************************** * * Tests * ****************************************************************************************************************** */ describe(`Path Mapping`, () => { let projectPath: string; let output: string[]; beforeAll(() => { const prepRes = prepareTestProject({ projectName: 'path-mapping', packageManager: 'yarn' }); projectPath = prepRes.tmpProjectPath; let commandOutput: string; try { commandOutput = execSync('tspc', { cwd: projectPath, env: { ...process.env, PATH: `${projectPath}/node_modules/.bin${path.delimiter}${process.env.PATH}` } }).toString(); } catch (e) { const err = new Error(e.stdout.toString() + '\n' + e.stderr.toString()); console.error(err); throw e; } output = commandOutput.trim().split('\n'); }); test(`Resolves sub-paths`, () => { expect(output[0]).toEqual('sub-path:true'); }); test(`Resolves direct paths`, () => { expect(output[1]).toEqual('path:true'); }); test(`Cannot resolve unmapped paths`, () => { expect(output[2]).toEqual('non-mapped:false'); }); }); nonara-ts-patch-ba6d37a/test/tests/transformer.test.ts000066400000000000000000000026441472416516200232310ustar00rootroot00000000000000import { prepareTestProject } from '../src/project'; import { execSync } from 'child_process'; /* ****************************************************************************************************************** */ // region: Config /* ****************************************************************************************************************** */ const transformerKinds = [ 'mts', 'ts', 'cts', 'mjs', 'cjs' ]; // endregion /* ****************************************************************************************************************** * * Tests * ****************************************************************************************************************** */ describe(`Transformer`, () => { let projectPath: string; let loaderResolve: (value?: unknown) => void; let loaderPromise = new Promise(resolve => loaderResolve = resolve); beforeAll(() => { const prepRes = prepareTestProject({ projectName: 'transform', packageManager: 'yarn', tsVersion: '5.5.2', }); projectPath = prepRes.tmpProjectPath; loaderResolve(); }); test.concurrent.each(transformerKinds)(`%s transformer works`, async (transformerKind: string) => { await loaderPromise; const res = execSync(`node run-transform.js ${transformerKind}`, { cwd: projectPath }); expect(res.toString('utf8')).toMatch(new RegExp(`^(?:var|const) a = "after-${transformerKind}";?$`, 'm')); }); }); nonara-ts-patch-ba6d37a/test/tests/webpack.test.ts000066400000000000000000000043411472416516200222770ustar00rootroot00000000000000import { execSync, ExecSyncOptions } from 'child_process'; import { prepareTestProject } from '../src/project'; /* ****************************************************************************************************************** */ // region: Helpers /* ****************************************************************************************************************** */ function execAndGetErr(projectPath: string, projectFile: string = '', hideModules?: string) { const extraOpts: ExecSyncOptions = { ...(hideModules ? { env: { ...process.env, HIDE_MODULES: hideModules } } : {}) }; const cmd = `ts-node ${hideModules ? '-r ./hide-module.js' : ''} -C ts-patch/compiler${projectFile ? ` -P ${projectFile}` : ''}` try { execSync( cmd, { cwd: projectPath, stdio: [ 'ignore', 'pipe', 'pipe' ], ...extraOpts }); } catch (e) { return e.stderr.toString(); } throw new Error('Expected error to be thrown, but none was'); } // endregion /* ****************************************************************************************************************** * * Tests * ****************************************************************************************************************** */ describe('Webpack', () => { let projectPath: string; beforeAll(() => { const prepRes = prepareTestProject({ projectName: 'webpack', packageManager: 'yarn' }); projectPath = prepRes.tmpProjectPath; }); test(`Compiler with CJS transformer works`, () => { const err = execAndGetErr(projectPath); expect(err).toContain('Error: ts-patch worked (cjs)'); }); test(`Compiler with ESM TS transformer works`, () => { const err = execAndGetErr(projectPath, './tsconfig.esmts.json'); expect(err).toContain('Error: ts-patch worked (esmts)'); }); test(`Compiler with ESM JS transformer works`, () => { const err = execAndGetErr(projectPath, './tsconfig.esm.json'); expect(err).toContain('Error: ts-patch worked (esm)'); }); test(`Compiler with ESM transformer throws if no ESM package`, () => { const err = execAndGetErr(projectPath, './tsconfig.esm.json', 'esm'); expect(err).toContain('To enable experimental ESM support, install the \'esm\' package'); }); }); nonara-ts-patch-ba6d37a/test/tsconfig.json000066400000000000000000000003151472416516200206770ustar00rootroot00000000000000{ "extends": "../tsconfig.base.json", "include": [ "src", "tests" ], "compilerOptions": { "noEmit": true, "target": "ESNext", "skipDefaultLibCheck": true, "skipLibCheck": true } } nonara-ts-patch-ba6d37a/tsconfig.base.json000066400000000000000000000007011472416516200206300ustar00rootroot00000000000000{ "compilerOptions": { "esModuleInterop": true, "strict": true, "noUnusedLocals": false, "noImplicitReturns": true, "forceConsistentCasingInFileNames": true, "useUnknownInCatchVariables": false, "lib": [ "es2020", "dom" ], "outDir": "dist", "target": "ES2020", "module": "CommonJS", "moduleResolution": "node", "newLine": "LF", "allowJs": false, "allowSyntheticDefaultImports": true } } nonara-ts-patch-ba6d37a/yarn.lock000066400000000000000000004711101472416516200170410ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@ampproject/remapping@^2.2.0": version "2.3.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== dependencies: "@babel/helper-validator-identifier" "^7.25.9" js-tokens "^4.0.0" picocolors "^1.0.0" "@babel/compat-data@^7.25.9": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.26.0" "@babel/generator" "^7.26.0" "@babel/helper-compilation-targets" "^7.25.9" "@babel/helper-module-transforms" "^7.26.0" "@babel/helpers" "^7.26.0" "@babel/parser" "^7.26.0" "@babel/template" "^7.25.9" "@babel/traverse" "^7.25.9" "@babel/types" "^7.26.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" "@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: "@babel/parser" "^7.26.3" "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" "@babel/helper-compilation-targets@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== dependencies: "@babel/compat-data" "^7.25.9" "@babel/helper-validator-option" "^7.25.9" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-module-imports@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== dependencies: "@babel/traverse" "^7.25.9" "@babel/types" "^7.25.9" "@babel/helper-module-transforms@^7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== dependencies: "@babel/helper-module-imports" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" "@babel/traverse" "^7.25.9" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz#9cbdd63a9443a2c92a725cca7ebca12cc8dd9f46" integrity sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw== "@babel/helper-string-parser@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== "@babel/helper-validator-identifier@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== "@babel/helper-validator-option@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== "@babel/helpers@^7.26.0": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== dependencies: "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: "@babel/types" "^7.26.3" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-bigint@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-import-attributes@^7.24.7": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.7.2": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: "@babel/helper-plugin-utils" "^7.25.9" "@babel/template@^7.25.9", "@babel/template@^7.3.3": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== dependencies: "@babel/code-frame" "^7.25.9" "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" "@babel/traverse@^7.25.9": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.3.tgz#1ebfc75bd748d8f96b3cc63af5e82ebd4c37ba35" integrity sha512-yTmc8J+Sj8yLzwr4PD5Xb/WF3bOYu2C2OoSZPzbuqRm4n98XirsbzaX+GloeO376UnSYIYJ4NCanwV5/ugZkwA== dependencies: "@babel/code-frame" "^7.26.2" "@babel/generator" "^7.26.3" "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3": version "7.26.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== dependencies: "@jridgewell/trace-mapping" "0.3.9" "@hutson/parse-repository-url@^3.0.0": version "3.0.2" resolved "https://registry.yarnpkg.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== dependencies: string-width "^5.1.2" string-width-cjs "npm:string-width@^4.2.0" strip-ansi "^7.0.1" strip-ansi-cjs "npm:strip-ansi@^6.0.1" wrap-ansi "^8.1.0" wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== dependencies: camelcase "^5.3.1" find-up "^4.1.0" get-package-type "^0.1.0" js-yaml "^3.13.1" resolve-from "^5.0.0" "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/console@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" jest-message-util "^29.7.0" jest-util "^29.7.0" slash "^3.0.0" "@jest/core@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== dependencies: "@jest/console" "^29.7.0" "@jest/reporters" "^29.7.0" "@jest/test-result" "^29.7.0" "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" jest-changed-files "^29.7.0" jest-config "^29.7.0" jest-haste-map "^29.7.0" jest-message-util "^29.7.0" jest-regex-util "^29.6.3" jest-resolve "^29.7.0" jest-resolve-dependencies "^29.7.0" jest-runner "^29.7.0" jest-runtime "^29.7.0" jest-snapshot "^29.7.0" jest-util "^29.7.0" jest-validate "^29.7.0" jest-watcher "^29.7.0" micromatch "^4.0.4" pretty-format "^29.7.0" slash "^3.0.0" strip-ansi "^6.0.0" "@jest/environment@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== dependencies: "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" jest-mock "^29.7.0" "@jest/expect-utils@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== dependencies: jest-get-type "^29.6.3" "@jest/expect@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: expect "^29.7.0" jest-snapshot "^29.7.0" "@jest/fake-timers@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== dependencies: "@jest/types" "^29.6.3" "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" jest-message-util "^29.7.0" jest-mock "^29.7.0" jest-util "^29.7.0" "@jest/globals@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== dependencies: "@jest/environment" "^29.7.0" "@jest/expect" "^29.7.0" "@jest/types" "^29.6.3" jest-mock "^29.7.0" "@jest/reporters@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== dependencies: "@bcoe/v8-coverage" "^0.2.3" "@jest/console" "^29.7.0" "@jest/test-result" "^29.7.0" "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" exit "^0.1.2" glob "^7.1.3" graceful-fs "^4.2.9" istanbul-lib-coverage "^3.0.0" istanbul-lib-instrument "^6.0.0" istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" jest-message-util "^29.7.0" jest-util "^29.7.0" jest-worker "^29.7.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== dependencies: "@sinclair/typebox" "^0.27.8" "@jest/source-map@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== dependencies: "@jridgewell/trace-mapping" "^0.3.18" callsites "^3.0.0" graceful-fs "^4.2.9" "@jest/test-result@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== dependencies: "@jest/console" "^29.7.0" "@jest/types" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" "@jest/test-sequencer@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== dependencies: "@jest/test-result" "^29.7.0" graceful-fs "^4.2.9" jest-haste-map "^29.7.0" slash "^3.0.0" "@jest/transform@^29.7.0": version "29.7.0" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== dependencies: "@babel/core" "^7.11.6" "@jest/types" "^29.6.3" "@jridgewell/trace-mapping" "^0.3.18" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" jest-haste-map "^29.7.0" jest-regex-util "^29.6.3" jest-util "^29.7.0" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" write-file-atomic "^4.0.2" "@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== dependencies: "@jest/schemas" "^29.6.3" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@sinclair/typebox@^0.27.8": version "0.27.8" resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": version "3.0.1" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" "@sinonjs/fake-timers@^10.0.2": version "10.3.0" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: "@sinonjs/commons" "^3.0.0" "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== "@tsconfig/node12@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": version "1.0.3" resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": version "1.0.4" resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/babel__core@^7.1.14": version "7.20.5" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": version "7.6.8" resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": version "7.4.4" resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": version "7.20.6" resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" "@types/esm@^3.2.2": version "3.2.2" resolved "https://registry.yarnpkg.com/@types/esm/-/esm-3.2.2.tgz#dd2de62e3e1d8b6ba3e835435d089928a090faa0" integrity sha512-l3IQQD2sChjNiQVNf28qq+sY9Sjvz7HrcOO3g4ZeSaiQRXQccBaR6cpqXPpzJ3QYCt6UF7+4ugabMRsQTPV+Eg== dependencies: "@types/node" "*" "@types/glob@~7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== dependencies: "@types/minimatch" "*" "@types/node" "*" "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": version "3.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" "@types/jest@^29.5.10": version "29.5.14" resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" "@types/minimatch@*": version "5.1.2" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== "@types/minimist@^1.2.0", "@types/minimist@^1.2.2": version "1.2.5" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/mock-fs@^4.13.1": version "4.13.4" resolved "https://registry.yarnpkg.com/@types/mock-fs/-/mock-fs-4.13.4.tgz#e73edb4b4889d44d23f1ea02d6eebe50aa30b09a" integrity sha512-mXmM0o6lULPI8z3XNnQCpL0BGxPwx1Ul1wXYEPBGl4efShyxW2Rln0JOPEWGyZaYZMM6OVXM/15zUuFMY52ljg== dependencies: "@types/node" "*" "@types/node@*": version "22.10.1" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.1.tgz#41ffeee127b8975a05f8c4f83fb89bcb2987d766" integrity sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ== dependencies: undici-types "~6.20.0" "@types/node@^16.11.5": version "16.18.121" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.121.tgz#88c4e91474b1eb4ae68e39cec8b274e9c792650a" integrity sha512-Gk/pOy8H0cvX8qNrwzElYIECpcUn87w4EAEFXFvPJ8qsP9QR/YqukUORSy0zmyDyvdo149idPpy4W6iC5aSbQA== "@types/normalize-package-data@^2.4.0": version "2.4.4" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/resolve@^1.20.1": version "1.20.6" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.6.tgz#e6e60dad29c2c8c206c026e6dd8d6d1bdda850b8" integrity sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ== "@types/semver@^7.3.13": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== "@types/shelljs@^0.8.9": version "0.8.15" resolved "https://registry.yarnpkg.com/@types/shelljs/-/shelljs-0.8.15.tgz#22c6ab9dfe05cec57d8e6cb1a95ea173aee9fcac" integrity sha512-vzmnCHl6hViPu9GNLQJ+DZFd6BQI2DBTUeOvYHqkWQLMfKAAQYMb/xAmZkTogZI/vqXHCWkqDRymDI5p0QTi5Q== dependencies: "@types/glob" "~7.2.0" "@types/node" "*" "@types/stack-utils@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": version "17.0.33" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== dependencies: "@types/yargs-parser" "*" JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: jsonparse "^1.2.0" through ">=2.2.7 <3" acorn-walk@^8.1.1: version "8.3.4" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== dependencies: acorn "^8.11.0" acorn@^8.11.0, acorn@^8.4.1: version "8.14.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-regex@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" ansi-styles@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== ansi-styles@^6.1.0: version "6.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== anymatch@^3.0.3: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== async@^3.2.3: version "3.2.6" resolved "https://registry.yarnpkg.com/async/-/async-3.2.6.tgz#1b0728e14929d51b85b449b7f06e27c1145e38ce" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== dependencies: "@jest/transform" "^29.7.0" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" babel-preset-jest "^29.6.3" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" babel-plugin-istanbul@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@istanbuljs/load-nyc-config" "^1.0.0" "@istanbuljs/schema" "^0.1.2" istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" babel-plugin-jest-hoist@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" babel-preset-current-node-syntax@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== dependencies: "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-bigint" "^7.8.3" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" babel-preset-jest@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== dependencies: babel-plugin-jest-hoist "^29.6.3" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" brace-expansion@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== dependencies: balanced-match "^1.0.0" braces@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.1.1" browserslist@^4.24.0: version "4.24.2" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== dependencies: caniuse-lite "^1.0.30001669" electron-to-chromium "^1.5.41" node-releases "^2.0.18" update-browserslist-db "^1.1.1" bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== dependencies: fast-json-stable-stringify "2.x" bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== dependencies: camelcase "^5.3.1" map-obj "^4.0.0" quick-lru "^4.0.1" camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.2.0: version "6.3.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001669: version "1.0.30001686" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz#0e04b8d90de8753188e93c9989d56cb19d902670" integrity sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA== chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^1.0.0: version "1.4.1" resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.0" wrap-ansi "^7.0.0" cliui@^8.0.1: version "8.0.1" resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: string-width "^4.2.0" strip-ansi "^6.0.1" wrap-ansi "^7.0.0" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: color-name "1.1.3" color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: color-name "~1.1.4" color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== compare-func@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== dependencies: array-ify "^1.0.0" dot-prop "^5.1.0" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== concat-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^3.0.2" typedarray "^0.0.6" conventional-changelog-angular@^5.0.12: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== dependencies: compare-func "^2.0.0" q "^1.5.1" conventional-changelog-atom@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz#a759ec61c22d1c1196925fca88fe3ae89fd7d8de" integrity sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw== dependencies: q "^1.5.1" conventional-changelog-codemirror@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz#398e9530f08ce34ec4640af98eeaf3022eb1f7dc" integrity sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw== dependencies: q "^1.5.1" conventional-changelog-config-spec@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz#874a635287ef8b581fd8558532bf655d4fb59f2d" integrity sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ== conventional-changelog-conventionalcommits@4.6.3, conventional-changelog-conventionalcommits@^4.5.0: version "4.6.3" resolved "https://registry.yarnpkg.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2" integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== dependencies: compare-func "^2.0.0" lodash "^4.17.15" q "^1.5.1" conventional-changelog-core@^4.2.1: version "4.2.4" resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== dependencies: add-stream "^1.0.0" conventional-changelog-writer "^5.0.0" conventional-commits-parser "^3.2.0" dateformat "^3.0.0" get-pkg-repo "^4.0.0" git-raw-commits "^2.0.8" git-remote-origin-url "^2.0.0" git-semver-tags "^4.1.1" lodash "^4.17.15" normalize-package-data "^3.0.0" q "^1.5.1" read-pkg "^3.0.0" read-pkg-up "^3.0.0" through2 "^4.0.0" conventional-changelog-ember@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz#619b37ec708be9e74a220f4dcf79212ae1c92962" integrity sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A== dependencies: q "^1.5.1" conventional-changelog-eslint@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz#689bd0a470e02f7baafe21a495880deea18b7cdb" integrity sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA== dependencies: q "^1.5.1" conventional-changelog-express@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz#420c9d92a347b72a91544750bffa9387665a6ee8" integrity sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ== dependencies: q "^1.5.1" conventional-changelog-jquery@^3.0.11: version "3.0.11" resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz#d142207400f51c9e5bb588596598e24bba8994bf" integrity sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw== dependencies: q "^1.5.1" conventional-changelog-jshint@^2.0.9: version "2.0.9" resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz#f2d7f23e6acd4927a238555d92c09b50fe3852ff" integrity sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA== dependencies: compare-func "^2.0.0" q "^1.5.1" conventional-changelog-preset-loader@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== conventional-changelog-writer@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== dependencies: conventional-commits-filter "^2.0.7" dateformat "^3.0.0" handlebars "^4.7.7" json-stringify-safe "^5.0.1" lodash "^4.17.15" meow "^8.0.0" semver "^6.0.0" split "^1.0.0" through2 "^4.0.0" conventional-changelog@3.1.25: version "3.1.25" resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-3.1.25.tgz#3e227a37d15684f5aa1fb52222a6e9e2536ccaff" integrity sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ== dependencies: conventional-changelog-angular "^5.0.12" conventional-changelog-atom "^2.0.8" conventional-changelog-codemirror "^2.0.8" conventional-changelog-conventionalcommits "^4.5.0" conventional-changelog-core "^4.2.1" conventional-changelog-ember "^2.0.9" conventional-changelog-eslint "^3.0.9" conventional-changelog-express "^2.0.6" conventional-changelog-jquery "^3.0.11" conventional-changelog-jshint "^2.0.9" conventional-changelog-preset-loader "^2.3.4" conventional-commits-filter@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" conventional-commits-parser@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" meow "^8.0.0" split2 "^3.0.0" through2 "^4.0.0" conventional-recommended-bump@6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== dependencies: concat-stream "^2.0.0" conventional-changelog-preset-loader "^2.3.4" conventional-commits-filter "^2.0.7" conventional-commits-parser "^3.2.0" git-raw-commits "^2.0.8" git-semver-tags "^4.1.1" meow "^8.0.0" q "^1.5.1" convert-source-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== create-jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== dependencies: "@jest/types" "^29.6.3" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" jest-config "^29.7.0" jest-util "^29.7.0" prompts "^2.0.1" create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" which "^2.0.1" dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: version "4.3.7" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== dependencies: ms "^2.1.3" decamelize-keys@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== dependencies: decamelize "^1.1.0" map-obj "^1.0.0" decamelize@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== dedent@^1.0.0: version "1.5.3" resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== deepmerge@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== detect-indent@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== detect-newline@^3.0.0, detect-newline@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== diff-sequences@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== dot-prop@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== dependencies: is-obj "^2.0.0" dotgitignore@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/dotgitignore/-/dotgitignore-2.1.0.tgz#a4b15a4e4ef3cf383598aaf1dfa4a04bcc089b7b" integrity sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA== dependencies: find-up "^3.0.0" minimatch "^3.0.4" eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== ejs@^3.1.10: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== dependencies: jake "^10.8.5" electron-to-chromium@^1.5.41: version "1.5.68" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz#4f46be4d465ef00e2100d5557b66f4af70e3ce6c" integrity sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ== emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== emoji-regex@^9.2.2: version "9.2.2" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.0" human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" npm-run-path "^4.0.1" onetime "^5.1.2" signal-exit "^3.0.3" strip-final-newline "^2.0.0" exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== expect@^29.0.0, expect@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: "@jest/expect-utils" "^29.7.0" jest-get-type "^29.6.3" jest-matcher-utils "^29.7.0" jest-message-util "^29.7.0" jest-util "^29.7.0" fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fb-watchman@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== dependencies: bser "2.1.1" figures@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== dependencies: escape-string-regexp "^1.0.5" filelist@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== dependencies: minimatch "^5.0.1" fill-range@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: locate-path "^5.0.0" path-exists "^4.0.0" find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: locate-path "^6.0.0" path-exists "^4.0.0" foreground-child@^3.1.0: version "3.3.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== dependencies: cross-spawn "^7.0.0" signal-exit "^4.0.1" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== get-package-type@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-pkg-repo@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== dependencies: "@hutson/parse-repository-url" "^3.0.0" hosted-git-info "^4.0.0" through2 "^2.0.0" yargs "^16.2.0" get-stream@^6.0.0: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== dependencies: dargs "^7.0.0" lodash "^4.17.15" meow "^8.0.0" split2 "^3.0.0" through2 "^4.0.0" git-remote-origin-url@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== dependencies: gitconfiglocal "^1.0.0" pify "^2.3.0" git-semver-tags@^4.0.0, git-semver-tags@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== dependencies: meow "^8.0.0" semver "^6.0.0" gitconfiglocal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== dependencies: ini "^1.3.2" glob@^10.3.7: version "10.4.5" resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" minipass "^7.1.2" package-json-from-dist "^1.0.0" path-scurry "^1.11.1" glob@^7.0.0, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 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" global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== dependencies: ini "^1.3.5" kind-of "^6.0.2" which "^1.3.1" global-prefix@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-4.0.0.tgz#e9cc79aab9be1d03287e156a3f912dd0895463ed" integrity sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA== dependencies: ini "^4.1.3" kind-of "^6.0.3" which "^4.0.0" globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.1.2, graceful-fs@^4.2.9: version "4.2.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== handlebars@^4.7.7: version "4.7.8" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: uglify-js "^3.1.4" hard-rejection@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== hasown@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^4.0.0, hosted-git-info@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== dependencies: lru-cache "^6.0.0" html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== import-local@^3.0.2: version "3.2.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== dependencies: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== ini@^1.3.2, ini@^1.3.5: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.3.tgz#4c359675a6071a46985eb39b14e4a2c0ec98a795" integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== interpret@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-core-module@^2.13.0, is-core-module@^2.5.0: version "2.15.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: hasown "^2.0.2" is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-obj@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-text-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== dependencies: text-extensions "^1.0.0" isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== isexe@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^5.0.4: version "5.2.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== dependencies: "@babel/core" "^7.12.3" "@babel/parser" "^7.14.7" "@istanbuljs/schema" "^0.1.2" istanbul-lib-coverage "^3.2.0" semver "^6.3.0" istanbul-lib-instrument@^6.0.0: version "6.0.3" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== dependencies: "@babel/core" "^7.23.9" "@babel/parser" "^7.23.9" "@istanbuljs/schema" "^0.1.3" istanbul-lib-coverage "^3.2.0" semver "^7.5.4" istanbul-lib-report@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: debug "^4.1.1" istanbul-lib-coverage "^3.0.0" source-map "^0.6.1" istanbul-reports@^3.1.3: version "3.1.7" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" jake@^10.8.5: version "10.9.2" resolved "https://registry.yarnpkg.com/jake/-/jake-10.9.2.tgz#6ae487e6a69afec3a5e167628996b59f35ae2b7f" integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== dependencies: async "^3.2.3" chalk "^4.0.2" filelist "^1.0.4" minimatch "^3.1.2" jest-changed-files@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== dependencies: execa "^5.0.0" jest-util "^29.7.0" p-limit "^3.1.0" jest-circus@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== dependencies: "@jest/environment" "^29.7.0" "@jest/expect" "^29.7.0" "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^1.0.0" is-generator-fn "^2.0.0" jest-each "^29.7.0" jest-matcher-utils "^29.7.0" jest-message-util "^29.7.0" jest-runtime "^29.7.0" jest-snapshot "^29.7.0" jest-util "^29.7.0" p-limit "^3.1.0" pretty-format "^29.7.0" pure-rand "^6.0.0" slash "^3.0.0" stack-utils "^2.0.3" jest-cli@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== dependencies: "@jest/core" "^29.7.0" "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" chalk "^4.0.0" create-jest "^29.7.0" exit "^0.1.2" import-local "^3.0.2" jest-config "^29.7.0" jest-util "^29.7.0" jest-validate "^29.7.0" yargs "^17.3.1" jest-config@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== dependencies: "@babel/core" "^7.11.6" "@jest/test-sequencer" "^29.7.0" "@jest/types" "^29.6.3" babel-jest "^29.7.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" jest-circus "^29.7.0" jest-environment-node "^29.7.0" jest-get-type "^29.6.3" jest-regex-util "^29.6.3" jest-resolve "^29.7.0" jest-runner "^29.7.0" jest-util "^29.7.0" jest-validate "^29.7.0" micromatch "^4.0.4" parse-json "^5.2.0" pretty-format "^29.7.0" slash "^3.0.0" strip-json-comments "^3.1.1" jest-diff@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== dependencies: chalk "^4.0.0" diff-sequences "^29.6.3" jest-get-type "^29.6.3" pretty-format "^29.7.0" jest-docblock@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== dependencies: detect-newline "^3.0.0" jest-each@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== dependencies: "@jest/types" "^29.6.3" chalk "^4.0.0" jest-get-type "^29.6.3" jest-util "^29.7.0" pretty-format "^29.7.0" jest-environment-node@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== dependencies: "@jest/environment" "^29.7.0" "@jest/fake-timers" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" jest-mock "^29.7.0" jest-util "^29.7.0" jest-get-type@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== jest-haste-map@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: "@jest/types" "^29.6.3" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.6.3" jest-util "^29.7.0" jest-worker "^29.7.0" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" jest-leak-detector@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== dependencies: jest-get-type "^29.6.3" pretty-format "^29.7.0" jest-matcher-utils@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== dependencies: chalk "^4.0.0" jest-diff "^29.7.0" jest-get-type "^29.6.3" pretty-format "^29.7.0" jest-message-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== dependencies: "@babel/code-frame" "^7.12.13" "@jest/types" "^29.6.3" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" pretty-format "^29.7.0" slash "^3.0.0" stack-utils "^2.0.3" jest-mock@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" jest-util "^29.7.0" jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== jest-regex-util@^29.6.3: version "29.6.3" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== jest-resolve-dependencies@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== dependencies: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" jest-resolve@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" jest-haste-map "^29.7.0" jest-pnp-resolver "^1.2.2" jest-util "^29.7.0" jest-validate "^29.7.0" resolve "^1.20.0" resolve.exports "^2.0.0" slash "^3.0.0" jest-runner@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== dependencies: "@jest/console" "^29.7.0" "@jest/environment" "^29.7.0" "@jest/test-result" "^29.7.0" "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.7.0" jest-environment-node "^29.7.0" jest-haste-map "^29.7.0" jest-leak-detector "^29.7.0" jest-message-util "^29.7.0" jest-resolve "^29.7.0" jest-runtime "^29.7.0" jest-util "^29.7.0" jest-watcher "^29.7.0" jest-worker "^29.7.0" p-limit "^3.1.0" source-map-support "0.5.13" jest-runtime@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== dependencies: "@jest/environment" "^29.7.0" "@jest/fake-timers" "^29.7.0" "@jest/globals" "^29.7.0" "@jest/source-map" "^29.6.3" "@jest/test-result" "^29.7.0" "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" jest-haste-map "^29.7.0" jest-message-util "^29.7.0" jest-mock "^29.7.0" jest-regex-util "^29.6.3" jest-resolve "^29.7.0" jest-snapshot "^29.7.0" jest-util "^29.7.0" slash "^3.0.0" strip-bom "^4.0.0" jest-snapshot@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/types" "^7.3.3" "@jest/expect-utils" "^29.7.0" "@jest/transform" "^29.7.0" "@jest/types" "^29.6.3" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" expect "^29.7.0" graceful-fs "^4.2.9" jest-diff "^29.7.0" jest-get-type "^29.6.3" jest-matcher-utils "^29.7.0" jest-message-util "^29.7.0" jest-util "^29.7.0" natural-compare "^1.4.0" pretty-format "^29.7.0" semver "^7.5.3" jest-util@^29.0.0, jest-util@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: "@jest/types" "^29.6.3" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" jest-validate@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== dependencies: "@jest/types" "^29.6.3" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.6.3" leven "^3.1.0" pretty-format "^29.7.0" jest-watcher@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== dependencies: "@jest/test-result" "^29.7.0" "@jest/types" "^29.6.3" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" jest-util "^29.7.0" string-length "^4.0.1" jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: "@types/node" "*" jest-util "^29.7.0" merge-stream "^2.0.0" supports-color "^8.0.0" jest@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" "@jest/types" "^29.6.3" import-local "^3.0.2" jest-cli "^29.7.0" js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" jsesc@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" pify "^3.0.0" strip-bom "^3.0.0" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: p-locate "^4.1.0" locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: p-locate "^5.0.0" lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== lodash@^4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== lru-cache@^10.2.0: version "10.4.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== dependencies: yallist "^4.0.0" make-dir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: semver "^7.5.3" make-error@^1.1.1, make-error@^1.3.6: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: tmpl "1.0.5" map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== map-obj@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== dependencies: "@types/minimist" "^1.2.0" camelcase-keys "^6.2.2" decamelize-keys "^1.1.0" hard-rejection "^2.1.0" minimist-options "4.1.0" normalize-package-data "^3.0.0" read-pkg-up "^7.0.1" redent "^3.0.0" trim-newlines "^3.0.0" type-fest "^0.18.0" yargs-parser "^20.2.3" merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== micromatch@^4.0.4: version "4.0.8" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.3" picomatch "^2.3.1" mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" minimatch@^5.0.1: version "5.1.6" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" minimatch@^9.0.4: version "9.0.5" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== dependencies: brace-expansion "^2.0.1" minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== dependencies: arrify "^1.0.1" is-plain-obj "^1.1.0" kind-of "^6.0.3" minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== "minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== modify-values@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== node-releases@^2.0.18: version "2.0.18" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== dependencies: hosted-git-info "^4.0.1" is-core-module "^2.5.0" semver "^7.3.4" validate-npm-package-license "^3.0.1" normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" p-limit@^3.0.2, p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: p-limit "^2.2.0" p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: p-limit "^3.0.2" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== package-json-from-dist@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-scurry@^1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" picocolors@^1.0.0, picocolors@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== pirates@^4.0.4: version "4.0.6" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: find-up "^4.0.0" pretty-format@^29.0.0, pretty-format@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: "@jest/schemas" "^29.6.3" ansi-styles "^5.0.0" react-is "^18.0.0" process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== prompts@^2.0.1: version "2.4.2" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" pure-rand@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== quick-lru@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== react-is@^18.0.0: version "18.3.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== dependencies: find-up "^4.1.0" read-pkg "^5.2.0" type-fest "^0.8.1" read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" path-type "^3.0.0" read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== dependencies: "@types/normalize-package-data" "^2.4.0" normalize-package-data "^2.5.0" parse-json "^5.0.0" type-fest "^0.6.0" readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.1.1" util-deprecate "~1.0.1" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== dependencies: resolve "^1.1.6" redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== dependencies: indent-string "^4.0.0" strip-indent "^3.0.0" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: resolve-from "^5.0.0" resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0, resolve@^1.22.2: version "1.22.8" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" rimraf@^5.0.7: version "5.0.10" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c" integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== dependencies: glob "^10.3.7" safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== "semver@2 || 3 || 4 || 5": version "5.7.2" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.1.1, semver@^7.3.4, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: shebang-regex "^3.0.0" shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shelljs@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== dependencies: glob "^7.0.0" interpret "^1.0.0" rechoir "^0.6.2" signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== signal-exit@^4.0.1: version "4.1.0" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== source-map-support@0.5.13: version "0.5.13" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.5.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== spdx-expression-parse@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: version "3.0.20" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz#e44ed19ed318dd1e5888f93325cee800f0f51b89" integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== split2@^3.0.0: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== dependencies: readable-stream "^3.0.0" split@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== dependencies: through "2" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" standard-version@^9.5.0: version "9.5.0" resolved "https://registry.yarnpkg.com/standard-version/-/standard-version-9.5.0.tgz#851d6dcddf5320d5079601832aeb185dbf497949" integrity sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q== dependencies: chalk "^2.4.2" conventional-changelog "3.1.25" conventional-changelog-config-spec "2.1.0" conventional-changelog-conventionalcommits "4.6.3" conventional-recommended-bump "6.1.0" detect-indent "^6.0.0" detect-newline "^3.1.0" dotgitignore "^2.1.0" figures "^3.1.0" find-up "^5.0.0" git-semver-tags "^4.0.0" semver "^7.1.1" stringify-package "^1.0.1" yargs "^16.0.0" string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" "string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: eastasianwidth "^0.2.0" emoji-regex "^9.2.2" strip-ansi "^7.0.1" string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" stringify-package@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85" integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg== "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== strip-indent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== dependencies: min-indent "^1.0.0" strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" supports-color@^8.0.0: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: has-flag "^4.0.0" supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: "@istanbuljs/schema" "^0.1.2" glob "^7.1.4" minimatch "^3.0.4" text-extensions@^1.0.0: version "1.9.0" resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: readable-stream "~2.3.6" xtend "~4.0.1" through2@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== dependencies: readable-stream "3" through@2, "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== "ts-expose-internals@npm:ts-expose-internals@5.4.5": version "5.4.5" resolved "https://registry.yarnpkg.com/ts-expose-internals/-/ts-expose-internals-5.4.5.tgz#94da2b665627135ad1281d98af3ccb08cb4c1950" integrity sha512-0HfRwjgSIOyuDlHzkFedMWU4aHWq9pu4MUKHgH75U+L76wCAtK5WB0rc/dAIhulMRcPUlcKONeiiR5Sxy/7XcA== ts-jest@^29.1.1: version "29.2.5" resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: bs-logger "^0.2.6" ejs "^3.1.10" fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" lodash.memoize "^4.1.2" make-error "^1.3.6" semver "^7.6.3" yargs-parser "^21.1.1" "ts-next@npm:typescript@beta": version "5.7.0-beta" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.0-beta.tgz#aa00db901d281b09d9456e6a281d8df4a2de77ab" integrity sha512-opDlmEnzKdl082N5piLS43lsyugg0aORdv+XnNzMv5yP5VtBWuZhFDxU8lizmhW+PEFa/fZiShYRBxKsrkTDMQ== ts-node@^10.9.1: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" "@tsconfig/node16" "^1.0.2" acorn "^8.4.1" acorn-walk "^8.1.1" arg "^4.1.0" create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" v8-compile-cache-lib "^3.0.1" yn "3.1.1" ts-patch@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ts-patch/-/ts-patch-3.2.1.tgz#0c1ecfcb6b6633bf23e533016ffda4d566518628" integrity sha512-hlR43v+GUIUy8/ZGFP1DquEqPh7PFKQdDMTAmYt671kCCA6AkDQMoeFaFmZ7ObPLYOmpMgyKUqL1C+coFMf30w== dependencies: chalk "^4.1.2" global-prefix "^3.0.0" minimist "^1.2.8" resolve "^1.22.2" semver "^7.5.4" strip-ansi "^6.0.1" tsconfig-paths@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== dependencies: json5 "^2.2.2" minimist "^1.2.6" strip-bom "^3.0.0" type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@5.5.2: version "5.5.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.2.tgz#c26f023cb0054e657ce04f72583ea2d85f8d0507" integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== uglify-js@^3.1.4: version "3.19.3" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== undici-types@~6.20.0: version "6.20.0" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== update-browserslist-db@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5" integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== dependencies: escalade "^3.2.0" picocolors "^1.1.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-to-istanbul@^9.0.1: version "9.3.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^2.0.0" validate-npm-package-license@^3.0.1: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: makeerror "1.0.12" which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" which@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/which/-/which-4.0.0.tgz#cd60b5e74503a3fbcfbf6cd6b4138a8bae644c1a" integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== dependencies: isexe "^3.1.1" wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: ansi-styles "^4.0.0" string-width "^4.1.0" strip-ansi "^6.0.0" wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" strip-ansi "^7.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargs-parser@^20.2.2, yargs-parser@^20.2.3: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== yargs@^16.0.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: cliui "^7.0.2" escalade "^3.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" string-width "^4.2.0" y18n "^5.0.5" yargs-parser "^20.2.2" yargs@^17.3.1: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 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" yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==