From c194baf8b30a27ed0075ca0eece270431bdaa913 Mon Sep 17 00:00:00 2001 From: Victor S Date: Wed, 4 Oct 2023 19:25:19 -0300 Subject: refactor: split range getter into two parts Split the function that returns the visual selection range into two parts that return the start and the end of the range respectively, and use them in the CLI-command composer. This is part of a plan to use a general object with details about flags to compose the CLI command. --- autoload/prettier/resolver/config.vim | 22 +++++++++++++++++----- autoload/prettier/utils/buffer.vim | 14 ++++++++------ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 9a18444..be36a7c 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -8,7 +8,8 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ s:Flag_tab_width(a:config) . ' ' . \ s:Flag_print_width(a:config) . ' ' . \ s:Flag_parser(a:config) . ' ' . - \ s:Flag_range_delimiter(a:config, a:hasSelection, a:start, a:end) . ' ' . + \ s:Flag_range_start(a:config, a:hasSelection, a:start) . ' ' . + \ s:Flag_range_end(a:config, a:hasSelection, a:end) . ' ' . \ ' --semi=' . \ get(a:config, 'semi', g:prettier#config#semi) . \ ' --single-quote=' . @@ -38,15 +39,26 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo return l:cmd endfunction -" Returns either '--range-start X --range-end Y' or an empty string. -function! s:Flag_range_delimiter(config, partialFormatEnabled, start, end) abort +" Returns either '--range-start X' or an empty string. +function! s:Flag_range_start(config, partialFormatEnabled, start) abort if (!a:partialFormatEnabled) return '' endif - let l:range = prettier#utils#buffer#getCharRange(a:start, a:end) + let l:rangeStart = prettier#utils#buffer#getCharRangeStart(a:start) - return '--range-start=' . l:range[0] . ' --range-end=' . l:range[1] + return '--range-start=' . l:rangeStart +endfunction + +" Returns either '--range-end Y' or an empty string. +function! s:Flag_range_end(config, partialFormatEnabled, end) abort + if (!a:partialFormatEnabled) + return '' + endif + + let l:rangeEnd = prettier#utils#buffer#getCharRangeEnd(a:end) + + return '--range-end=' . l:rangeEnd endfunction " Returns '--tab-width=NN' diff --git a/autoload/prettier/utils/buffer.vim b/autoload/prettier/utils/buffer.vim index 3125bcc..922a0db 100644 --- a/autoload/prettier/utils/buffer.vim +++ b/autoload/prettier/utils/buffer.vim @@ -61,10 +61,12 @@ function! s:getCharPosition(line, col) abort return line2byte(a:line) + (a:col - 2) endfun -" Returns [start, end] byte range when on visual mode -function! prettier#utils#buffer#getCharRange(startSelection, endSelection) abort - let l:range = [] - call add(l:range, s:getCharPosition(a:startSelection, col("'<"))) - call add(l:range, s:getCharPosition(a:endSelection, col("'>"))) - return l:range +" Return the start byte when on visual mode +function! prettier#utils#buffer#getCharRangeStart(startSelection) abort + return s:getCharPosition(a:startSelection, col("'<")) +endfunction + +" Return the end byte when on visual mode +function! prettier#utils#buffer#getCharRangeEnd(endSelection) abort + return s:getCharPosition(a:endSelection, col("'>")) endfunction -- cgit v1.3 From 3cfe7aa460fba552cd1b5ca4e1c772bb20889ba3 Mon Sep 17 00:00:00 2001 From: Victor S Date: Wed, 4 Oct 2023 21:38:32 -0300 Subject: refactor: use function to get --stdin-filepath Added a new function to get the command part of the --stdin-filepath flag. This is part of a plan to compose the CLI command from an object with flag details. --- autoload/prettier/resolver/config.vim | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index be36a7c..d790286 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -28,7 +28,7 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ get(a:config, 'proseWrap', g:prettier#config#prose_wrap) . \ ' --html-whitespace-sensitivity ' . \ get(a:config, 'htmlWhitespaceSensitivity', g:prettier#config#html_whitespace_sensitivity) . - \ ' --stdin-filepath="'.simplify(expand('%:p')).'"' . + \ ' ' . s:Flag_stdin_filepath() . \ ' --require-pragma=' . \ get(a:config, 'requirePragma', g:prettier#config#require_pragma) . \ ' --end-of-line=' . @@ -111,3 +111,10 @@ function! s:Flag_parser(config) abort return '' endif endfunction + +" Returns '--stdin-filepath=' concatenated with the full path of the opened +" file. +function! s:Flag_stdin_filepath() abort + let l:current_file = simplify(expand('%:p')) + return '--stdin-filepath="' . l:current_file . '"' +endfunction -- cgit v1.3 From a9b3db0626a267f6366294cc1434088c98c4b432 Mon Sep 17 00:00:00 2001 From: Victor S Date: Wed, 4 Oct 2023 23:01:27 -0300 Subject: refactor: use function to get --loglevel Added a new function to return the CLI command part for the --loglevel flag. This is part of a plan to compose the CLI command from a general object with flag details. --- autoload/prettier/resolver/config.vim | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index d790286..0abea0c 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -33,7 +33,7 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ get(a:config, 'requirePragma', g:prettier#config#require_pragma) . \ ' --end-of-line=' . \ get(a:config, 'endOfLine', g:prettier#config#end_of_line) . - \ ' --loglevel error '. + \ ' ' . s:Flag_loglevel() . \ ' --stdin ' return l:cmd @@ -118,3 +118,9 @@ function! s:Flag_stdin_filepath() abort let l:current_file = simplify(expand('%:p')) return '--stdin-filepath="' . l:current_file . '"' endfunction + +" Returns '--loglevel error'. +function! s:Flag_loglevel() abort + let l:level = 'error' + return '--loglevel ' . l:level +endfunction -- cgit v1.3 From d512812ac78f8a1d98db469ffeefb99a368716a8 Mon Sep 17 00:00:00 2001 From: Victor S Date: Wed, 4 Oct 2023 23:29:51 -0300 Subject: refactor: use function to get --stdin Added a new function to return the CLI command part for the --stdin flag. This is part of a plan use an object with flag details to compose the CLI command. --- autoload/prettier/resolver/config.vim | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 0abea0c..3b841aa 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -34,7 +34,7 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ ' --end-of-line=' . \ get(a:config, 'endOfLine', g:prettier#config#end_of_line) . \ ' ' . s:Flag_loglevel() . - \ ' --stdin ' + \ ' ' . s:Flag_stdin() return l:cmd endfunction @@ -124,3 +124,8 @@ function! s:Flag_loglevel() abort let l:level = 'error' return '--loglevel ' . l:level endfunction + +" Returns '--stdin'. +function! s:Flag_stdin() abort + return '--stdin ' +endfunction -- cgit v1.3 From 067173cf302a4305a0f468910f47f7b008a42b1f Mon Sep 17 00:00:00 2001 From: Victor S Date: Wed, 4 Oct 2023 23:34:09 -0300 Subject: refactor: add flag-mapper functions Added general mapper functions that map flag names to parts of a CLI command. They are part a plan to use an object with flag details to compose the CLI command. --- autoload/prettier/resolver/config.vim | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 3b841aa..2b66ede 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -129,3 +129,18 @@ endfunction function! s:Flag_stdin() abort return '--stdin ' endfunction + +" Returns a flag name concantenated with its value in the JSON config object or +" in the default global Prettier config. +function! s:Concat_value_to_flag(config_and_sel, flag, props) abort + let l:global_value = get(g:, 'prettier#config#' . a:props.global_name, "") + + let l:value = get(a:config_and_sel.config, a:props.json_name, l:global_value) + + return a:flag . '=' . l:value +endfunction + +" Maps a flag name to a part of a command. +function! s:Map_flag_to_cmd_part(config_and_sel, flag, props) abort + return a:props.mapper(a:config_and_sel, a:flag, a:props) +endfunction -- cgit v1.3 From dda5954fd6297f4c59bb5891e2641c7d9c3cbd20 Mon Sep 17 00:00:00 2001 From: Victor S Date: Thu, 5 Oct 2023 00:20:46 -0300 Subject: refactor: use common parameters in flag functions Adapted flag-mapper functions to use the same parameters. This is part of a plan to expose a common interface from planned objects with flags, to make code flexible to future changes, and to compose the CLI command from a general object with flag details. --- autoload/prettier/resolver/config.vim | 73 ++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 2b66ede..abdbb46 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -4,12 +4,18 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo " Allow params to be passed as json format " convert bellow usage of globals to a get function o the params defaulting to global " TODO: Use a list, filter() and join() to get a nicer list of args. - let l:cmd = s:Flag_use_tabs(a:config) . ' ' . - \ s:Flag_tab_width(a:config) . ' ' . - \ s:Flag_print_width(a:config) . ' ' . - \ s:Flag_parser(a:config) . ' ' . - \ s:Flag_range_start(a:config, a:hasSelection, a:start) . ' ' . - \ s:Flag_range_end(a:config, a:hasSelection, a:end) . ' ' . + let l:config_and_sel = { + \ 'config': a:config, + \ 'hasSelection': a:hasSelection, + \ 'start': a:start, + \ 'end': a:end} + + let l:cmd = s:Flag_use_tabs(l:config_and_sel, '--use-tabs', {}) . ' ' . + \ s:Flag_tab_width(l:config_and_sel, '--tab-width', {}) . ' ' . + \ s:Flag_print_width(l:config_and_sel, '--print-width', {}) . ' ' . + \ s:Flag_parser(l:config_and_sel, '--parser', {}) . ' ' . + \ s:Flag_range_start(l:config_and_sel, '', {}) . ' ' . + \ s:Flag_range_end(l:config_and_sel, '', {}) . ' ' . \ ' --semi=' . \ get(a:config, 'semi', g:prettier#config#semi) . \ ' --single-quote=' . @@ -28,42 +34,47 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ get(a:config, 'proseWrap', g:prettier#config#prose_wrap) . \ ' --html-whitespace-sensitivity ' . \ get(a:config, 'htmlWhitespaceSensitivity', g:prettier#config#html_whitespace_sensitivity) . - \ ' ' . s:Flag_stdin_filepath() . + \ ' ' . s:Flag_stdin_filepath(l:config_and_sel, '--stdin-filepath', {}) . \ ' --require-pragma=' . \ get(a:config, 'requirePragma', g:prettier#config#require_pragma) . \ ' --end-of-line=' . \ get(a:config, 'endOfLine', g:prettier#config#end_of_line) . - \ ' ' . s:Flag_loglevel() . - \ ' ' . s:Flag_stdin() + \ ' ' . s:Flag_loglevel(l:config_and_sel, '--loglevel', {}) . + \ ' ' . s:Flag_stdin(l:config_and_sel, '--stdin', {}) return l:cmd endfunction " Returns either '--range-start X' or an empty string. -function! s:Flag_range_start(config, partialFormatEnabled, start) abort - if (!a:partialFormatEnabled) +function! s:Flag_range_start(config_and_sel, ...) abort + if (!a:config_and_sel.hasSelection) return '' endif - let l:rangeStart = prettier#utils#buffer#getCharRangeStart(a:start) + let l:rangeStart = + \ prettier#utils#buffer#getCharRangeStart(a:config_and_sel.start) return '--range-start=' . l:rangeStart endfunction " Returns either '--range-end Y' or an empty string. -function! s:Flag_range_end(config, partialFormatEnabled, end) abort - if (!a:partialFormatEnabled) +function! s:Flag_range_end(config_and_sel, ...) abort + if (!a:config_and_sel.hasSelection) return '' endif - let l:rangeEnd = prettier#utils#buffer#getCharRangeEnd(a:end) + let l:rangeEnd = + \ prettier#utils#buffer#getCharRangeEnd(a:config_and_sel.end) return '--range-end=' . l:rangeEnd endfunction " Returns '--tab-width=NN' -function! s:Flag_tab_width(config) abort - let l:value = get(a:config, 'tabWidth', g:prettier#config#tab_width) +function! s:Flag_tab_width(config_and_sel, ...) abort + let l:value = get( + \ a:config_and_sel.config, + \ 'tabWidth', + \ g:prettier#config#tab_width) if (l:value ==# 'auto') let l:value = prettier#utils#shim#shiftwidth() @@ -73,8 +84,12 @@ function! s:Flag_tab_width(config) abort endfunction " Returns either '--use-tabs' or an empty string. -function! s:Flag_use_tabs(config) abort - let l:value = get(a:config, 'useTabs', g:prettier#config#use_tabs) +function! s:Flag_use_tabs(config_and_sel, ...) abort + let l:value = get( + \ a:config_and_sel.config, + \ 'useTabs', + \ g:prettier#config#use_tabs) + if (l:value ==# 'auto') let l:value = &expandtab ? 'false' : 'true' endif @@ -87,8 +102,11 @@ function! s:Flag_use_tabs(config) abort endfunction " Returns '--print-width=NN' or '' -function! s:Flag_print_width(config) abort - let l:value = get(a:config, 'printWidth', g:prettier#config#print_width) +function! s:Flag_print_width(config_and_sel, ...) abort + let l:value = get( + \ a:config_and_sel.config, + \ 'printWidth', + \ g:prettier#config#print_width) if (l:value ==# 'auto') let l:value = &textwidth @@ -102,8 +120,11 @@ function! s:Flag_print_width(config) abort endfunction " Returns '--parser=PARSER' or '' -function! s:Flag_parser(config) abort - let l:value = get(a:config, 'parser', g:prettier#config#parser) +function! s:Flag_parser(config_and_sel, ...) abort + let l:value = get( + \ a:config_and_sel.config, + \ 'parser', + \ g:prettier#config#parser) if (l:value !=# '') return '--parser=' . l:value @@ -114,19 +135,19 @@ endfunction " Returns '--stdin-filepath=' concatenated with the full path of the opened " file. -function! s:Flag_stdin_filepath() abort +function! s:Flag_stdin_filepath(...) abort let l:current_file = simplify(expand('%:p')) return '--stdin-filepath="' . l:current_file . '"' endfunction " Returns '--loglevel error'. -function! s:Flag_loglevel() abort +function! s:Flag_loglevel(config_and_sel, flag, props) abort let l:level = 'error' return '--loglevel ' . l:level endfunction " Returns '--stdin'. -function! s:Flag_stdin() abort +function! s:Flag_stdin(...) abort return '--stdin ' endfunction -- cgit v1.3 From 2ec63e2a1d18525a1cf0822fa32862b25f5802a5 Mon Sep 17 00:00:00 2001 From: Victor S Date: Fri, 6 Oct 2023 23:58:34 -0300 Subject: refactor: add global variable for bracketSameLine Added a global variable for the bracketSameLine option. It is set to the user's defined value and uses the Prettier default as reserve. This is part of a plan to compose the CLI command from an object with details about the flags --- plugin/prettier.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/prettier.vim b/plugin/prettier.vim index b85195e..66adfcc 100644 --- a/plugin/prettier.vim +++ b/plugin/prettier.vim @@ -113,6 +113,7 @@ let g:prettier#config#bracket_spacing = get(g:,'prettier#config#bracket_spacing' " default: 'false' " See more: https://prettier.io/docs/en/options.html#jsx-brackets let g:prettier#config#jsx_bracket_same_line = get(g:,'prettier#config#jsx_bracket_same_line', 'false') +let g:prettier#config#bracket_same_line = get(g:, 'prettier#config#bracket_same_line', 'false') " avoid wrapping a single arrow function param in parens " avoid|always -- cgit v1.3 From 8e7155479fa65bf120caece1a171bc8fc81e2e27 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sat, 7 Oct 2023 23:26:40 -0300 Subject: refactor: make mapper function reusable Changed the function to make it reusable across versions of the CLI flag. This is part of a plan to compose the CLI command from an object with details about the flags. --- autoload/prettier/resolver/config.vim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index abdbb46..32f5c28 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -140,10 +140,10 @@ function! s:Flag_stdin_filepath(...) abort return '--stdin-filepath="' . l:current_file . '"' endfunction -" Returns '--loglevel error'. +" Returns '--loglevel error' or '--log-level error'. function! s:Flag_loglevel(config_and_sel, flag, props) abort let l:level = 'error' - return '--loglevel ' . l:level + return a:flag . ' ' . l:level endfunction " Returns '--stdin'. -- cgit v1.3 From 6649ecfdae2169e8b76d446aa162ce705685807f Mon Sep 17 00:00:00 2001 From: Victor S Date: Sat, 7 Oct 2023 23:30:50 -0300 Subject: refactor: add object with Prettier flags Added an object with details about Prettier CLI flags. This is part of a plan to compose the flags of the CLI command from a general object with flag details. --- autoload/prettier/resolver/config.vim | 101 ++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 32f5c28..430d994 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -165,3 +165,104 @@ endfunction function! s:Map_flag_to_cmd_part(config_and_sel, flag, props) abort return a:props.mapper(a:config_and_sel, a:flag, a:props) endfunction +let s:concat_value = function('s:Concat_value_to_flag') + +let s:FLAGS = { + \ '--use-tabs': { + \ 'json_name': 'useTabs', + \ 'global_name': 'use_tabs', + \ 'mapper': function('s:Flag_use_tabs')}, + \ '--tab-width': { + \ 'json_name': 'tabWidth', + \ 'global_name': 'tab_width', + \ 'mapper': function('s:Flag_tab_width')}, + \ '--print-width': { + \ 'json_name': 'printWidth', + \ 'global_name': 'print_width', + \ 'mapper': function('s:Flag_print_width')}, + \ '--parser': { + \ 'json_name': 'parser', + \ 'global_name': 'parser', + \ 'mapper': function('s:Flag_parser')}, + \ '--range-start': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_range_start')}, + \ '--range-end': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_range_end')}, + \ '--semi': { + \ 'json_name': 'semi', + \ 'global_name': 'semi', + \ 'mapper': s:concat_value}, + \ '--single-quote': { + \ 'json_name': 'singleQuote', + \ 'global_name': 'single_quote', + \ 'mapper': s:concat_value}, + \ '--bracket-spacing': { + \ 'json_name': 'bracketSpacing', + \ 'global_name': 'bracket_spacing', + \ 'mapper': s:concat_value}, + \ '--bracket-same-line': { + \ 'json_name': 'bracketSameLine', + \ 'global_name': 'bracket_same_line', + \ 'mapper': s:concat_value, + \ 'since': '2.4.0'}, + \ '--jsx-bracket-same-line': { + \ 'json_name': 'jsxBracketSameLine', + \ 'global_name': 'jsx_bracket_same_line', + \ 'mapper': s:concat_value, + \ 'deprecated': '2.4.0'}, + \ '--arrow-parens': { + \ 'json_name': 'arrowParens', + \ 'global_name': 'arrow_parens', + \ 'mapper': s:concat_value, + \ 'since': '1.9.0'}, + \ '--trailing-comma': { + \ 'json_name': 'trailingComma', + \ 'global_name': 'trailing_comma', + \ 'mapper': s:concat_value}, + \ '--config-precedence': { + \ 'json_name': 'configPrecedence', + \ 'global_name': 'config_precedence', + \ 'mapper': s:concat_value}, + \ '--prose-wrap': { + \ 'json_name': 'proseWrap', + \ 'global_name': 'prose_wrap', + \ 'mapper': s:concat_value, + \ 'since': '1.8.2'}, + \ '--html-whitespace-sensitivity': { + \ 'json_name': 'htmlWhitespaceSensitivity', + \ 'global_name': 'html_whitespace_sensitivity', + \ 'mapper': s:concat_value, + \ 'since': '1.15.0'}, + \ '--stdin-filepath': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_stdin_filepath')}, + \ '--require-pragma': { + \ 'json_name': 'requirePragma', + \ 'global_name': 'require_pragma', + \ 'mapper': s:concat_value, + \ 'since': '1.7.0'}, + \ '--end-of-line': { + \ 'json_name': 'endOfLine', + \ 'global_name': 'end_of_line', + \ 'mapper': s:concat_value, + \ 'since': '1.15.0'}, + \ '--loglevel': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_loglevel'), + \ 'deprecated': '3.0.0'}, + \ '--log-level': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_loglevel'), + \ 'since': '3.0.0'}, + \ '--stdin': { + \ 'json_name': '', + \ 'global_name': '', + \ 'mapper': function('s:Flag_stdin'), + \ 'deprecated': '2.0.0'}} -- cgit v1.3 From 6dd9a0813b78158254987e5452455000aabd6b02 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sat, 7 Oct 2023 23:57:33 -0300 Subject: refactor: add helper functions to get CLI version Added two helper functions to get the version of the Prettier CLI as a string. This is part of a plan to compose the CLI command from an object with flag details. --- autoload/prettier/resolver/config.vim | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 430d994..84dc933 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -266,3 +266,23 @@ let s:FLAGS = { \ 'global_name': '', \ 'mapper': function('s:Flag_stdin'), \ 'deprecated': '2.0.0'}} + +" Returns the argument string with unprintable characters represented in Vim +" internal format removed from both ends. +function! s:Trim_internal_unprintable(text) abort + let l:char_patt = '\%(\%(\^\m.\)\|\%(<\x\x>\)\)\{}' + let l:patt_at_ends = '^' . l:char_patt . '\|' . l:char_patt . '$' + let l:trimmed_text = a:text->substitute(l:patt_at_ends, '', 'g') + return l:trimmed_text +endfunction + +" Returns the version of the Prettier CLI as a string. +function! s:Get_prettier_cli_version() abort + let l:output = '' + redir => l:output + silent call prettier#PrettierCli('--version') + redir END + " The shell sends the string with whitespaces at both ends. + let l:prettier_cli_version = s:Trim_internal_unprintable(trim(l:output)) + return l:prettier_cli_version +endfunction -- cgit v1.3 From 0ecef37608eaea3e795b55b38b2403e7e8b5fdfb Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 09:35:35 -0300 Subject: refactor: add version comparison functions Added 2 functions that compare versions strings according to semantic version. This is part of a plan to compose the flags of the CLI command from an object with flag details. --- autoload/prettier/utils/version.vim | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 autoload/prettier/utils/version.vim diff --git a/autoload/prettier/utils/version.vim b/autoload/prettier/utils/version.vim new file mode 100644 index 0000000..3cbbb73 --- /dev/null +++ b/autoload/prettier/utils/version.vim @@ -0,0 +1,25 @@ +" Returns 1 if the first argument is the greater version, returns 0 if the +" arguments are the same version, or returns -1 if the first argument is the +" lesser version. +function! prettier#utils#version#Compare_versions(a, b) abort + let [l:a_major, l:a_minor, l:a_patch; l:rest] = a:a->split('\D') + \ ->map('str2nr(v:val)') + let [l:b_major, l:b_minor, l:b_patch; l:rest] = a:b->split('\D') + \ ->map('str2nr(v:val)') + let l:is_a_greater = + \ l:a_major > l:b_major + \ || (l:a_major == l:b_major && l:a_minor > l:b_minor) + \ || (l:a_major == l:b_major && l:a_minor == l:b_minor + \ && l:a_patch > l:b_patch) + let l:is_a_equal_b = + \ l:a_major == l:b_major + \ && l:a_minor == l:b_minor + \ && l:a_patch == l:b_patch + return l:is_a_greater ? 1 : (l:is_a_equal_b ? 0 : -1) +endfunction + +" Returns 1 if the first argument is greater than or equal to the second, +" otherwise returns 0. +function! prettier#utils#version#Is_greater_or_equal_version(a, b) abort + return prettier#utils#version#Compare_versions(a:a, a:b) != -1 +endfunction -- cgit v1.3 From 9dc059220e66aab08e7d68970c562fabbae28831 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 11:05:18 -0300 Subject: test: add tests for version comparison Added unit tests for version-comparison functions. --- tests/vimscript/version.vim | 126 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 tests/vimscript/version.vim diff --git a/tests/vimscript/version.vim b/tests/vimscript/version.vim new file mode 100644 index 0000000..9718011 --- /dev/null +++ b/tests/vimscript/version.vim @@ -0,0 +1,126 @@ +" To run the tests in this script, first add the vim-prettier plugin and let +" Vim load it, then uncomment the last line in this script, and source this +" file in Vim with the command +" ":source " where is the path to this file, e.g. +" ":source %". + +function! s:Test_version_comparison_greater_case() abort + echomsg 'Testing version comparison, greater case.' + + let l:ver_1 = '2.7.3' + let l:ver_2 = '0.9.8' + let l:value = prettier#utils#version#Compare_versions(l:ver_1, l:ver_2) + let l:expected = 1 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Test_version_comparison_lesser_case() abort + echomsg 'Testing version comparison, lesser case.' + + let l:ver_1 = '3.9.5' + let l:ver_2 = '10.5.2' + let l:value = prettier#utils#version#Compare_versions(l:ver_1, l:ver_2) + let l:expected = -1 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Test_version_comparison_equal_case() abort + echomsg 'Testing version comparison, equal case.' + + let l:ver_1 = '8.2.4' + let l:ver_2 = '8.2.4' + let l:value = prettier#utils#version#Compare_versions(l:ver_1, l:ver_2) + let l:expected = 0 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Test_is_greater_or_equal_version_greater_case() abort + echomsg 'Testing function that checks if is lesser version, greater case.' + + let l:ver_1 = '3.8.1' + let l:ver_2 = '0.2.9' + let l:value = prettier#utils#version#Is_greater_or_equal_version( + \ l:ver_1, l:ver_2) + let l:expected = 1 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Test_is_greater_or_equal_version_lesser_case() abort + echomsg 'Testing function that checks if is lesser version, lesser case.' + + let l:ver_1 = '7.2.8' + let l:ver_2 = '15.1.6' + let l:value = prettier#utils#version#Is_greater_or_equal_version( + \ l:ver_1, l:ver_2) + let l:expected = 0 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Test_is_greater_or_equal_version_equal_case() abort + echomsg 'Testing function that checks if is lesser version, lesser case.' + + let l:ver_1 = '4.12.185' + let l:ver_2 = '4.12.185' + let l:value = prettier#utils#version#Is_greater_or_equal_version( + \ l:ver_1, l:ver_2) + let l:expected = 1 + return assert_equal( + \ l:value, + \ l:expected, + \ 'Expected ' . l:expected . ' but received ' . l:value + \ . ' instead.') +endfunction + +function! s:Run_tests() abort + let v:errors = [] + + let l:test_functions = [ + \ function('s:Test_version_comparison_greater_case'), + \ function('s:Test_version_comparison_lesser_case'), + \ function('s:Test_version_comparison_equal_case'), + \ function('s:Test_is_greater_or_equal_version_greater_case'), + \ function('s:Test_is_greater_or_equal_version_lesser_case'), + \ function('s:Test_is_greater_or_equal_version_equal_case')] + + let l:results_as_returned = l:test_functions->copy()->map('v:val()') + let l:results_as_text = l:results_as_returned + \ ->copy() + \ ->map('v:key + 1 .. '': '' .. (v:val ? "failed" : "passed")') + + let l:has_failed_test = v:errors->len() > 0 + \ || l:results_as_returned->index(1) >= 0 + if l:has_failed_test + echoerr 'The tests failed.' + echoerr 'Results:' + echoerr l:results_as_text->join('; ') + echoerr 'Errors:' + echoerr v:errors->join('; ') + else + echomsg 'The tests were completed successfully.' + echomsg 'Results:' + echomsg l:results_as_text->join('; ') + endif +endfunction + +" Uncomment the next line to run the tests. +" call s:Run_tests() -- cgit v1.3 From 3dfc0efda164980d30495153024410c347d07da8 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 10:13:06 -0300 Subject: refactor: add function to filter flags by version Added a function to filter flags that are uncompatible with a supplied version. This is part of a plan to compose the flags of the CLI command from an object with flag details. --- autoload/prettier/resolver/config.vim | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 84dc933..4350fa4 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -286,3 +286,22 @@ function! s:Get_prettier_cli_version() abort let l:prettier_cli_version = s:Trim_internal_unprintable(trim(l:output)) return l:prettier_cli_version endfunction + +" Returns 1 if the version of the flag argument is compatible with the +" version argument, otherwise returns 0. +function! s:Filter_uncompatible_flag(version, _, flag) abort + let l:is_deprecated = exists('a:flag.deprecated') + \ && prettier#utils#version#Is_greater_or_equal_version( + \ a:version, a:flag.deprecated) + if l:is_deprecated + return 0 + endif + + let l:is_added = !exists('a:flag.since') + \ || prettier#utils#version#Is_greater_or_equal_version( + \ a:version, a:flag.since) + if !l:is_added + return 0 + endif + return 1 +endfunction -- cgit v1.3 From b2ad859a252ded6de298e08ded2e89d23caa12f7 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 11:12:11 -0300 Subject: refactor: add function to select compatible flags Added a function that selects the flags that are compatible with the version of the Prettier CLI being used. This is part of a plan to compose the flags of the CLI command from an object with flag details. --- autoload/prettier/resolver/config.vim | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 4350fa4..c0c9190 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -305,3 +305,22 @@ function! s:Filter_uncompatible_flag(version, _, flag) abort endif return 1 endfunction + +" Returns an object with the flags from the argument object that are compatible +" with the version of the Prettier CLI being used. +function! s:Get_current_version_flags(flags) abort + let l:prettier_version = s:Get_prettier_cli_version() + + let l:is_cached = exists('b:prettier_cached_flags') + \ && exists('b:prettier_last_used_cli_version') + \ && b:prettier_last_used_cli_version ==# l:prettier_version + if l:is_cached + return b:prettier_cached_flags->copy() + endif + + let l:compatible_flags = a:flags->copy()->filter( + \ function('s:Filter_uncompatible_flag', [l:prettier_version])) + let b:prettier_cached_flags = l:compatible_flags + let b:prettier_last_used_cli_version = l:prettier_version + return l:compatible_flags->copy() +endfunction -- cgit v1.3 From 680534fc54701f4958e88f325a58767d7c936fe5 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 20:03:01 -0300 Subject: docs: add Vim foldings to config.vim Added Vim foldings to sections of the code in config.vim to improve file navigation. --- autoload/prettier/resolver/config.vim | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index c0c9190..587ef14 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -45,6 +45,7 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo return l:cmd endfunction +" Mapper functions: {{{ " Returns either '--range-start X' or an empty string. function! s:Flag_range_start(config_and_sel, ...) abort if (!a:config_and_sel.hasSelection) @@ -165,6 +166,9 @@ endfunction function! s:Map_flag_to_cmd_part(config_and_sel, flag, props) abort return a:props.mapper(a:config_and_sel, a:flag, a:props) endfunction +" }}} + +" Constants: {{{ let s:concat_value = function('s:Concat_value_to_flag') let s:FLAGS = { @@ -266,7 +270,9 @@ let s:FLAGS = { \ 'global_name': '', \ 'mapper': function('s:Flag_stdin'), \ 'deprecated': '2.0.0'}} +" }}} +" Flags selector: {{{ " Returns the argument string with unprintable characters represented in Vim " internal format removed from both ends. function! s:Trim_internal_unprintable(text) abort @@ -324,3 +330,6 @@ function! s:Get_current_version_flags(flags) abort let b:prettier_last_used_cli_version = l:prettier_version return l:compatible_flags->copy() endfunction +" }}} + +" vim:foldmethod=marker:foldmarker={{{,}}}: -- cgit v1.3 From ec8650d942d86d3b7cf5d9114f66a4aee4cd85a2 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 11:24:05 -0300 Subject: fix: look option and CLI versions to form command Considered the addition and deprecation versions of each Prettier option contained in the object with details about the CLI flags when composing the CLI command. --- autoload/prettier/resolver/config.vim | 35 ++++------------------------------- 1 file changed, 4 insertions(+), 31 deletions(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index 587ef14..d609517 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -10,37 +10,10 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abo \ 'start': a:start, \ 'end': a:end} - let l:cmd = s:Flag_use_tabs(l:config_and_sel, '--use-tabs', {}) . ' ' . - \ s:Flag_tab_width(l:config_and_sel, '--tab-width', {}) . ' ' . - \ s:Flag_print_width(l:config_and_sel, '--print-width', {}) . ' ' . - \ s:Flag_parser(l:config_and_sel, '--parser', {}) . ' ' . - \ s:Flag_range_start(l:config_and_sel, '', {}) . ' ' . - \ s:Flag_range_end(l:config_and_sel, '', {}) . ' ' . - \ ' --semi=' . - \ get(a:config, 'semi', g:prettier#config#semi) . - \ ' --single-quote=' . - \ get(a:config, 'singleQuote', g:prettier#config#single_quote) . - \ ' --bracket-spacing=' . - \ get(a:config, 'bracketSpacing', g:prettier#config#bracket_spacing) . - \ ' --jsx-bracket-same-line=' . - \ get(a:config, 'jsxBracketSameLine', g:prettier#config#jsx_bracket_same_line) . - \ ' --arrow-parens=' . - \ get(a:config, 'arrowParens', g:prettier#config#arrow_parens) . - \ ' --trailing-comma=' . - \ get(a:config, 'trailingComma', g:prettier#config#trailing_comma) . - \ ' --config-precedence=' . - \ get(a:config, 'configPrecedence', g:prettier#config#config_precedence) . - \ ' --prose-wrap=' . - \ get(a:config, 'proseWrap', g:prettier#config#prose_wrap) . - \ ' --html-whitespace-sensitivity ' . - \ get(a:config, 'htmlWhitespaceSensitivity', g:prettier#config#html_whitespace_sensitivity) . - \ ' ' . s:Flag_stdin_filepath(l:config_and_sel, '--stdin-filepath', {}) . - \ ' --require-pragma=' . - \ get(a:config, 'requirePragma', g:prettier#config#require_pragma) . - \ ' --end-of-line=' . - \ get(a:config, 'endOfLine', g:prettier#config#end_of_line) . - \ ' ' . s:Flag_loglevel(l:config_and_sel, '--loglevel', {}) . - \ ' ' . s:Flag_stdin(l:config_and_sel, '--stdin', {}) + let l:cmd = ' ' . s:Get_current_version_flags(s:FLAGS) + \ ->map(function('s:Map_flag_to_cmd_part', [l:config_and_sel])) + \ ->values() + \ ->join(' ') return l:cmd endfunction -- cgit v1.3 From c3340cdf1b7ab72c72fee2507beb91f0a4413226 Mon Sep 17 00:00:00 2001 From: Victor S Date: Sun, 8 Oct 2023 15:10:39 -0300 Subject: docs: remove TODO comment of completed task Removed TODO comment that reminded to compose the flags of the CLI command from a list using list methods. The task is completed. --- autoload/prettier/resolver/config.vim | 1 - 1 file changed, 1 deletion(-) diff --git a/autoload/prettier/resolver/config.vim b/autoload/prettier/resolver/config.vim index d609517..7a9d813 100644 --- a/autoload/prettier/resolver/config.vim +++ b/autoload/prettier/resolver/config.vim @@ -3,7 +3,6 @@ function! prettier#resolver#config#resolve(config, hasSelection, start, end) abort " Allow params to be passed as json format " convert bellow usage of globals to a get function o the params defaulting to global - " TODO: Use a list, filter() and join() to get a nicer list of args. let l:config_and_sel = { \ 'config': a:config, \ 'hasSelection': a:hasSelection, -- cgit v1.3 From ba1d24036b35df89728344a46ed1f2006fbd1255 Mon Sep 17 00:00:00 2001 From: Victor S Date: Mon, 9 Oct 2023 19:38:05 -0300 Subject: docs: add comment describing global variable Wrote a comment describing the global variable that overwrites the "bracketSameLine" option. --- plugin/prettier.vim | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin/prettier.vim b/plugin/prettier.vim index 66adfcc..7ef774b 100644 --- a/plugin/prettier.vim +++ b/plugin/prettier.vim @@ -113,6 +113,7 @@ let g:prettier#config#bracket_spacing = get(g:,'prettier#config#bracket_spacing' " default: 'false' " See more: https://prettier.io/docs/en/options.html#jsx-brackets let g:prettier#config#jsx_bracket_same_line = get(g:,'prettier#config#jsx_bracket_same_line', 'false') +" This option has another name for Prettier versions 2.4.0 and higher: let g:prettier#config#bracket_same_line = get(g:, 'prettier#config#bracket_same_line', 'false') " avoid wrapping a single arrow function param in parens -- cgit v1.3