From 216dd07afc584329c91bec41fdad4bb0c30daa3d Mon Sep 17 00:00:00 2001 From: Keith E Campbell Date: Tue, 14 Jul 2026 16:16:46 -0700 Subject: [PATCH] Add JPMS module wrapper for httpclient 4.5.14 --- .editorconfig | 1312 +++++++++++++++++ .gitattributes | 137 ++ .github/ISSUE_TEMPLATE/config.yaml | 1 + .../ISSUE_TEMPLATE/non-technical-issue.yml | 39 + .github/ISSUE_TEMPLATE/techIssue.yml | 60 + .github/workflows/build.yaml | 30 + .github/workflows/post_build.yaml | 43 + .github/workflows/release.yaml | 87 ++ .gitignore | 230 +++ .mvn/extensions.xml | 10 + .mvn/jvm.config | 0 .mvn/maven.config | 0 .mvn/wrapper/maven-wrapper.properties | 19 + LICENSE | 201 +++ README.md | 49 +- doc/how-to-contribute.md | 139 ++ doc/images/git-concurrent-development.jpg | Bin 0 -> 72517 bytes mvnw | 259 ++++ mvnw.cmd | 149 ++ pom.xml | 200 +++ 20 files changed, 2964 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/config.yaml create mode 100644 .github/ISSUE_TEMPLATE/non-technical-issue.yml create mode 100644 .github/ISSUE_TEMPLATE/techIssue.yml create mode 100644 .github/workflows/build.yaml create mode 100644 .github/workflows/post_build.yaml create mode 100644 .github/workflows/release.yaml create mode 100644 .gitignore create mode 100644 .mvn/extensions.xml create mode 100644 .mvn/jvm.config create mode 100644 .mvn/maven.config create mode 100644 .mvn/wrapper/maven-wrapper.properties create mode 100644 LICENSE create mode 100644 doc/how-to-contribute.md create mode 100644 doc/images/git-concurrent-development.jpg create mode 100755 mvnw create mode 100644 mvnw.cmd create mode 100644 pom.xml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8890b78 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,1312 @@ +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +max_line_length = 120 +tab_width = 4 +trim_trailing_whitespace = true +ij_continuation_indent_size = 8 +ij_formatter_off_tag = @formatter:off +ij_formatter_on_tag = @formatter:on +ij_formatter_tags_enabled = false +ij_smart_tabs = false +ij_visual_guides = none +ij_wrap_on_typing = false + +[Makefile] +indent_style = tab + +[*.css] +ij_css_align_closing_brace_with_properties = false +ij_css_blank_lines_around_nested_selector = 1 +ij_css_blank_lines_between_blocks = 1 +ij_css_block_comment_add_space = false +ij_css_brace_placement = end_of_line +ij_css_enforce_quotes_on_format = false +ij_css_hex_color_long_format = false +ij_css_hex_color_lower_case = false +ij_css_hex_color_short_format = false +ij_css_hex_color_upper_case = false +ij_css_keep_blank_lines_in_code = 2 +ij_css_keep_indents_on_empty_lines = false +ij_css_keep_single_line_blocks = false +ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_css_space_after_colon = true +ij_css_space_before_opening_brace = true +ij_css_use_double_quotes = true +ij_css_value_alignment = do_not_align + +[*.feature] +indent_size = 2 +ij_gherkin_keep_indents_on_empty_lines = false + +[*.java] +max_line_length = 80 +ij_java_align_consecutive_assignments = false +ij_java_align_consecutive_variable_declarations = false +ij_java_align_group_field_declarations = false +ij_java_align_multiline_annotation_parameters = false +ij_java_align_multiline_array_initializer_expression = false +ij_java_align_multiline_assignment = false +ij_java_align_multiline_binary_operation = false +ij_java_align_multiline_chained_methods = false +ij_java_align_multiline_deconstruction_list_components = true +ij_java_align_multiline_extends_list = false +ij_java_align_multiline_for = true +ij_java_align_multiline_method_parentheses = false +ij_java_align_multiline_parameters = true +ij_java_align_multiline_parameters_in_calls = false +ij_java_align_multiline_parenthesized_expression = false +ij_java_align_multiline_records = true +ij_java_align_multiline_resources = true +ij_java_align_multiline_ternary_operation = false +ij_java_align_multiline_text_blocks = false +ij_java_align_multiline_throws_list = false +ij_java_align_subsequent_simple_methods = false +ij_java_align_throws_keyword = false +ij_java_align_types_in_multi_catch = true +ij_java_annotation_parameter_wrap = off +ij_java_array_initializer_new_line_after_left_brace = false +ij_java_array_initializer_right_brace_on_new_line = false +ij_java_array_initializer_wrap = normal +ij_java_assert_statement_colon_on_next_line = false +ij_java_assert_statement_wrap = normal +ij_java_assignment_wrap = normal +ij_java_binary_operation_sign_on_next_line = false +ij_java_binary_operation_wrap = normal +ij_java_blank_lines_after_anonymous_class_header = 0 +ij_java_blank_lines_after_class_header = 0 +ij_java_blank_lines_after_imports = 1 +ij_java_blank_lines_after_package = 1 +ij_java_blank_lines_around_class = 1 +ij_java_blank_lines_around_field = 0 +ij_java_blank_lines_around_field_in_interface = 0 +ij_java_blank_lines_around_initializer = 1 +ij_java_blank_lines_around_method = 1 +ij_java_blank_lines_around_method_in_interface = 1 +ij_java_blank_lines_before_class_end = 0 +ij_java_blank_lines_before_imports = 1 +ij_java_blank_lines_before_method_body = 0 +ij_java_blank_lines_before_package = 0 +ij_java_block_brace_style = end_of_line +ij_java_block_comment_add_space = false +ij_java_block_comment_at_first_column = true +ij_java_builder_methods = none +ij_java_call_parameters_new_line_after_left_paren = false +ij_java_call_parameters_right_paren_on_new_line = false +ij_java_call_parameters_wrap = normal +ij_java_case_statement_on_separate_line = true +ij_java_catch_on_new_line = false +ij_java_class_annotation_wrap = split_into_lines +ij_java_class_brace_style = end_of_line +ij_java_class_count_to_use_import_on_demand = 999 +ij_java_class_names_in_javadoc = 1 +ij_java_deconstruction_list_wrap = normal +ij_java_do_not_indent_top_level_class_members = false +ij_java_do_not_wrap_after_single_annotation = false +ij_java_do_not_wrap_after_single_annotation_in_parameter = false +ij_java_do_while_brace_force = always +ij_java_doc_add_blank_line_after_description = true +ij_java_doc_add_blank_line_after_param_comments = false +ij_java_doc_add_blank_line_after_return = false +ij_java_doc_add_p_tag_on_empty_lines = true +ij_java_doc_align_exception_comments = true +ij_java_doc_align_param_comments = true +ij_java_doc_do_not_wrap_if_one_line = false +ij_java_doc_enable_formatting = true +ij_java_doc_enable_leading_asterisks = true +ij_java_doc_indent_on_continuation = false +ij_java_doc_keep_empty_lines = true +ij_java_doc_keep_empty_parameter_tag = true +ij_java_doc_keep_empty_return_tag = true +ij_java_doc_keep_empty_throws_tag = true +ij_java_doc_keep_invalid_tags = true +ij_java_doc_param_description_on_new_line = false +ij_java_doc_preserve_line_breaks = false +ij_java_doc_use_throws_not_exception_tag = true +ij_java_else_on_new_line = false +ij_java_entity_dd_suffix = EJB +ij_java_entity_eb_suffix = Bean +ij_java_entity_hi_suffix = Home +ij_java_entity_lhi_prefix = Local +ij_java_entity_lhi_suffix = Home +ij_java_entity_li_prefix = Local +ij_java_entity_pk_class = java.lang.String +ij_java_entity_vo_suffix = VO +ij_java_enum_constants_wrap = normal +ij_java_extends_keyword_wrap = normal +ij_java_extends_list_wrap = normal +ij_java_field_annotation_wrap = split_into_lines +ij_java_finally_on_new_line = false +ij_java_for_brace_force = always +ij_java_for_statement_new_line_after_left_paren = false +ij_java_for_statement_right_paren_on_new_line = false +ij_java_for_statement_wrap = normal +ij_java_generate_final_locals = false +ij_java_generate_final_parameters = false +ij_java_if_brace_force = always +ij_java_imports_layout = *,|,javax.**,java.**,|,$* +ij_java_indent_case_from_switch = true +ij_java_insert_inner_class_imports = false +ij_java_insert_override_annotation = true +ij_java_keep_blank_lines_before_right_brace = 2 +ij_java_keep_blank_lines_between_package_declaration_and_header = 2 +ij_java_keep_blank_lines_in_code = 2 +ij_java_keep_blank_lines_in_declarations = 2 +ij_java_keep_builder_methods_indents = false +ij_java_keep_control_statement_in_one_line = true +ij_java_keep_first_column_comment = true +ij_java_keep_indents_on_empty_lines = false +ij_java_keep_line_breaks = true +ij_java_keep_multiple_expressions_in_one_line = false +ij_java_keep_simple_blocks_in_one_line = false +ij_java_keep_simple_classes_in_one_line = false +ij_java_keep_simple_lambdas_in_one_line = false +ij_java_keep_simple_methods_in_one_line = false +ij_java_label_indent_absolute = false +ij_java_label_indent_size = 0 +ij_java_lambda_brace_style = end_of_line +ij_java_layout_static_imports_separately = true +ij_java_line_comment_add_space = false +ij_java_line_comment_add_space_on_reformat = false +ij_java_line_comment_at_first_column = true +ij_java_message_dd_suffix = EJB +ij_java_message_eb_suffix = Bean +ij_java_method_annotation_wrap = split_into_lines +ij_java_method_brace_style = end_of_line +ij_java_method_call_chain_wrap = normal +ij_java_method_parameters_new_line_after_left_paren = false +ij_java_method_parameters_right_paren_on_new_line = false +ij_java_method_parameters_wrap = normal +ij_java_modifier_list_wrap = false +ij_java_multi_catch_types_wrap = normal +ij_java_names_count_to_use_import_on_demand = 999 +ij_java_new_line_after_lparen_in_annotation = false +ij_java_new_line_after_lparen_in_deconstruction_pattern = true +ij_java_new_line_after_lparen_in_record_header = false +ij_java_parameter_annotation_wrap = normal +ij_java_parentheses_expression_new_line_after_left_paren = false +ij_java_parentheses_expression_right_paren_on_new_line = false +ij_java_place_assignment_sign_on_next_line = false +ij_java_prefer_longer_names = true +ij_java_prefer_parameters_wrap = false +ij_java_record_components_wrap = normal +ij_java_repeat_synchronized = true +ij_java_replace_instanceof_and_cast = false +ij_java_replace_null_check = true +ij_java_replace_sum_lambda_with_method_ref = true +ij_java_resource_list_new_line_after_left_paren = false +ij_java_resource_list_right_paren_on_new_line = false +ij_java_resource_list_wrap = normal +ij_java_rparen_on_new_line_in_annotation = false +ij_java_rparen_on_new_line_in_deconstruction_pattern = true +ij_java_rparen_on_new_line_in_record_header = false +ij_java_session_dd_suffix = EJB +ij_java_session_eb_suffix = Bean +ij_java_session_hi_suffix = Home +ij_java_session_lhi_prefix = Local +ij_java_session_lhi_suffix = Home +ij_java_session_li_prefix = Local +ij_java_session_si_suffix = Service +ij_java_space_after_closing_angle_bracket_in_type_argument = false +ij_java_space_after_colon = true +ij_java_space_after_comma = true +ij_java_space_after_comma_in_type_arguments = true +ij_java_space_after_for_semicolon = true +ij_java_space_after_quest = true +ij_java_space_after_type_cast = true +ij_java_space_before_annotation_array_initializer_left_brace = false +ij_java_space_before_annotation_parameter_list = false +ij_java_space_before_array_initializer_left_brace = true +ij_java_space_before_catch_keyword = true +ij_java_space_before_catch_left_brace = true +ij_java_space_before_catch_parentheses = true +ij_java_space_before_class_left_brace = true +ij_java_space_before_colon = true +ij_java_space_before_colon_in_foreach = true +ij_java_space_before_comma = false +ij_java_space_before_deconstruction_list = false +ij_java_space_before_do_left_brace = true +ij_java_space_before_else_keyword = true +ij_java_space_before_else_left_brace = true +ij_java_space_before_finally_keyword = true +ij_java_space_before_finally_left_brace = true +ij_java_space_before_for_left_brace = true +ij_java_space_before_for_parentheses = true +ij_java_space_before_for_semicolon = false +ij_java_space_before_if_left_brace = true +ij_java_space_before_if_parentheses = true +ij_java_space_before_method_call_parentheses = false +ij_java_space_before_method_left_brace = true +ij_java_space_before_method_parentheses = false +ij_java_space_before_opening_angle_bracket_in_type_parameter = false +ij_java_space_before_quest = true +ij_java_space_before_switch_left_brace = true +ij_java_space_before_switch_parentheses = true +ij_java_space_before_synchronized_left_brace = true +ij_java_space_before_synchronized_parentheses = true +ij_java_space_before_try_left_brace = true +ij_java_space_before_try_parentheses = true +ij_java_space_before_type_parameter_list = false +ij_java_space_before_while_keyword = true +ij_java_space_before_while_left_brace = true +ij_java_space_before_while_parentheses = true +ij_java_space_inside_one_line_enum_braces = false +ij_java_space_within_empty_array_initializer_braces = false +ij_java_space_within_empty_method_call_parentheses = false +ij_java_space_within_empty_method_parentheses = false +ij_java_spaces_around_additive_operators = true +ij_java_spaces_around_annotation_eq = true +ij_java_spaces_around_assignment_operators = true +ij_java_spaces_around_bitwise_operators = true +ij_java_spaces_around_equality_operators = true +ij_java_spaces_around_lambda_arrow = true +ij_java_spaces_around_logical_operators = true +ij_java_spaces_around_method_ref_dbl_colon = false +ij_java_spaces_around_multiplicative_operators = true +ij_java_spaces_around_relational_operators = true +ij_java_spaces_around_shift_operators = true +ij_java_spaces_around_type_bounds_in_type_parameters = true +ij_java_spaces_around_unary_operator = false +ij_java_spaces_within_angle_brackets = false +ij_java_spaces_within_annotation_parentheses = false +ij_java_spaces_within_array_initializer_braces = false +ij_java_spaces_within_braces = false +ij_java_spaces_within_brackets = false +ij_java_spaces_within_cast_parentheses = false +ij_java_spaces_within_catch_parentheses = false +ij_java_spaces_within_deconstruction_list = false +ij_java_spaces_within_for_parentheses = false +ij_java_spaces_within_if_parentheses = false +ij_java_spaces_within_method_call_parentheses = false +ij_java_spaces_within_method_parentheses = false +ij_java_spaces_within_parentheses = false +ij_java_spaces_within_record_header = false +ij_java_spaces_within_switch_parentheses = false +ij_java_spaces_within_synchronized_parentheses = false +ij_java_spaces_within_try_parentheses = false +ij_java_spaces_within_while_parentheses = false +ij_java_special_else_if_treatment = true +ij_java_subclass_name_suffix = Impl +ij_java_ternary_operation_signs_on_next_line = false +ij_java_ternary_operation_wrap = normal +ij_java_test_name_suffix = Test +ij_java_throws_keyword_wrap = normal +ij_java_throws_list_wrap = normal +ij_java_use_external_annotations = false +ij_java_use_fq_class_names = false +ij_java_use_relative_indents = false +ij_java_use_single_class_imports = true +ij_java_variable_annotation_wrap = normal +ij_java_visibility = public +ij_java_while_brace_force = always +ij_java_while_on_new_line = false +ij_java_wrap_comments = false +ij_java_wrap_first_method_in_call_chain = false +ij_java_wrap_long_lines = false + +[*.less] +indent_size = 2 +ij_less_align_closing_brace_with_properties = false +ij_less_blank_lines_around_nested_selector = 1 +ij_less_blank_lines_between_blocks = 1 +ij_less_block_comment_add_space = false +ij_less_brace_placement = 0 +ij_less_enforce_quotes_on_format = false +ij_less_hex_color_long_format = false +ij_less_hex_color_lower_case = false +ij_less_hex_color_short_format = false +ij_less_hex_color_upper_case = false +ij_less_keep_blank_lines_in_code = 2 +ij_less_keep_indents_on_empty_lines = false +ij_less_keep_single_line_blocks = false +ij_less_line_comment_add_space = false +ij_less_line_comment_at_first_column = false +ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_less_space_after_colon = true +ij_less_space_before_opening_brace = true +ij_less_use_double_quotes = true +ij_less_value_alignment = 0 + +[*.liquid] +ij_liquid_keep_indents_on_empty_lines = false + +[*.proto] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_protobuf_keep_blank_lines_in_code = 2 +ij_protobuf_keep_indents_on_empty_lines = false +ij_protobuf_keep_line_breaks = true +ij_protobuf_space_after_comma = true +ij_protobuf_space_before_comma = false +ij_protobuf_spaces_around_assignment_operators = true +ij_protobuf_spaces_within_braces = false +ij_protobuf_spaces_within_brackets = false + +[*.sass] +indent_size = 2 +ij_sass_align_closing_brace_with_properties = false +ij_sass_blank_lines_around_nested_selector = 1 +ij_sass_blank_lines_between_blocks = 1 +ij_sass_brace_placement = 0 +ij_sass_enforce_quotes_on_format = false +ij_sass_hex_color_long_format = false +ij_sass_hex_color_lower_case = false +ij_sass_hex_color_short_format = false +ij_sass_hex_color_upper_case = false +ij_sass_keep_blank_lines_in_code = 2 +ij_sass_keep_indents_on_empty_lines = false +ij_sass_keep_single_line_blocks = false +ij_sass_line_comment_add_space = false +ij_sass_line_comment_at_first_column = false +ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_sass_space_after_colon = true +ij_sass_space_before_opening_brace = true +ij_sass_use_double_quotes = true +ij_sass_value_alignment = 0 + +[*.scss] +indent_size = 2 +ij_scss_align_closing_brace_with_properties = false +ij_scss_blank_lines_around_nested_selector = 1 +ij_scss_blank_lines_between_blocks = 1 +ij_scss_block_comment_add_space = false +ij_scss_brace_placement = 0 +ij_scss_enforce_quotes_on_format = false +ij_scss_hex_color_long_format = false +ij_scss_hex_color_lower_case = false +ij_scss_hex_color_short_format = false +ij_scss_hex_color_upper_case = false +ij_scss_keep_blank_lines_in_code = 2 +ij_scss_keep_indents_on_empty_lines = false +ij_scss_keep_single_line_blocks = false +ij_scss_line_comment_add_space = false +ij_scss_line_comment_at_first_column = false +ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow +ij_scss_space_after_colon = true +ij_scss_space_before_opening_brace = true +ij_scss_use_double_quotes = true +ij_scss_value_alignment = 0 + +[*.vue] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_vue_indent_children_of_top_level = template +ij_vue_interpolation_new_line_after_start_delimiter = true +ij_vue_interpolation_new_line_before_end_delimiter = true +ij_vue_interpolation_wrap = off +ij_vue_keep_indents_on_empty_lines = false +ij_vue_spaces_within_interpolation_expressions = true + +[.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 + +[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.qrc,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] +ij_xml_align_attributes = true +ij_xml_align_text = false +ij_xml_attribute_wrap = normal +ij_xml_block_comment_add_space = false +ij_xml_block_comment_at_first_column = true +ij_xml_keep_blank_lines = 2 +ij_xml_keep_indents_on_empty_lines = false +ij_xml_keep_line_breaks = true +ij_xml_keep_line_breaks_in_text = true +ij_xml_keep_whitespaces = false +ij_xml_keep_whitespaces_around_cdata = preserve +ij_xml_keep_whitespaces_inside_cdata = false +ij_xml_line_comment_at_first_column = true +ij_xml_space_after_tag_name = false +ij_xml_space_around_equals_in_attribute = false +ij_xml_space_inside_empty_tag = false +ij_xml_text_wrap = normal +ij_xml_use_custom_settings = false + +[{*.ats,*.cts,*.mts,*.ts}] +ij_continuation_indent_size = 4 +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/**,**/node_modules/**,@angular/material,@angular/material/typings/** +ij_typescript_blank_lines_after_imports = 1 +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 = 1 +ij_typescript_blank_lines_around_method = 1 +ij_typescript_blank_lines_around_method_in_interface = 1 +ij_typescript_block_brace_style = end_of_line +ij_typescript_block_comment_add_space = false +ij_typescript_block_comment_at_first_column = true +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 = false +ij_typescript_chained_call_dot_on_new_line = true +ij_typescript_class_brace_style = end_of_line +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_enum_constants_wrap = on_every_item +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 = false +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 = false +ij_typescript_force_semicolon_style = false +ij_typescript_function_expression_brace_style = end_of_line +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 = on_every_item +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 = false +ij_typescript_keep_simple_methods_in_one_line = false +ij_typescript_line_comment_add_space = true +ij_typescript_line_comment_at_first_column = false +ij_typescript_method_brace_style = end_of_line +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_explicit_types_function_expression_returns = false +ij_typescript_prefer_explicit_types_function_returns = false +ij_typescript_prefer_explicit_types_vars_fields = 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 = false +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 = false +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 = false +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 = true +ij_typescript_use_explicit_js_extension = auto +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 + +[{*.bash,*.sh,*.zsh}] +indent_size = 2 +tab_width = 2 +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 +ij_shell_use_unix_line_separator = true + +[{*.cjs,*.js}] +ij_continuation_indent_size = 4 +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/**,**/node_modules/**,@angular/material,@angular/material/typings/** +ij_javascript_blank_lines_after_imports = 1 +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 = 1 +ij_javascript_block_brace_style = end_of_line +ij_javascript_block_comment_add_space = false +ij_javascript_block_comment_at_first_column = true +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 = false +ij_javascript_chained_call_dot_on_new_line = true +ij_javascript_class_brace_style = end_of_line +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 = false +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 = end_of_line +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 = on_every_item +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 = false +ij_javascript_keep_simple_methods_in_one_line = false +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_explicit_types_function_expression_returns = false +ij_javascript_prefer_explicit_types_function_returns = false +ij_javascript_prefer_explicit_types_vars_fields = 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 = false +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 = false +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 = false +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_explicit_js_extension = auto +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 + +[{*.erb,*.rhtml}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 2 +ij_rhtml_keep_indents_on_empty_lines = false + +[{*.ft,*.vm,*.vsl}] +ij_vtl_keep_indents_on_empty_lines = false + +[{*.gant,*.groovy,*.gy}] +ij_groovy_align_group_field_declarations = false +ij_groovy_align_multiline_array_initializer_expression = false +ij_groovy_align_multiline_assignment = false +ij_groovy_align_multiline_binary_operation = false +ij_groovy_align_multiline_chained_methods = false +ij_groovy_align_multiline_extends_list = false +ij_groovy_align_multiline_for = true +ij_groovy_align_multiline_list_or_map = true +ij_groovy_align_multiline_method_parentheses = false +ij_groovy_align_multiline_parameters = true +ij_groovy_align_multiline_parameters_in_calls = false +ij_groovy_align_multiline_resources = true +ij_groovy_align_multiline_ternary_operation = false +ij_groovy_align_multiline_throws_list = false +ij_groovy_align_named_args_in_map = true +ij_groovy_align_throws_keyword = false +ij_groovy_array_initializer_new_line_after_left_brace = false +ij_groovy_array_initializer_right_brace_on_new_line = false +ij_groovy_array_initializer_wrap = off +ij_groovy_assert_statement_wrap = off +ij_groovy_assignment_wrap = off +ij_groovy_binary_operation_wrap = off +ij_groovy_blank_lines_after_class_header = 0 +ij_groovy_blank_lines_after_imports = 1 +ij_groovy_blank_lines_after_package = 1 +ij_groovy_blank_lines_around_class = 1 +ij_groovy_blank_lines_around_field = 0 +ij_groovy_blank_lines_around_field_in_interface = 0 +ij_groovy_blank_lines_around_method = 1 +ij_groovy_blank_lines_around_method_in_interface = 1 +ij_groovy_blank_lines_before_imports = 1 +ij_groovy_blank_lines_before_method_body = 0 +ij_groovy_blank_lines_before_package = 0 +ij_groovy_block_brace_style = end_of_line +ij_groovy_block_comment_add_space = false +ij_groovy_block_comment_at_first_column = true +ij_groovy_call_parameters_new_line_after_left_paren = false +ij_groovy_call_parameters_right_paren_on_new_line = false +ij_groovy_call_parameters_wrap = off +ij_groovy_catch_on_new_line = false +ij_groovy_class_annotation_wrap = split_into_lines +ij_groovy_class_brace_style = end_of_line +ij_groovy_class_count_to_use_import_on_demand = 5 +ij_groovy_do_while_brace_force = never +ij_groovy_else_on_new_line = false +ij_groovy_enable_groovydoc_formatting = true +ij_groovy_enum_constants_wrap = off +ij_groovy_extends_keyword_wrap = off +ij_groovy_extends_list_wrap = off +ij_groovy_field_annotation_wrap = split_into_lines +ij_groovy_finally_on_new_line = false +ij_groovy_for_brace_force = never +ij_groovy_for_statement_new_line_after_left_paren = false +ij_groovy_for_statement_right_paren_on_new_line = false +ij_groovy_for_statement_wrap = off +ij_groovy_ginq_general_clause_wrap_policy = 2 +ij_groovy_ginq_having_wrap_policy = 1 +ij_groovy_ginq_indent_having_clause = true +ij_groovy_ginq_indent_on_clause = true +ij_groovy_ginq_on_wrap_policy = 1 +ij_groovy_ginq_space_after_keyword = true +ij_groovy_if_brace_force = never +ij_groovy_import_annotation_wrap = 2 +ij_groovy_imports_layout = *,|,javax.**,java.**,|,$* +ij_groovy_indent_case_from_switch = true +ij_groovy_indent_label_blocks = true +ij_groovy_insert_inner_class_imports = false +ij_groovy_keep_blank_lines_before_right_brace = 2 +ij_groovy_keep_blank_lines_in_code = 2 +ij_groovy_keep_blank_lines_in_declarations = 2 +ij_groovy_keep_control_statement_in_one_line = true +ij_groovy_keep_first_column_comment = true +ij_groovy_keep_indents_on_empty_lines = false +ij_groovy_keep_line_breaks = true +ij_groovy_keep_multiple_expressions_in_one_line = false +ij_groovy_keep_simple_blocks_in_one_line = false +ij_groovy_keep_simple_classes_in_one_line = true +ij_groovy_keep_simple_lambdas_in_one_line = true +ij_groovy_keep_simple_methods_in_one_line = true +ij_groovy_label_indent_absolute = false +ij_groovy_label_indent_size = 0 +ij_groovy_lambda_brace_style = end_of_line +ij_groovy_layout_static_imports_separately = true +ij_groovy_line_comment_add_space = false +ij_groovy_line_comment_add_space_on_reformat = false +ij_groovy_line_comment_at_first_column = true +ij_groovy_method_annotation_wrap = split_into_lines +ij_groovy_method_brace_style = end_of_line +ij_groovy_method_call_chain_wrap = off +ij_groovy_method_parameters_new_line_after_left_paren = false +ij_groovy_method_parameters_right_paren_on_new_line = false +ij_groovy_method_parameters_wrap = off +ij_groovy_modifier_list_wrap = false +ij_groovy_names_count_to_use_import_on_demand = 3 +ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.* +ij_groovy_parameter_annotation_wrap = off +ij_groovy_parentheses_expression_new_line_after_left_paren = false +ij_groovy_parentheses_expression_right_paren_on_new_line = false +ij_groovy_prefer_parameters_wrap = false +ij_groovy_resource_list_new_line_after_left_paren = false +ij_groovy_resource_list_right_paren_on_new_line = false +ij_groovy_resource_list_wrap = off +ij_groovy_space_after_assert_separator = true +ij_groovy_space_after_colon = true +ij_groovy_space_after_comma = true +ij_groovy_space_after_comma_in_type_arguments = true +ij_groovy_space_after_for_semicolon = true +ij_groovy_space_after_quest = true +ij_groovy_space_after_type_cast = true +ij_groovy_space_before_annotation_parameter_list = false +ij_groovy_space_before_array_initializer_left_brace = false +ij_groovy_space_before_assert_separator = false +ij_groovy_space_before_catch_keyword = true +ij_groovy_space_before_catch_left_brace = true +ij_groovy_space_before_catch_parentheses = true +ij_groovy_space_before_class_left_brace = true +ij_groovy_space_before_closure_left_brace = true +ij_groovy_space_before_colon = true +ij_groovy_space_before_comma = false +ij_groovy_space_before_do_left_brace = true +ij_groovy_space_before_else_keyword = true +ij_groovy_space_before_else_left_brace = true +ij_groovy_space_before_finally_keyword = true +ij_groovy_space_before_finally_left_brace = true +ij_groovy_space_before_for_left_brace = true +ij_groovy_space_before_for_parentheses = true +ij_groovy_space_before_for_semicolon = false +ij_groovy_space_before_if_left_brace = true +ij_groovy_space_before_if_parentheses = true +ij_groovy_space_before_method_call_parentheses = false +ij_groovy_space_before_method_left_brace = true +ij_groovy_space_before_method_parentheses = false +ij_groovy_space_before_quest = true +ij_groovy_space_before_record_parentheses = false +ij_groovy_space_before_switch_left_brace = true +ij_groovy_space_before_switch_parentheses = true +ij_groovy_space_before_synchronized_left_brace = true +ij_groovy_space_before_synchronized_parentheses = true +ij_groovy_space_before_try_left_brace = true +ij_groovy_space_before_try_parentheses = true +ij_groovy_space_before_while_keyword = true +ij_groovy_space_before_while_left_brace = true +ij_groovy_space_before_while_parentheses = true +ij_groovy_space_in_named_argument = true +ij_groovy_space_in_named_argument_before_colon = false +ij_groovy_space_within_empty_array_initializer_braces = false +ij_groovy_space_within_empty_method_call_parentheses = false +ij_groovy_spaces_around_additive_operators = true +ij_groovy_spaces_around_assignment_operators = true +ij_groovy_spaces_around_bitwise_operators = true +ij_groovy_spaces_around_equality_operators = true +ij_groovy_spaces_around_lambda_arrow = true +ij_groovy_spaces_around_logical_operators = true +ij_groovy_spaces_around_multiplicative_operators = true +ij_groovy_spaces_around_regex_operators = true +ij_groovy_spaces_around_relational_operators = true +ij_groovy_spaces_around_shift_operators = true +ij_groovy_spaces_within_annotation_parentheses = false +ij_groovy_spaces_within_array_initializer_braces = false +ij_groovy_spaces_within_braces = true +ij_groovy_spaces_within_brackets = false +ij_groovy_spaces_within_cast_parentheses = false +ij_groovy_spaces_within_catch_parentheses = false +ij_groovy_spaces_within_for_parentheses = false +ij_groovy_spaces_within_gstring_injection_braces = false +ij_groovy_spaces_within_if_parentheses = false +ij_groovy_spaces_within_list_or_map = false +ij_groovy_spaces_within_method_call_parentheses = false +ij_groovy_spaces_within_method_parentheses = false +ij_groovy_spaces_within_parentheses = false +ij_groovy_spaces_within_switch_parentheses = false +ij_groovy_spaces_within_synchronized_parentheses = false +ij_groovy_spaces_within_try_parentheses = false +ij_groovy_spaces_within_tuple_expression = false +ij_groovy_spaces_within_while_parentheses = false +ij_groovy_special_else_if_treatment = true +ij_groovy_ternary_operation_wrap = off +ij_groovy_throws_keyword_wrap = off +ij_groovy_throws_list_wrap = off +ij_groovy_use_flying_geese_braces = false +ij_groovy_use_fq_class_names = false +ij_groovy_use_fq_class_names_in_javadoc = true +ij_groovy_use_relative_indents = false +ij_groovy_use_single_class_imports = true +ij_groovy_variable_annotation_wrap = off +ij_groovy_while_brace_force = never +ij_groovy_while_on_new_line = false +ij_groovy_wrap_chain_calls_after_dot = false +ij_groovy_wrap_long_lines = false + +[{*.gemspec,*.jbuilder,*.rake,*.rb,*.rbi,*.rbw,*.ru,*.thor,.simplecov,capfile,gemfile,guardfile,isolate,rakefile,steepfile,vagrantfile}] +ij_ruby_align_group_field_declarations = false +ij_ruby_align_multiline_parameters = true +ij_ruby_blank_lines_around_class = 1 +ij_ruby_blank_lines_around_method = 1 +ij_ruby_chain_calls_alignment = 2 +ij_ruby_convert_brace_block_by_enter = true +ij_ruby_empty_declarations_style = 1 +ij_ruby_force_newlines_around_visibility_mods = true +ij_ruby_indent_private_methods = false +ij_ruby_indent_protected_methods = false +ij_ruby_indent_public_methods = false +ij_ruby_indent_visibility_modifiers = true +ij_ruby_indent_when_cases = false +ij_ruby_keep_blank_lines_in_code = 1 +ij_ruby_keep_blank_lines_in_declarations = 1 +ij_ruby_keep_line_breaks = true +ij_ruby_parentheses_around_method_arguments = true +ij_ruby_spaces_around_assignment_operators = true +ij_ruby_spaces_around_hashrocket = true +ij_ruby_spaces_around_other_operators = true +ij_ruby_spaces_around_range_operators = false +ij_ruby_spaces_around_relational_operators = true +ij_ruby_spaces_within_array_initializer_braces = true +ij_ruby_spaces_within_braces = true +ij_ruby_spaces_within_pipes = false +ij_ruby_use_external_formatter = false + +[{*.gradle.kts,*.kt,*.kts,*.main.kts,*.space.kts}] +ij_kotlin_align_in_columns_case_branch = false +ij_kotlin_align_multiline_binary_operation = false +ij_kotlin_align_multiline_extends_list = false +ij_kotlin_align_multiline_method_parentheses = false +ij_kotlin_align_multiline_parameters = true +ij_kotlin_align_multiline_parameters_in_calls = false +ij_kotlin_allow_trailing_comma = false +ij_kotlin_allow_trailing_comma_on_call_site = false +ij_kotlin_assignment_wrap = off +ij_kotlin_blank_lines_after_class_header = 0 +ij_kotlin_blank_lines_around_block_when_branches = 0 +ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 +ij_kotlin_block_comment_add_space = false +ij_kotlin_block_comment_at_first_column = true +ij_kotlin_call_parameters_new_line_after_left_paren = false +ij_kotlin_call_parameters_right_paren_on_new_line = false +ij_kotlin_call_parameters_wrap = off +ij_kotlin_catch_on_new_line = false +ij_kotlin_class_annotation_wrap = split_into_lines +ij_kotlin_continuation_indent_for_chained_calls = true +ij_kotlin_continuation_indent_for_expression_bodies = true +ij_kotlin_continuation_indent_in_argument_lists = true +ij_kotlin_continuation_indent_in_elvis = true +ij_kotlin_continuation_indent_in_if_conditions = true +ij_kotlin_continuation_indent_in_parameter_lists = true +ij_kotlin_continuation_indent_in_supertype_lists = true +ij_kotlin_else_on_new_line = false +ij_kotlin_enum_constants_wrap = off +ij_kotlin_extends_list_wrap = off +ij_kotlin_field_annotation_wrap = split_into_lines +ij_kotlin_finally_on_new_line = false +ij_kotlin_if_rparen_on_new_line = false +ij_kotlin_import_nested_classes = false +ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ +ij_kotlin_insert_whitespaces_in_simple_one_line_method = true +ij_kotlin_keep_blank_lines_before_right_brace = 2 +ij_kotlin_keep_blank_lines_in_code = 2 +ij_kotlin_keep_blank_lines_in_declarations = 2 +ij_kotlin_keep_first_column_comment = true +ij_kotlin_keep_indents_on_empty_lines = false +ij_kotlin_keep_line_breaks = true +ij_kotlin_lbrace_on_next_line = false +ij_kotlin_line_break_after_multiline_when_entry = true +ij_kotlin_line_comment_add_space = false +ij_kotlin_line_comment_add_space_on_reformat = false +ij_kotlin_line_comment_at_first_column = true +ij_kotlin_method_annotation_wrap = split_into_lines +ij_kotlin_method_call_chain_wrap = off +ij_kotlin_method_parameters_new_line_after_left_paren = false +ij_kotlin_method_parameters_right_paren_on_new_line = false +ij_kotlin_method_parameters_wrap = off +ij_kotlin_name_count_to_use_star_import = 5 +ij_kotlin_name_count_to_use_star_import_for_members = 3 +ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.** +ij_kotlin_parameter_annotation_wrap = off +ij_kotlin_space_after_comma = true +ij_kotlin_space_after_extend_colon = true +ij_kotlin_space_after_type_colon = true +ij_kotlin_space_before_catch_parentheses = true +ij_kotlin_space_before_comma = false +ij_kotlin_space_before_extend_colon = true +ij_kotlin_space_before_for_parentheses = true +ij_kotlin_space_before_if_parentheses = true +ij_kotlin_space_before_lambda_arrow = true +ij_kotlin_space_before_type_colon = false +ij_kotlin_space_before_when_parentheses = true +ij_kotlin_space_before_while_parentheses = true +ij_kotlin_spaces_around_additive_operators = true +ij_kotlin_spaces_around_assignment_operators = true +ij_kotlin_spaces_around_equality_operators = true +ij_kotlin_spaces_around_function_type_arrow = true +ij_kotlin_spaces_around_logical_operators = true +ij_kotlin_spaces_around_multiplicative_operators = true +ij_kotlin_spaces_around_range = false +ij_kotlin_spaces_around_relational_operators = true +ij_kotlin_spaces_around_unary_operator = false +ij_kotlin_spaces_around_when_arrow = true +ij_kotlin_variable_annotation_wrap = off +ij_kotlin_while_on_new_line = false +ij_kotlin_wrap_elvis_expressions = 1 +ij_kotlin_wrap_expression_body_functions = 0 +ij_kotlin_wrap_first_method_in_call_chain = false + +[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}] +indent_size = 2 +ij_json_array_wrapping = split_into_lines +ij_json_keep_blank_lines_in_code = 0 +ij_json_keep_indents_on_empty_lines = false +ij_json_keep_line_breaks = true +ij_json_keep_trailing_comma = false +ij_json_object_wrapping = split_into_lines +ij_json_property_alignment = do_not_align +ij_json_space_after_colon = true +ij_json_space_after_comma = true +ij_json_space_before_colon = false +ij_json_space_before_comma = false +ij_json_spaces_within_braces = false +ij_json_spaces_within_brackets = false +ij_json_wrap_long_lines = false + +[{*.hcl,*.nomad}] +indent_size = 2 +ij_hcl_array_wrapping = normal +ij_hcl_keep_blank_lines_in_code = 2 +ij_hcl_keep_indents_on_empty_lines = false +ij_hcl_keep_line_breaks = true +ij_hcl_object_wrapping = normal +ij_hcl_property_alignment = 2 +ij_hcl_property_line_commenter_character = 1 +ij_hcl_space_after_comma = true +ij_hcl_space_before_comma = false +ij_hcl_spaces_around_assignment_operators = true +ij_hcl_spaces_within_braces = false +ij_hcl_spaces_within_brackets = false +ij_hcl_wrap_long_lines = false + +[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] +ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3 +ij_html_align_attributes = true +ij_html_align_text = false +ij_html_attribute_wrap = normal +ij_html_block_comment_add_space = false +ij_html_block_comment_at_first_column = true +ij_html_do_not_align_children_of_min_lines = 0 +ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p +ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot +ij_html_enforce_quotes = false +ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var +ij_html_keep_blank_lines = 2 +ij_html_keep_indents_on_empty_lines = false +ij_html_keep_line_breaks = true +ij_html_keep_line_breaks_in_text = true +ij_html_keep_whitespaces = false +ij_html_keep_whitespaces_inside = span,pre,textarea +ij_html_line_comment_at_first_column = true +ij_html_new_line_after_last_attribute = never +ij_html_new_line_before_first_attribute = never +ij_html_quote_style = double +ij_html_remove_new_line_before_tags = br +ij_html_space_after_tag_name = false +ij_html_space_around_equality_in_attribute = false +ij_html_space_inside_empty_tag = false +ij_html_text_wrap = normal + +[{*.http,*.rest}] +indent_size = 0 +ij_continuation_indent_size = 4 +ij_http request_call_parameters_wrap = normal + +[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}] +ij_jsp_jsp_prefer_comma_separated_import_list = false +ij_jsp_keep_indents_on_empty_lines = false + +[{*.jspx,*.tagx}] +ij_jspx_keep_indents_on_empty_lines = false + +[{*.markdown,*.md}] +ij_markdown_force_one_space_after_blockquote_symbol = true +ij_markdown_force_one_space_after_header_symbol = true +ij_markdown_force_one_space_after_list_bullet = true +ij_markdown_force_one_space_between_words = true +ij_markdown_format_tables = true +ij_markdown_insert_quote_arrows_on_wrap = true +ij_markdown_keep_indents_on_empty_lines = false +ij_markdown_keep_line_breaks_inside_text_blocks = true +ij_markdown_max_lines_around_block_elements = 1 +ij_markdown_max_lines_around_header = 1 +ij_markdown_max_lines_between_paragraphs = 1 +ij_markdown_min_lines_around_block_elements = 1 +ij_markdown_min_lines_around_header = 1 +ij_markdown_min_lines_between_paragraphs = 1 +ij_markdown_wrap_text_if_long = true +ij_markdown_wrap_text_inside_blockquotes = true + +[{*.pb,*.textproto}] +indent_size = 2 +tab_width = 2 +ij_continuation_indent_size = 4 +ij_prototext_keep_blank_lines_in_code = 2 +ij_prototext_keep_indents_on_empty_lines = false +ij_prototext_keep_line_breaks = true +ij_prototext_space_after_colon = true +ij_prototext_space_after_comma = true +ij_prototext_space_before_colon = false +ij_prototext_space_before_comma = false +ij_prototext_spaces_within_braces = true +ij_prototext_spaces_within_brackets = false + +[{*.properties,spring.handlers,spring.schemas}] +ij_properties_align_group_field_declarations = false +ij_properties_keep_blank_lines = false +ij_properties_key_value_delimiter = equals +ij_properties_spaces_around_key_value_delimiter = false + +[{*.py,*.pyw}] +ij_python_align_collections_and_comprehensions = true +ij_python_align_multiline_imports = true +ij_python_align_multiline_parameters = true +ij_python_align_multiline_parameters_in_calls = true +ij_python_blank_line_at_file_end = true +ij_python_blank_lines_after_imports = 1 +ij_python_blank_lines_after_local_imports = 0 +ij_python_blank_lines_around_class = 1 +ij_python_blank_lines_around_method = 1 +ij_python_blank_lines_around_top_level_classes_functions = 2 +ij_python_blank_lines_before_first_method = 0 +ij_python_call_parameters_new_line_after_left_paren = false +ij_python_call_parameters_right_paren_on_new_line = false +ij_python_call_parameters_wrap = normal +ij_python_dict_alignment = 0 +ij_python_dict_new_line_after_left_brace = false +ij_python_dict_new_line_before_right_brace = false +ij_python_dict_wrapping = 1 +ij_python_from_import_new_line_after_left_parenthesis = false +ij_python_from_import_new_line_before_right_parenthesis = false +ij_python_from_import_parentheses_force_if_multiline = false +ij_python_from_import_trailing_comma_if_multiline = false +ij_python_from_import_wrapping = 1 +ij_python_hang_closing_brackets = false +ij_python_keep_blank_lines_in_code = 1 +ij_python_keep_blank_lines_in_declarations = 1 +ij_python_keep_indents_on_empty_lines = false +ij_python_keep_line_breaks = true +ij_python_method_parameters_new_line_after_left_paren = false +ij_python_method_parameters_right_paren_on_new_line = false +ij_python_method_parameters_wrap = normal +ij_python_new_line_after_colon = false +ij_python_new_line_after_colon_multi_clause = true +ij_python_optimize_imports_always_split_from_imports = false +ij_python_optimize_imports_case_insensitive_order = false +ij_python_optimize_imports_join_from_imports_with_same_source = false +ij_python_optimize_imports_sort_by_type_first = true +ij_python_optimize_imports_sort_imports = true +ij_python_optimize_imports_sort_names_in_from_imports = false +ij_python_space_after_comma = true +ij_python_space_after_number_sign = true +ij_python_space_after_py_colon = true +ij_python_space_before_backslash = true +ij_python_space_before_comma = false +ij_python_space_before_for_semicolon = false +ij_python_space_before_lbracket = false +ij_python_space_before_method_call_parentheses = false +ij_python_space_before_method_parentheses = false +ij_python_space_before_number_sign = true +ij_python_space_before_py_colon = false +ij_python_space_within_empty_method_call_parentheses = false +ij_python_space_within_empty_method_parentheses = false +ij_python_spaces_around_additive_operators = true +ij_python_spaces_around_assignment_operators = true +ij_python_spaces_around_bitwise_operators = true +ij_python_spaces_around_eq_in_keyword_argument = false +ij_python_spaces_around_eq_in_named_parameter = false +ij_python_spaces_around_equality_operators = true +ij_python_spaces_around_multiplicative_operators = true +ij_python_spaces_around_power_operator = true +ij_python_spaces_around_relational_operators = true +ij_python_spaces_around_shift_operators = true +ij_python_spaces_within_braces = false +ij_python_spaces_within_brackets = false +ij_python_spaces_within_method_call_parentheses = false +ij_python_spaces_within_method_parentheses = false +ij_python_use_continuation_indent_for_arguments = false +ij_python_use_continuation_indent_for_collection_and_comprehensions = false +ij_python_use_continuation_indent_for_parameters = true +ij_python_wrap_long_lines = false + +[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}] +ij_qute_keep_indents_on_empty_lines = false + +[{*.tf,*.tfvars}] +indent_size = 2 +ij_hcl-terraform_array_wrapping = normal +ij_hcl-terraform_keep_blank_lines_in_code = 2 +ij_hcl-terraform_keep_indents_on_empty_lines = false +ij_hcl-terraform_keep_line_breaks = true +ij_hcl-terraform_object_wrapping = normal +ij_hcl-terraform_property_alignment = 2 +ij_hcl-terraform_property_line_commenter_character = 1 +ij_hcl-terraform_space_after_comma = true +ij_hcl-terraform_space_before_comma = false +ij_hcl-terraform_spaces_around_assignment_operators = true +ij_hcl-terraform_spaces_within_braces = false +ij_hcl-terraform_spaces_within_brackets = false +ij_hcl-terraform_wrap_long_lines = false + +[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] +ij_toml_keep_indents_on_empty_lines = false + +[{*.yaml,*.yml}] +indent_size = 2 +ij_yaml_align_values_properties = do_not_align +ij_yaml_autoinsert_sequence_marker = true +ij_yaml_block_mapping_on_new_line = false +ij_yaml_indent_sequence_value = true +ij_yaml_keep_indents_on_empty_lines = false +ij_yaml_keep_line_breaks = true +ij_yaml_sequence_on_new_line = false +ij_yaml_space_before_colon = false +ij_yaml_spaces_within_braces = true +ij_yaml_spaces_within_brackets = true + +[*.{cmd,bat,vbs,ps1}] +end_of_line = crlf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..19ab79c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,137 @@ +############################ +# Common settings that generally should always be used with your language specific settings +############################ + +# Auto detect text files and perform LF normalization +* text=auto + +# +# The above will handle all files NOT found below +# + +# Documents +*.bibtex text diff=bibtex +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.md text diff=markdown +*.mdx text diff=markdown +*.tex text diff=tex +*.adoc text +*.textile text +*.mustache text +*.csv text eol=crlf +*.tab text +*.tsv text +*.txt text +*.sql text +*.epub diff=astextplain + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as text by default. +*.svg text +# If you want to treat it as binary, +# use the following line instead. +# *.svg binary +*.eps binary + +# Scripts +*.bash text eol=lf +*.fish text eol=lf +*.sh text eol=lf +*.zsh text eol=lf +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# Serialisation +*.json text +*.toml text +*.xml text +*.yaml text +*.yml text + +# Archives +*.7z binary +*.gz binary +*.tar binary +*.tgz binary +*.zip binary + +# Text files where line endings should be preserved +*.patch -text + +# +# Exclude files from exporting +# +.gitattributes export-ignore +.gitignore export-ignore +.gitkeep export-ignore + +############################ +# Web +############################ + +# These files are text and should be normalized (Convert crlf => lf) +*.css text diff=css +*.scss text diff=css +*.sass text +*.df text +*.htm text diff=html +*.html text diff=html +*.js text +*.jsp text +*.jspf text +*.jspx text +*.properties text +*.tld text +*.tag text +*.tagx text +*.xml text + + +# Common build-tool wrapper scripts ('.cmd' versions are handled by 'Common.gitattributes') +mvnw text eol=lf +gradlew text eol=lf + +############################ +# Java sources +############################ +*.java text diff=java +*.kt text diff=kotlin +*.groovy text diff=java +*.scala text diff=java +*.gradle text diff=java +*.gradle.kts text diff=kotlin + +# These files are binary and should be left untouched (and ideally not checked in) +# (binary is a macro for -text -diff) +*.class binary +*.dll binary +*.ear binary +*.jar binary +*.so binary +*.war binary +*.jks binary + + +############################ +# Custom Binaries +############################ +**/*.zip filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text diff --git a/.github/ISSUE_TEMPLATE/config.yaml b/.github/ISSUE_TEMPLATE/config.yaml new file mode 100644 index 0000000..3ba13e0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yaml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/.github/ISSUE_TEMPLATE/non-technical-issue.yml b/.github/ISSUE_TEMPLATE/non-technical-issue.yml new file mode 100644 index 0000000..c900db6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/non-technical-issue.yml @@ -0,0 +1,39 @@ +name: 📚 Non-Technical Issue +description: Use this form to submit content suggestions, fixes, and questions as well as any other non-technical topic. +title: "Non-Technical Issue:" + +body: +- type: dropdown + id: issueLoc + attributes: + label: Issue Location + description: "Where is this issue located?" + options: + - javadocs + - README file + - Other + validations: + required: true +- type: dropdown + id: issueTypeN + attributes: + label: "Issue Type" + description: "What type of issue is this?" + options: + - Content addition + - Content correction + - Question + - Typo, syntax, or other minor fixes + - Other +- type: textarea + id: description + attributes: + label: "Issue Description" + description: "Use the area below to concisely describe the issue, including any necessary links to navigate to the issue location" +- type: checkboxes + id: selfhelp + attributes: + label: Self-Service + description: If you feel like you could contribute to this issue, please check the box below. + options: + - label: I would be willing to fix this issue diff --git a/.github/ISSUE_TEMPLATE/techIssue.yml b/.github/ISSUE_TEMPLATE/techIssue.yml new file mode 100644 index 0000000..9e99a85 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/techIssue.yml @@ -0,0 +1,60 @@ +name: "💻 Technical Issue" +description: Use this form to report any issue that will involve touching code within this repository +title: "Technical Issue: " + +body: +- type: dropdown + id: issueType + attributes: + label: Issue Type + description: Select the technical issue type that most closely aligns with the issue you wish to report + options: + - Bug + - Accessibility Issue + - Feature Request + - Other Technical Issue + validations: + required: true +- type: textarea + id: expected + attributes: + label: "Expected Behavior" + description: "Clearly and concisely describe what you expect or propose to happen:" +- type: textarea + id: current + attributes: + label: "Current Behavior" + description: "Describe what is currently happening, highlighting the differences between current and expected behavior:" +- type: textarea + id: reproduce + attributes: + label: Steps to Reproduce Issue + description: "Enter the steps to reproduce the error:" + placeholder: | + 1. Go to ... + 2. Click on .... + 3. Scroll down to .... + 4. See error +- type: textarea + id: screenshots + attributes: + label: Screenshots + description: If applicable, add screenshots to help explain your problem. +- type: textarea + id: localEnv + attributes: + label: Local Environment + description: "Please complete the following information:" + value: | + - OS: + - Open JDK Java Version: + - Apache Maven Version: + - [REPO/SOFTWARE] Version: +- type: checkboxes + id: selfhelp + attributes: + label: Self-Service + description: If you feel like you could contribute to this issue, please check the box below. + options: + - label: I would be willing to fix this issue + diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..b68d230 --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,30 @@ +name: Build Workflow + +run-name: 'Build Workflow -- ${{ github.head_ref || github.ref_name }}' + +# Pipeline/Workflow Triggers +on: + push: + branches: + - main + tags: + - '**' + pull_request: + branches: + - main + workflow_dispatch: + + +jobs: + pr-verification: + name: Pull Request Validation + runs-on: ubuntu-24.04 + if: github.event_name == 'pull_request' + steps: + - name: Pull Request Version Validation + uses: ikmdev/maven-pull-request-version-validation-action@v2.1.0 + + + general-build-job: + name: General Build + uses: ikmdev/maven-jpms-test-build-action/.github/workflows/build.yaml@v2.1.0 \ No newline at end of file diff --git a/.github/workflows/post_build.yaml b/.github/workflows/post_build.yaml new file mode 100644 index 0000000..e02c8c6 --- /dev/null +++ b/.github/workflows/post_build.yaml @@ -0,0 +1,43 @@ +name: Post Build Action + +run-name: 'Post Build Action -- ${{github.event.workflow_run.head_branch}}' + +on: + workflow_run: + workflows: + - Build Workflow + types: + - completed + +permissions: + contents: write + +jobs: + post-build: + name: Post Build Actions + runs-on: ubuntu-24.04 + if: github.event.workflow_run.conclusion == 'success' && github.repository_owner == 'ikmdev' + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + repository: ${{github.event.workflow_run.head_repository.full_name}} + ref: ${{github.event.workflow_run.head_branch}} + fetch-depth: 0 + + - name: IKMDEV Post Build Action + id: ikmdev_post_build + uses: ikmdev/maven-post-build-action@v3.3.0 + with: + nexus_repo_url: ${{secrets.NEXUS_URL}} + nexus_repo_username: ${{secrets.NEXUS_USER}} + nexus_repo_password: ${{secrets.NEXUS_PASSWORD}} + branch_name: ${{github.event.workflow_run.head_branch}} + github_token: ${{secrets.GITHUB_TOKEN}} + maven_central_username: ${{secrets.MC_SECRET_USERNAME}} + maven_central_password: ${{secrets.MC_SECRET_PASSWORD}} + gpg_key: ${{secrets.GPG_KEY}} + gpg_passphrase: ${{secrets.GPG_PASSPHRASE}} + sonarcloud_token: ${{ secrets.SONAR_TOKEN }} + sonarcloud_sources: ${{ '' }} + sonarcloud_tests: ${{ '' }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..a8e49eb --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,87 @@ +name: SemVer Release Workflow + +run-name: "Releasing ${{ github.event.repository.name }} #${{github.run_number}}" + +# Trigger workflow manually +on: + workflow_dispatch: + +env: + BRANCH_NAME: ${{ github.ref_name }} + TRUNK_BRANCH_NAME: ${{ github.event.repository.default_branch }} + +jobs: + release: + name: Release + runs-on: ubuntu-24.04 + if: github.repository_owner == 'ikmdev' + steps: + - name: Verify Branch + if: env.BRANCH_NAME != env.TRUNK_BRANCH_NAME + run: | + echo "ERROR: Attempting to release from branch ${{ env.BRANCH_NAME }}. Release from ${{ env.TRUNK_BRANCH_NAME }} branch only." + exit 1 + + - name: Checkout Repository + uses: actions/checkout@v4 + with: + token: ${{secrets.IKMDEVOPS_PAT_TOKEN}} + + + - name: Verify Version + run: | + CURRENT_VERSION=$(./mvnw help:evaluate -D'expression=project.version' -q -D'forceStdout') + CORE_VERSION=$(./mvnw help:evaluate -D'expression=core.artifact.version' -q -D'forceStdout') + if [[ "$CURRENT_VERSION" != *"$CORE_VERSION"* ]]; then + echo "::error::Current Version Does Not Match Core Version" + echo "::error::Current Version: $CURRENT_VERSION" + echo "::error::Core Version: $CORE_VERSION" + exit 1 + fi + + - name: Extrapolate IKM Release Property + id: newDevVersion + run: | + CORE_VERSION=$(./mvnw help:evaluate -D'expression=core.artifact.version' -q -D'forceStdout') + RC_VERSION=$(./mvnw help:evaluate -D'expression=core.artifact.release' -q -D'forceStdout') + RC_NUMBER=$(echo "$RC_VERSION" | grep -o -E '[0-9]+') + NEW_RC_NUMBER=$((1 + $RC_NUMBER)) + echo "DEV_VERSION=$CORE_VERSION-r$NEW_RC_NUMBER-SNAPSHOT" >> $GITHUB_OUTPUT + + - name: Shared Release Action + uses: ikmdev/maven-semver-release-action@v2.7.0 + with: + version_type: 'pre-release' + github_token: ${{secrets.GITHUB_TOKEN}} + development_version: ${{steps.newDevVersion.outputs.DEV_VERSION}} + + - name: New Release Property + id: new_release_property + shell: bash + run: | + echo "VERSION=$(mvn help:evaluate -D'expression=project.version' -q -D'forceStdout')" + IFS='-' + read -ra arr <<< "$VERSION" + for val in "${arr[@]}" + do + if [[ $val == r* ]]; then + RELEASE_PROPERTY=$val + fi + done + echo "$RELEASE_PROPERTY" + echo "::set-output name=PROPERTY::$RELEASE_PROPERTY" + + - name: Update Release Candidate Property + run: | + mvn versions:set-property \ + -Dproperty=core.artifact.release \ + -DnewVersion=$RELEASE_PROPERTY + git config user.name "ikmdevops" + git config user.email "devops@ikm.dev" + git pull -p + git commit -am"Updated Release core.artifact.release Property to $RELEASE_PROPERTY" + git push + env: + RELEASE_PROPERTY: ${{steps.new_release_property.outputs.PROPERTY}} + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7669c26 --- /dev/null +++ b/.gitignore @@ -0,0 +1,230 @@ +################### +# Java +################### +# Compiled class file +*.class + +# Log file +logs/ +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +################### +# Maven +################### + +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +################### +# Jetbrains/IntelliJ +################### + +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +.idea/ +*.iml +*.ipr + +# CMake +cmake-build-*/ + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +################### +# Eclipse +################### + +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ +.apt_generated_test/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +# Uncomment this line if you wish to ignore the project description file. +# Typically, this file would be tracked if it contains build/dependency configurations: +#.project + +################### +# VSCode +################### + +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +################### +# Windows +################### + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +################### +# MacOS +################### + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +################### +# General +################### +**.zip +htmlReport diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml new file mode 100644 index 0000000..fcfe7ff --- /dev/null +++ b/.mvn/extensions.xml @@ -0,0 +1,10 @@ + + + + org.apache.maven.extensions + maven-build-cache-extension + 1.0.1 + + + diff --git a/.mvn/jvm.config b/.mvn/jvm.config new file mode 100644 index 0000000..e69de29 diff --git a/.mvn/maven.config b/.mvn/maven.config new file mode 100644 index 0000000..e69de29 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..f95f1ee --- /dev/null +++ b/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.8/apache-maven-3.9.8-bin.zip diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..45e71fc --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the + purposes of this License, Derivative Works shall not include works + that remain separable from, or merely link (or bind by name) to the + interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index a483fcc..7b161c3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,50 @@ # jpms-httpclient4 +The jpms-httpclient4 repository is dedicated to making the [Apache HttpClient](https://hc.apache.org/httpcomponents-client-4.5.x/) 4.x library compliant with the Java Platform Module System (JPMS). This compliance ensures that httpclient can be seamlessly integrated into modular Java applications — including applications assembled with `jlink`, which requires every module in the linked graph to be a real (not automatic) module — leveraging the benefits of JPMS such as improved encapsulation, security, and maintainability. -JPMS module wrapper repo (see the `add-module-wrapper` branch / open PR for the actual wrapper). +> **Naming note:** an earlier attempt at this existed as [`ikmdev/jpms-httpclient`](https://github.com/ikmdev/jpms-httpclient) (archived, no releases published). This repository wraps the legacy Apache HttpClient 4.x line and is a fresh start using the current moditect-based wrapper template, named `jpms-httpclient4` (with an explicit "4" suffix) to avoid any collision or confusion with that archived repo. + +## Features + +* **JPMS Compliance:** The library is packaged as a JPMS module, enabling better encapsulation and dependency management in Java projects. +* **Ease of Use:** Simple integration into projects using JPMS. + +## Getting Started +### Prerequisites + +* **Java 11 or higher:** JPMS was introduced in Java 9, so a minimum of Java 11 is recommended for compatibility and support. +* **Maven or Gradle:** For dependency management and building the project. + +Add the following dependency to your pom.xml: +```xml + + dev.ikm.jpms + httpclient4 + ${latest-jpms-httpclient4-version} + +``` + +Add the following dependency to your build.gradle: +```groovy +implementation 'dev.ikm.jpms:httpclient4:${latest-jpms-httpclient4-version}' +``` + +In your module descriptor (module-info.java), declare the dependency on the jpms-httpclient4 module: + +```java +module your.module.name { + requires dev.ikm.jpms.httpclient; +} +``` + +## Dependencies + +This wrapper's `module-info` requires the following sibling JPMS wrapper modules at runtime: + +* `dev.ikm.jpms.httpcore` (repo [`jpms-httpcore4`](https://github.com/ikmdev/jpms-httpcore4)) +* `dev.ikm.jpms.commons.codec` (repo [`jpms-commons-codec`](https://github.com/ikmdev/jpms-commons-codec)) +* `dev.ikm.jpms.jcl.over.slf4j` (repo [`jpms-jcl-over-slf4j`](https://github.com/ikmdev/jpms-jcl-over-slf4j)), which provides the `org.apache.commons.logging` package that httpclient needs + +## Issues and Contributions +Technical and non-technical issues can be reported to the [Issue Tracker](https://github.com/ikmdev/jpms-httpclient4/issues). + +Contributions can be submitted via pull requests. Please check the [contribution guide](doc/how-to-contribute.md) for more details. diff --git a/doc/how-to-contribute.md b/doc/how-to-contribute.md new file mode 100644 index 0000000..cbe893f --- /dev/null +++ b/doc/how-to-contribute.md @@ -0,0 +1,139 @@ +# How to Contribute + +If you would like to create a new feature or a bugfix, there are a couple of conventions that should be followed for the team to be able to act on your request. This includes understanding our current branching pattern. Also, we will cover how to recover from a build failure, indicating there was a problem with your code. + +## Fork the Repository + +In order to ensure code quality, we recommend forking the repository you wish to contribute to rather than cloning the repository directly and then submitting a pull request from the forked repository. To create a fork, go to the repository in the web UI and click on the "Fork" button. Then select your account. This will create a fork of the repository in your account. You can then clone the fork to your local machine. To do this, go to your forked repository in the web UI and click on the "Code" button. Then click on the "SSH" button. Copy the URL and run the appropriate `git clone` command in your CLI. + +## Create a Branch Using Maven + +Before beginning development, create a new branch designated for the work you are about to do using Maven plugin commands. + +| Branch Type | Maven Command | Outcome | +| ------ | ------ | ------ | +| Feature Branch | `mvn gitflow: feature-start` | Creates a new feature branch and updates the Komet version | +| Hotfix Branch | `mvn gitflow: hotfix-start` | Creates a new hotfix branch and updates the hotfix version | + +Maven will prompt you to create a name for your new feature or hotfix branch. The branch name should follow the convention of starting with a JIRA project code (IKM, AR, IAT, IC, IKMC, IKDT, IKMD, IIA, IKMW, IKMM, or TE), followed by a dash, followed by the issue number it applies to, followed by a short description (without spaces) (e.g., `IA-30-branch-documentation`). If there is no JIRA ticket, it is ok to move on without one, but this will be applied at a later point by a team developer as they are reviewing and merging it in. + +Once your new branch has been created, begin development in your newly created branch. + +**Note:** There is currently no way to create a bugfix branch using the Maven plugin. You can create a bugfix branch using the git commands in the [Common Git Commands](#common-git-commands) section below. + +#### Create a Branch Using Git + +Sometimes you don't want to or cannot use the maven plugin, so git can be used directly to create a branch. This works by running the following commands to create your branch: + +```bash +git pull origin main +git checkout -b feature/MYAPP-52-some-short-description +mvn versions:set -DnewVersion=MYAPP-52-some-short-description +``` +Follow the same branch naming convention illustrated above. + +## Collaborate with Others + +To collaborate with others in your feature branch, run the following command to push your changes to a remote branch: +```bash +git push origin HEAD:feature/[MY LOCAL BRANCH NAME] +``` + +This will allow other developers to pull your code. Don't forget to run `git add .` and `git commit -m "[MESSAGE]"` before pushing your code. + +## Submit Your Code + +Ideally at this point, you have created an isolated change, which are best for code reviews, cherry-picking and +rollbacks. Now you can push your changes. + +If you haven't already, run `git add .` and `git commit -m "[MESSAGE]"` to commit your changes. Then run `mvn gitflow:feature-finish` to complete your Maven feature and update the version. This will push your code to the main branch of your repository. + +Finally, [create a pull request][3] based off your main branch to the main branch of the original repository. + +**Note:** It is recommended to wait for your pull request to be approved and merged into the original repository before starting a new feature branch to avoid having multiple features in your main branch. Having multiple features in your main branch will make less clear which changes are for which feature (i.e., which JIRA ticket) when pulling changes into the original repository. + +## Additional Guidelines + +### Branch Names + +The system expects short running branches and you must merge back to the main branch as the only supported automated deployment option. Also, metrics will eventually be gathered on branches to report on any long-running branches. All repositories created by the DevSecOps tooling meet and follow the following rules on branches: + +| Branch Name | Description | +|-------------|-----------------------------------------------------------------------------------------| +| main | The primary branch that defines the current state of your code. This is protected in that only merge requests can happen on this branch. This should be at production quality at all times. | +| master | A protected branch that is blocked to guarantee that no one uses main as a primary branch (for consistency). | +| production | A protected branch that is blocked to guarantee that no one uses main as a long-running branch, and that all releases happen from the "main" branch. | +| prod | Similar to "production", making sure that folks do not create long-running branches. No one should use. | +| feature/* | Used when extending the functionality of the services contained in the repository. This is utilized in standard Feature Branching Workflows within a project. The name (after "feature/") must start with one or more JIRA issue numbers (e.g. `feature/JIRA-123-example-feature`). Feature branches should be a representation of a well defined task/story directly associated with the branch. A feature branch should be very focused and something that can be accomplished within a one or two day period. This process helps maintain that the working branch and the main production branch stay in a similar parity with each other. Feature branches are meant to be short-lived and should be flagged if they are not destroyed within 2-3 days. | +| bugfix/* | Used when fixing defects releases. The name (after "bugfix/") must start with one or more JIRA issue numbers (e.g. `bugfix/JIRA-123-bugfix-problem`). Like a feature, they are limited in scope and should be tied to a specific defect story in JIRA. | +| hotfix/* | Used when patching releases. The name (after "hotfix/") must start with one or more JIRA issue numbers (e.g. `hotfix/JIRA-123-emergency-fix`). Releases are expected be tagged in this branch. | + +### Feature Branching and Version Tags + +The convention for Development Libraries/Frameworks and Software components is to use **Linear**, [Trunk-Based][1] Development approach to writing, merging, and shipping code on the platform. This approach will help avoid problems that arise with merging and allow for a faster development process. For some background on why we don't suggest git-flow, but rather enforce linear development, please visit [this article][2]. All pull requests should be building and only approved pull requests should have an executed pull/merge request. This means that the `main` branch is always in a good shape to ship to deploy. + +Version tags, similarly should be created primarily off of the `main` branch, the exception being hotfixes, which should be adjustments to the last release. If there is a `1.5.0` tag, you check out the tag and make changes to that codebase and release from that branch. Similarly, if you need to execute additional hotfixes, you would check out the `1.5.1` tag and tag from that branch. Though you can merge these changes back to main, it is optional and often easier to put in a separate bugfix ticket to correct in the main branch separately. This is entirely dependent on how quickly the codebase is changing though. One with little changes will allow for merge back easily. One with massive refactoring, you might as well just do it separately. Either way, it is suggested that these are tracked separately in JIRA. + +This would look something like this, allowing for concurrent feature development, bugfixes, and hotfixes: + +![Git Feature Branching](images/git-concurrent-development.jpg) + +### Commit Conventions + +Committing frequently is good practice as these incremental checkpoints can be recovered if necessary. However, remember that the commits of a branch going into the `main` branch should be squashed. + +```text +# Example Commit Message + Changed ALB certificate to use a wildcard certificate + +<About> Allows the creation of a single ACM wildcard certificate + to be used for all inbound A records instead of independent + certs for subdomain records.1 +``` + +### Common Git Commands + +This entry level section introduces basic git operations. It explains foundational git concepts such as staged changes, un-staged changes, and the `.gitignore` file. It also covers the most common components of the classic git workflow. And finally, a sample development project (using git for source control) is presented to illustrate git concepts in a concrete manner. The example development project makes use of a basic repository structure and begins with the initialization of the git repository. + +```bash +## Fetch Code Index +git fetch + +## Fetch Code Index and Merge with current Branch +git pull + +## Create Branch +git checkout -b feature/MYAPP-52-some-short-description + +## determine if any changed files have not been added to the index, and how far off the baseline this is. +git status + +## Do work and track changes on a single file (as many times as you want) +git add README.md + +## Do work and track all changes (as many times as you want) +git add . + +## Commit work on tracked changes +git commit -m "A short comment describing the work since the last commit" + +## Push the changes to the team repo (assuming you have access). Can push more changes later until branch is deleted. +## You can then follow the instructions below to create a pull/merge request. +git push origin feature/MYAPP-52-some-short-description + +## Add another remote +git remote add myname https://git@mylocation.example + +## Push the changes to the other remote. Can push more changes later until branch is deleted. You can then follow +## the instructions below to create a pull/merge request. +git push myname feature/MYAPP-52-some-short-description + +## Delete a branch locally +git branch -d feature/MYAPP-52-some-short-description +``` + +[1]: <https://trunkbaseddevelopment.com> "Trunk Based Development" + +[2]: <https://githubflow.github.io> "GitHub Flow" + +[3]: <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork> "Creating a Pull Request" diff --git a/doc/images/git-concurrent-development.jpg b/doc/images/git-concurrent-development.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c8abdda910999b2901de9ff7a8c2040803581da GIT binary patch literal 72517 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%0D2)wM(5!2-D9cq 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 literal 0 HcmV?d00001 diff --git a/mvnw b/mvnw new file mode 100755 index 0000000..19529dd --- /dev/null +++ b/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/mvnw.cmd b/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash> +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..3030101 --- /dev/null +++ b/pom.xml @@ -0,0 +1,200 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>dev.ikm.build</groupId> + <artifactId>parent</artifactId> + <version>1.64.0</version> + <relativePath></relativePath> + </parent> + + <groupId>dev.ikm.jpms</groupId> + <artifactId>httpclient4</artifactId> + <name>httpclient4</name> + <version>4.5.14-r1-SNAPSHOT</version> + + <properties> + <!-- change release here--> + <core.artifact.version>4.5.14</core.artifact.version> + <core.artifact.release>r1</core.artifact.release> + + <!-- transitive dependency versions --> + <httpcore4.version>4.4.16-r1-SNAPSHOT</httpcore4.version> + <commons-codec.version>1.16.0-r1-SNAPSHOT</commons-codec.version> + <jcl-over-slf4j.version>1.7.36-r1-SNAPSHOT</jcl-over-slf4j.version> + + <maven.moditect.plugin>1.2.2.Final</maven.moditect.plugin> + </properties> + + <licenses> + <license> + <name>Apache License, Version 2.0</name> + <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url> + <distribution>repo</distribution> + </license> + </licenses> + + <!-- transitive dependencies of the repackaged artifact --> + <dependencyManagement> + <dependencies> + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>httpcore4</artifactId> + <version>${httpcore4.version}</version> + </dependency> + + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>commons-codec</artifactId> + <version>${commons-codec.version}</version> + </dependency> + + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>jcl-over-slf4j</artifactId> + <version>${jcl-over-slf4j.version}</version> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>httpcore4</artifactId> + </dependency> + + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>commons-codec</artifactId> + </dependency> + + <dependency> + <groupId>dev.ikm.jpms</groupId> + <artifactId>jcl-over-slf4j</artifactId> + </dependency> + </dependencies> + + + <build> + <resources> + <resource> + <directory>${basedir}/</directory> + <includes> + <include>LICENSE.txt</include> + </includes> + </resource> + </resources> + <pluginManagement> + <plugins> + <plugin> + <groupId>org.moditect</groupId> + <artifactId>moditect-maven-plugin</artifactId> + <version>${maven.moditect.plugin}</version> + </plugin> + + </plugins> + </pluginManagement> + <plugins> + <plugin> + <artifactId>maven-enforcer-plugin</artifactId> + <configuration> + <skip>true</skip> + </configuration> + </plugin> + <plugin> + <groupId>org.moditect</groupId> + <artifactId>moditect-maven-plugin</artifactId> + <executions> + <execution> + <id>add-module-infos</id> + <phase>prepare-package</phase> + <goals> + <goal>add-module-info</goal> + </goals> + <configuration> + <outputDirectory>${project.build.directory}/moditect</outputDirectory> + <overwriteExistingFiles>true</overwriteExistingFiles> + <modules> + <module> + <artifact> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>${core.artifact.version}</version> + </artifact> + <moduleInfoSource> + module dev.ikm.jpms.httpclient { + requires transitive dev.ikm.jpms.httpcore; + requires dev.ikm.jpms.commons.codec; + requires dev.ikm.jpms.jcl.over.slf4j; + + exports org.apache.http.auth; + exports org.apache.http.auth.params; + exports org.apache.http.client; + exports org.apache.http.client.config; + exports org.apache.http.client.entity; + exports org.apache.http.client.methods; + exports org.apache.http.client.params; + exports org.apache.http.client.protocol; + exports org.apache.http.client.utils; + exports org.apache.http.conn; + exports org.apache.http.conn.params; + exports org.apache.http.conn.routing; + exports org.apache.http.conn.scheme; + exports org.apache.http.conn.socket; + exports org.apache.http.conn.ssl; + exports org.apache.http.conn.util; + exports org.apache.http.cookie; + exports org.apache.http.cookie.params; + exports org.apache.http.impl.auth; + exports org.apache.http.impl.client; + exports org.apache.http.impl.conn; + exports org.apache.http.impl.conn.tsccm; + exports org.apache.http.impl.cookie; + exports org.apache.http.impl.execchain; + } + </moduleInfoSource> + </module> + </modules> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-antrun-plugin</artifactId> + <executions> + <execution> + <phase>prepare-package</phase> + <configuration> + <target> + <echo message="unzipping file"/> + <unzip src="${project.build.directory}/moditect/httpclient-${core.artifact.version}.jar" + dest="${project.build.directory}/classes/"/> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + <execution> + <phase>prepare-package</phase> + <id>remove-signature</id> + <configuration> + <target> + <echo message="Deleting .RSA and .SF files"/> + <delete> + <fileset dir="${project.build.outputDirectory}/META-INF" includes="*.RSA,*.SF,*.DSA" /> + </delete> + </target> + </configuration> + <goals> + <goal>run</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project>