-module(go_over). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([main/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -file("src/go_over.gleam", 23). ?DOC(false). -spec print_warnings_count(list(go_over@warning:warning())) -> nil. print_warnings_count(Vulns) -> _pipe = (<<<<<<"⛔ "/utf8, (erlang:integer_to_binary(erlang:length(Vulns)))/binary>>/binary, " WARNING(s) FOUND!"/utf8>>/binary, (<<"\n-----------------------------------------------\n"/utf8>>)/binary>>), gleam_stdlib:print_error(_pipe). -file("src/go_over.gleam", 33). ?DOC(false). -spec print_warnings(list(go_over@warning:warning()), go_over@config:config()) -> nil. print_warnings(Vulns, Conf) -> case erlang:element(7, Conf) of minimal -> _pipe = Vulns, _pipe@1 = gleam@function:tap(_pipe, fun print_warnings_count/1), _pipe@2 = gleam@list:map( _pipe@1, fun go_over@warning:format_as_string_minimal/1 ), _pipe@3 = gleam@string:join(_pipe@2, <<""/utf8>>), gleam_stdlib:print_error(_pipe@3); json -> _pipe@4 = Vulns, _pipe@5 = gleam@list:map( _pipe@4, fun go_over@warning:format_as_json/1 ), _pipe@6 = gleam@json:preprocessed_array(_pipe@5), _pipe@7 = gleam@json:to_string(_pipe@6), gleam_stdlib:print_error(_pipe@7); _ -> _pipe@8 = Vulns, _pipe@9 = gleam@function:tap(_pipe@8, fun print_warnings_count/1), _pipe@10 = gleam@list:map( _pipe@9, fun go_over@warning:format_as_string/1 ), _pipe@11 = gleam@string:join( _pipe@10, <<"\n-----------------------------------------------\n"/utf8>> ), gleam_stdlib:print_error(_pipe@11) end, shellout_ffi:os_exit(1). -file("src/go_over.gleam", 59). ?DOC(false). -spec main() -> nil. main() -> Conf@1 = case go_over@config:spin_up( go_over@config:read_config(<<"gleam.toml"/utf8>>), shellout_ffi:start_arguments() ) of {error, E} -> gleam_stdlib:println_error(E), shellout_ffi:os_exit(0), erlang:error(#{gleam_error => panic, message => <<"Unreachable, please create an issue in https://github.com/bwireman/go-over if you see this"/utf8>>, module => <<"go_over"/utf8>>, function => <<"main"/utf8>>, line => 66}); {ok, Conf} -> Conf end, Spinner = go_over@util@spinner:new_spinner( <<"Let's do this!"/utf8>>, erlang:element(8, Conf@1) ), gxyz@function:ignore_result( erlang:element(5, Conf@1), gxyz@function:freeze1( fun simplifile_erl:delete/1, go_over@util@constants:go_over_path(erlang:element(9, Conf@1)) ) ), go_over@util@spinner:set_text_spinner( Spinner, <<"Reading manifest"/utf8>>, erlang:element(8, Conf@1) ), Pkgs = begin _pipe = go_over@packages:read_manifest(<<"manifest.toml"/utf8>>), _pipe@1 = go_over@config:filter_dev_dependencies(Conf@1, _pipe), _pipe@2 = go_over@config:filter_packages(Conf@1, _pipe@1), go_over@config:filter_indirect(Conf@1, _pipe@2) end, go_over@util@spinner:set_text_spinner( Spinner, <<"Checking packages: "/utf8, (go_over@util@print:raw(<<"vulnerable"/utf8>>, <<"red"/utf8>>))/binary>>, erlang:element(8, Conf@1) ), Vulnerable_warnings = go_over@sources:get_vulnerable_warnings(Pkgs, Conf@1), go_over@util@spinner:set_text_spinner( Spinner, <<"Checking packages: "/utf8, (go_over@util@print:raw(<<"retired"/utf8>>, <<"yellow"/utf8>>))/binary>>, erlang:element(8, Conf@1) ), Retired_warnings = go_over@sources:get_retired_warnings(Pkgs, Conf@1), Hex_warnings = gxyz@function:iff( erlang:element(3, Conf@1) orelse (erlang:length( erlang:element(11, Conf@1) ) > 0), fun() -> Msg = case {erlang:element(3, Conf@1), erlang:length(erlang:element(11, Conf@1)) > 0} of {true, true} -> <<"outdated & licenses"/utf8>>; {true, false} -> <<"outdated"/utf8>>; {false, true} -> <<"licenses"/utf8>>; {false, false} -> erlang:error(#{gleam_error => panic, message => <<"Unreachable, please create an issue in https://github.com/bwireman/go-over if you see this"/utf8>>, module => <<"go_over"/utf8>>, function => <<"main"/utf8>>, line => 107}) end, go_over@util@spinner:set_text_spinner( Spinner, <<"Checking packages: "/utf8, (go_over@util@print:raw(Msg, <<"brightmagenta"/utf8>>))/binary>>, erlang:element(8, Conf@1) ), go_over@sources:get_hex_warnings(Pkgs, Conf@1) end, [] ), gxyz@function:iff_nil( erlang:element(6, Conf@1), gxyz@function:freeze2( fun print_warnings/2, [{warning, none, <<"fake"/utf8>>, {some, <<"x.y.z"/utf8>>}, <<"Retired"/utf8>>, warning_reason_vulnerable, severity_critical, direct}, {warning, none, <<"another_fake"/utf8>>, {some, <<"1.2.3"/utf8>>}, <<"Vulnerable"/utf8>>, warning_reason_vulnerable, severity_high, direct}, {warning, none, <<"and_another"/utf8>>, {some, <<"4.5.6"/utf8>>}, <<"Vulnerable"/utf8>>, warning_reason_vulnerable, severity_moderate, direct}, {warning, none, <<"one_more"/utf8>>, {some, <<"7.8.9"/utf8>>}, <<"Vulnerable"/utf8>>, warning_reason_vulnerable, severity_low, indirect}, {warning, none, <<"this_one_was_retired"/utf8>>, {some, <<"10.11.12"/utf8>>}, <<"Retired"/utf8>>, warning_reason_retired, severity_package_retired_security, indirect}, {warning, none, <<"rejected_license"/utf8>>, none, <<"Retired"/utf8>>, warning_reason_retired, severity_rejected_license, indirect}], Conf@1 ) ), go_over@util@spinner:set_text_spinner( Spinner, <<"Filtering warnings"/utf8>>, erlang:element(8, Conf@1) ), Warnings = begin _pipe@3 = lists:append(Retired_warnings, Vulnerable_warnings), _pipe@4 = lists:append(_pipe@3, Hex_warnings), go_over@config:filter_severity(Conf@1, _pipe@4) end, go_over@util@spinner:stop_spinner(Spinner), case Warnings of [] -> go_over@util@print:success(<<"✅ No warnings found!"/utf8>>); Vulns -> print_warnings(Vulns, Conf@1) end.