All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- Add configurable startup actions for grepper form. Might look like
// grepperFormStartupActions.json
{
"query": "@.*[:]{foo: @.foo, len_bar: s_len(@.bar)}", // for each URL queried, get a JSON array, from which you select the foo attribute and the length of the bar attribute of each item
"urls": [
"https://foo.gov.api?user=bar",
"https://foo.gov.api?user=baz",
]
}
- Add option for users to choose newline in JSON Lines.
- Make it so find/replace form can emit Python code that is equivalent to the generated RemesPath query
- Make RemesPath error messages less confusing
- Implement a less thread-unsafe way to have ArgFunctions use context:
- Add
uses_context
field to ArgFunction instances, so that they have JQueryContext appended to their arguments, and they can reference fields of that JQueryContext. - This way we don't have to have these methods mutating and referencing a global static variable.
- Additionally, the presence of a function with
uses_context=true
would serve as a flag that the query cannot be executed in parallel, because doing so would cause race conditions associated with the shared JQueryContext fields.
- Add
- Allow grepper form to parse JSON Lines documents. Would probably only try to parse
.jsonl
documents as JSON Lines. - Bring back multi-threaded parsing of JSON in the grepper form. I had to go back to single-threaded to avoid deadlocks when reporting progress.
- Implement a progress bar for the JSON-to-CSV form.
- (Note to future devs): Resist the temptation to fool around with the StringBuilder initial capacity for the ToString method of
Dtype.STR
JNodes. I tried, and it doesn't help performance.
- Make sure there aren't any easily-triggered race conditions induced by automatic parsing and validation after editing.
- In 6.1.1.18, there is no longer a global shared JsonParser, which was the main potential source of race conditions.
- Fix issue where pretty-printing or compressing causes tree view position tracking to be out of sync with the document until a query is issued or the
Refresh
button is hit. - Improve Alt-key accelerators in forms. They don't seem to work right for some reason.
- Completely Fix problem where icons disappear when going from light mode to dark mode (until Notepad++ is closed; does not persist after restart)
- this problem rarely surfaces, but it doesn't seem to be completely addressed
- issue with treeview closing when a file with a treeview is moved from one view to another
loop()
function used ins_sub
callbacks is not thread-safe. This doesn't matter right now because RemesPath is single-threaded, but it could matter in the future.- GrepperForm loses its JSON permanently when the buffer associated with its treeview is deleted.
- Since v7.0, holding down
Enter
in a multiline textbox (like the tree viewer query box) only adds one newline when the key is lifted. - Maybe use pre-7.1 (dictionary-based rather than indicator-based) selection remembering for Notepad++ 8.5.5 and earlier? Indicators are risky with those older NPP's because of the lack of
NPPM_ALLOCATEINDICATOR
.
- Mostly fix bug where icons would disappear when going from light to dark mode. As a side effect, the icons when using "standard icons: small" are smaller, but the icons under other conditions are larger.
- Fixed bug where running a RemesPath query in the tree view would cause a crash if the query box was empty or contained only whitespace.
- Fixed bug where some errors would not be raised on some syntactically invalid RemesPath queries containing two valid items not separated by a binary operator. For example,
1 * -2 7
andbar + @[0] 9
both had this problem.
- Use a different algorithm for representing decimal numbers to fix issues 83 and 81 on computers where v8.2 had not fixed those issues.
- As an unfortunate consequence of this fix, a very very small percentage of very high-precision decimal numbers will lose precision using this new algorithm. The vast majority of numbers with 17 digits of precision (the maximum precision attainable by JsonTools) will not lose precision when reformatted by JsonTools. For example, JsonTools will pretty-print
-6553693.3617752995
as the lower-precision-6553693.3617753
. However, note that JsonTools still handles high-precision doubles better than the JSON-Viewer plugin.
- As an unfortunate consequence of this fix, a very very small percentage of very high-precision decimal numbers will lose precision using this new algorithm. The vast majority of numbers with 17 digits of precision (the maximum precision attainable by JsonTools) will not lose precision when reformatted by JsonTools. For example, JsonTools will pretty-print
- Automatic parsing after editing and automatic JSON schema validation on opening a file no longer makes the error form visible if the user had previously opened the error form and then hid it.
- Tree view icon and menu item check are now correctly toggled depending on whether a tree view (other than the grepper form's tree view) is visible. This doesn't matter much, since multiple tree views can be open and a tree view that is not visible could become visible again, but it is a nice visual cue.
- When a file is pretty-printed or compressed or edited with RemesPath, the caret will be scrolled into view. Previously, if the file contained very long lines and word wrapping was turned off, the user might have to manually scroll to the left after pretty-printing or compressing.
- NUL characters (when rendered as
\u0000
or\x00
) can now be parsed. Previously they raised a fatal error.
- When a file is renamed, the name of a tree view associated with that file also changes to match the new name. This also happens when a treeview is refreshed with JSON from a different file.
- Add
rand_schema
RemesPath function to generate random JSON from schema.
- If a number string is too large or small for a 64-bit floating point number (for example,
-2e700
,3.5e+450
), the JSON parser will now represent them as-Infinity
(if they have a leading-
sign) orInfinity
, rather than representing them asNaN
. The linter also has a new message for when this happens. - If a JSON lines document is not compliant with the strict JSON specification, the status bar will now reflect that it is JSON lines.
- Stop considering the user's Windows culture when determining the UI language for JsonTools (fix issue 82). Now JsonTools will be translated into language X if and only if Notepad++ is in language X.
- Fix issue (introduced in v8.1, see issues 83 and 81) where decimal numbers were given unnecessarily precise string representations. For example, in JsonTools v8.1,
11.11
would be represented as11.109999999999999
even though the original11.11
was an equally valid representation. Now all decimal numbers will be given the more compact representation used in v8.0 and earlier unless the more verbose representation introduced in v8.1 would be necessary to avoid loss of precision (so there will be no regression on issue 78). Note that this new algorithm for formatting decimal numbers is about twice as slow as the algorithm used in v8.1 (for 64-bit JsonTools; 32-bit has no performance loss), although the impact on performance will be much less dramatic unless you are compressing an array where almost every element is a non-integer decimal number. - Fix the following issues with random string from regex:
- It previously incorrectly flagged some valid regular expressions (e.g.
(?-i)(?:xy{1,2}){,2}
) as having two consecutive quantifiers. - It previously did not correctly handle some character sets where the final character was
-
(for example,[+-]
previously would only generate+
, and now it correctly has a 50% chance of generating-
or+
)
- It previously incorrectly flagged some valid regular expressions (e.g.
- Fix issue where RemesPath incorrectly inferred the type of (a function
fun
followed by indexers) to be the return type offun
. For example, running the querysum(dict(items(@)).a)
on the JSON{"a": [1]}
now correctly returns1.0
, but RemesPath used to raise an error because it assumed thatdict(items(@)).a
had the same type asdict(items(@))
- Fix very rare crash bug when using the
Value to clipboard
option of the tree node right-click context menu. - Fix bug where some invalid JSON Lines documents (for example,
[1, \n2][3]
) would be accepted by the JSON Lines parser despite having elements that span multiple lines. - Fix minor bugs with how headers are formatted in the
s_csv
RemesPath function and JSON-to-CSV form. - Fix bug where renaming a file subject to schema validation based on filename patterns would cause its tree view to be lost.
- Fix bug where plugin actions (mainly RemesPath queries in regex mode) that set the text of the entire document to an empty string would not do anything. Those actions will now correctly remove all the text in the document.
- Fix issue 79 where, on higher display resolutions than the default 125% normally used by molsonkiko in development, some of the advanced controls in the find/replace form would not be visible.
- Fix annoying but harmless bug where, if the user had two views open and ran a plugin command on one or more selections in the second view, the indicator that JsonTools uses to remember selections (which is supposed to be hidden at all times) would cause the selections to be underlined.
- Address issue 80; now error form will be cleared of errors when the JSON parser does not log any syntax errors.
- Make it so that JSON Lines documents are correctly formatted as JSON Lines after sorting by the sort form.
- Make it so that refreshing a tree view originally associated with
oldFile
with JSON fromnewFile
will correctly cause the tree view to be associated withnewFile
. Previously, the tree view stayed associated witholdFile
, so attempting to open a new tree view foroldFile
would instead close the tree view now associated withnewFile
, because the command to open a tree view for a file closes that file's tree view if it already has an open one.
- Progress reporting with the JSON from files and APIs form (henceforth the
grepper form
). - In the
grepper form
, pressingEnter
inside thePreviously viewed directories...
box causes the current text of the box to be searched, assuming that it is a valid directory. - Translation of the following:
- Settings in the Settings form.
- JSON syntax errors and JSON schema validation errors (under the
jsonLint
field of the translation file) - Generic Windows message boxes (the boxes with
Ok
,Yes
,No
, andCancel
buttons and no other controls).
- The
path_separator
setting for formatting keys/indices and paths. Addresses issue 69. - Make it so left-clicking on the
Key/index to clipboard
andPath to clipboard
options of the treenode right-click context menu gets the path or key/index in whatever the default is from your settings, without having to click on one of the sub-menu items. - The
grepper form
now supports\
and/
(path separators) in search patterns, as well as**
to match any number of characters (including\
). - Generation of random strings from regular expressions.
- The
grepper form
now reads and parses all files asynchronously, and can be canceled. - While the
grepper form
is working on a request, it now ignores clicks on the API request button and the Search directories button.
- Rename
Choose schemas to automatically validate filename patterns
toValidate files with JSON schema if name matches pattern
, in the hopes that the new name will be less confusing. - Changed the wording of many JSON syntax error messages to be more consistent, per conky77's suggestion here.
- When attempting to translate to other languages, JsonTools now checks the UI language of Notepad++ before checking the Windows UI culture.
- When automatic validation after editing is turned on, only modifications that change the text of the document will trigger re-parsing.
- If there would be an
OutOfMemoryException
due to running out of memory while formatting JSON (a likely occurrence when using thegrepper form
), that error is caught and reported with a message box, rather than potentially causing Notepad++ to crash. - Ensure that hitting the down key does nothing when the last row of the error form is selected.
- Fix bug with random json from schema when parsing a schema that has the
enum
key but not thetype
key. - Make it so JsonTools simply does nothing rather than causing Notepad++ to crash when attempting to run plugin commands on files with more than 2147483647 bytes.
- Fixed number precision bug (issue 78).
- Rare bug generating schemas from JSON, only seen with some arrays of objects.
- Rare crash when saving
schemasToFnamePatterns.json
if automatic validation after editing is enabled. - Changes to the
max_schema_validation_problems
setting will apply immediately, including to previously compiled JSON schemas. - Unrecoverable crash due to stack overflow when generating random JSON from a recursive schema.
- Made it possible to translate JsonTools into other languages.
- Made the tree view font size configurable with the
tree_view_font_size
setting. Fixes issue 66. - Added dark mode tree view icons (addresses this GH issue comment).
- Allow users to manually enter directory names in the JSON from files and APIs form (referred to as "grepper form" for the rest of this section) rather than using a dialog or the dropdown menu.
- Added a "Search directories" button to the grepper form.
- Removed the
max_threads_parsing
setting for the grepper form, because the underlying implementation was changed in a way that made that setting useless. - Removed the
allow_datetimes
setting, because I do not feel confident that the potential benefits of the setting outweigh the danger of accidentally changing the format of people's dates or datetimes in some way that they were not expecting. - When all files have been parsed in the directory chosen with the grepper form, the directory name is no longer reset to the default value.
- Added a hard limit to the total combined size of all files parsed by the grepper form, to avoid hitting memory errors.
- Avoid unnecessarily refreshing the styles of all forms when settings other than
use_npp_styling
ortree_view_font_size
are changed. - The list of recently chosen directories in the grepper form is pre-filtered for existing directories, to hide the partial directory names that contaminate the config file.
- Fix bug where, if a setting in the config file had an invalid value (for example, a numeric setting having a value of
blah
), there might be an uncaught exception that would cause Notepad++ to crash. This bug appeared to be most likely to occur when the localization is not set toen-us
.
- Made it so that reloading the error form by pressing
Enter
would not cause certain message boxes to appear, to eliminate a potential "infinite" loop where the user would hitEnter
to close the message box, and that moved focus back to the error form, which then repeated the cycle when they lifted theEnter
key. - Automatic validation when
auto_validate
is true no longer opens the prompt asking if user wants to open the error form (ifoffer_to_show_lint
is true), because that could cause Notepad++ to crash or hang forever (see issue 60). - Made it so that automatic JSON schema validation (that is, any validation not manually invoked by the plugin menu command) no longer causes the caret to move to the location of the first schema validation error.
- Automatic validation (including non-schema validation) now refreshes the error form.
- Minor bug in PPrint remembering comments algorithm implementation that caused some arrays and objects to be compressed when they should have been pretty-printed.
- Fix bug where tests could crash under some circumstances due to filesystem weirdness making it impossible to find test files.
minLength
andmaxLength
keywords are now considered when making random JSON from schema- JsonTools now automatically navigates to the location of the fatal error when it fails to parse a document, unless the attempted parse was auto-triggered (say, by the automatic parse after editing)
- Selection-based mode now supports any number of remembered selections, and undo and redo actions usually do not cause selections to be forgotten. Performance also appears to be better.
- If the location of an error is between the
CR
and theLF
of aCR LF
newline, JsonTools will now always move before theCR
, rather than placing the caret in between them, which could cause confusion. - Automatic JSON schema validation after editing does not happen when the document is in
REGEX
mode. - Removed the
max_tracked_json_selections
setting, as it is no longer necessary.
- Using the Notepad++ find/replace form in Notepad++ versions 8.6.3 and 8.6.4 now appropriately shifts remembered selections when in selection-based mode.
- Bug where the space key did not work on the regex search form.
- Bug where automatic JSON schema validation after editing sometimes caused a deadlock that disabled some functionalities until Notepad++ closed.
- Possible plugin crash due to index-out-of-bounds error during parsing of JSON Lines.
- PPrint-style pretty-printing that remembers comments
- Add
and
andor
non-vectorized functions in RemesPath, which both use conditional excution. - Add
s_format
vectorized RemesPath function, for easy reformatting of JSON strings. - Python-style single-line comments in RemesPath
- A RemesPath user-defined language (UDL) file, providing some very basic syntax highlighting. It is buggy, but that is because the UDL system is inherently buggy, not because I did anything wrong (as far as I know).
- A
:
character between two key-value pairs in an object no longer causes a fatal error that makes the parser quit. - Add new
auto_try_guess_csv_delim_newline
setting. If this is true (default false), Regex search form now makes a very basic attempt to "sniff" if the current file is CSV whenever it is opened, or when theParse as CSV?
button is toggled on.
- Support for multiple JSON schema validation problems
- All RemesPath regular expressions are now multiline, meaning that
^
and$
now match the start and end of lines respectively, rather than the start and end of the document. - The
ifelse
vectorized function in RemesPath now uses conditional execution. - Default value for
sort_keys
setting is nowfalse
, meaning keys are left in their original order by default. This will not change existing settings. - Add optional arguments to
stringify
non-vectorized function in RemesPath, so that users can control the format of the output. - Make dark mode icons darker.
- This change only affects the code base, not the public API: changed almost all snake_case variable names to camelCase. RemesPath functions still use snake_case (e.g.,
s_mul
andgroup_by
still have those names), and all the settings in Settings.cs (e.g.,use_npp_styling
) that were previously snake_case are still snake_case. - Automatic linting after edits is now disabled while in selection-based mode.
- Automatic linting after edits will always attempt to parse the entire document, even if the user has made a selection that could be parsed as JSON.
- Numbers with unnecessary leading 0's (like
01
or002.5
) are now logged at theBAD
level, and numbers with trailing decimal points are now logged at theJSON5
level. - Error form keypress triggers now execute when the key is released, rather than when it is depressed.
- Automatic JSON schema validation now ignores the user's selections and always validates the entire document.
- Fixed issue where vectorized functions in RemesPath were not vectorized across objects if the first argument was a function of input and at least one of the non-first arguments was also a function of input.
- Fixed issue where entering invalid text into comboboxes in the regex search form and grepper form could cause a (mostly harmless) plugin crash.
- Improved refresh and loading speed for tree viewer on very large files in regex mode.
- Fix issue where tree view tracking of capture groups in regex search mode was wrong in some cases involving non-ASCII characters.
- Hitting
Escape
in the error form moves focus to the editor component. - When logging errors in selection-based mode, the error form now navigates to the location of the error in the overall document. Previously it navigated to the location of the error relative to the start of the selection.
- The regex search form no longer closes the currently active tree viewer when you focus or open it.
- Register forms (other than the modal AboutForm and JSON-to-CSV form) with Notepad++ using NPPM_MODELESSDIALOG. This permanently fixes the regression in Notepad++ 8.6.1 where Ctrl+X and Ctrl+C stopped working in textboxes.
- Eliminated potentially unrecoverable plugin crash when JSON parser tries to parse document with
-
or+
not followed by numeric chars (e.g.-a
,+
). Now such badly formatted numbers are parsed asNaN
.
- Python-style f-strings in RemesPath.
s_cat
RemesPath non-vectorized function.s_lines
,s_lpad
,s_rpad
, andzfill
RemesPath vectorized functions.Select all children
treenode action now works for root treenode in JSON Lines and selection-based documents.
- RemesPath syntax errors (anything caught by the lexer) now use
>>>HERE>>>
before the character where the error occurred, similar to how the Notepad++ find/replace form indicates the location of a regular expression syntax error. - Not part of public-facing API: Renamed the
JQueryContext.Evaluate
method toJQueryContext.Operate
, and renamedJMutator.Mutate
toJMutator.Operate
. - Make it so automatic validation does not require the document to be re-parsed as JSON, and is suppressed when in regex or ini mode.
- Eliminated plugin crash when attempting to open the regex search form after it had been closed.
- Greatly improved error form reloading performance.
- Some UI test failures (and probably related weirdness in public API) on older NPP versions
- Fix bug where
s_csv
RemesPath function did not properly handle delimiters that were regex metacharacters like|
- Option to customize which toolbar icons are displayed, and their order.
- New regex search form for using treeview to see regex search results in any file.
- New document type list box in tree view
- For loops in RemesPath
bool
,num
,s_csv
ands_fa
RemesPath vectorized arg functionsrandint
,csv_regex
,set
, andto_csv
RemesPath non-vectorized arg functions- Make second argument of
s_split
RemesPath function optional; 1-argument variant splits on whitespace. - Right-click dropdown menu in error form, allowing export of errors to JSON or refreshing the form.
- The JSON parser is now much better at recovering when an object is missing its closing
'}'
or an array is missing its closing']'
. - Support for JSON Schema validation of
enum
keyword where thetype
is missing or an array. Ctrl+Up
now snaps to parent of currently selected node in tree view.Ctrl+Down
now snaps to the last direct child of the currently selected node.
- The internal representation of object keys has changed to allow unescaped strings as keys (THIS DOES NOT AFFECT THE PUBLIC API EXCEPT IN SOME CORNER CASES IN REMESPATH).
- What I mean by this is that previously the key in the JSON object
{"\"": 3}
was previously internally represented as"\\\""
, with the quote character escaped as shown. - This had the advantage of making it slightly faster to display object keys (e.g., when pretty-printing/compressing/dumping), but made it impossible for certain strings to be valid object keys, in a way that could not be detected except when pretty-printing or compressing.
- Under the new system as of this version, all strings are acceptable as object keys. This has positive implications for RemesPath, as it means that users do not need to remember to escape string JNodes before using them as keys in an object.
- What I mean by this is that previously the key in the JSON object
- When using the JSON-to-CSV form to create CSV files, newline characters will no longer be escaped in strings. This is one of several changes made in order to acheive compliance with RFC 4180.
- Made
offer_to_show_lint
setting (which controls whether a prompt is shown when errors are found) true by default, so that a fresh installation will show the prompt. - Change RemesPath indexers to reduce the number of backslash escapes needed to get keys containing special characters like
"a\\b"
or"\"foo\"\tbar"
. For instance, previously@.`\\n\\\\a\"`
would be required to match the key"\n\\a\""
, whereas now@.`\n\\a"`
matches it. - Running a RemesPath query only causes an attempted re-parsing of the document if the treeview's current file is open.
- Running a replace query on the find/replace form now causes the tree to display only the values that were mutated.
- Changed the tabstop order of some forms, made it so that the find/replace form has complete tabstop coverage, and eliminated some tabstop-related issues associated with combo boxes in some forms.
- Benchmarks for compiling RemesPath queries now more accurately represent the effect of caching on performance.
- Fixed plugin crash when attempting to parse too-large hex numbers like
0x100000000000000000000
. Now the parser will fatally fail and add a lint indicating the issue, but the plugin will not actually crash. - Fixed some weird issues where mutating a variable in RemesPath could cause re-executing a query on the same input to return a different value. A minimal example:
var x = 1; x = @ + 1; x
would return 1 + (the number of times the query was executed) prior to this fix, but now it will always return2
as expected. This was also true of a bunch of other things in RemesPath, including projections and the map operator. - Fix issues where running a RemesPath query with a projection that referenced a variable indexing on a compile-time constant would cause an error. For example,
var x = @; 1->x
should return@
(the input to the query), but prior to this fix, it would instead cause an error. - Running tests would previously cause clipboard data to be lost irreversably. Now, if the user's clipboard contained text before running tests, the contents of the clipboard are restored to their pre-test values rather than being hijacked. Non-text data that was copied to the clipboard is still lost when running tests, and I may try to fix that in the future.
dict
function in RemesPath previously had a bug that could create invalid JSON if the strings to be turned into keys contained special characters (e.g., literal quote chars,\r
,\n
).- access violations when loading error form
- unnecessary prompt when manually reloading error form
- issue with trying to view error form when the error form was already open
- RemesPath backtick strings now can have a literal
\
character just before the closing backtick. Previously this was impossible because of a regex-writing bug. - Eliminated plugin crash when attempting to validate with an invalid JSON schema. Now a message box will show in that situation.
- Add parser for
.ini
files, allowing them to reformatted, viewed with the tree view, and queried and edited with RemesPath. - Python-style spreading of an array with
*
to fill multiple arguments of a function. - New RemesPath function(s):
at
function for indexing into array or object at an index or key determined at runtime (since indexing with square braces does not support keys/indices that are functions of input). - Made it possible to customize newline for CSV files generated by the JSON-to-CSV form.
- If the user chooses to parse a document as JSON Lines or INI using one of the commands from the main plugin menu, their choice is remembered when the document is re-parsed (including when the tree is re-opened and when the document is pretty-printed and compressed).
- For example, previously if you used the
Parse JSON Lines document
to parse a document as JSON Lines, and then closed and re-opened the tree view, the tree would be re-opened as JSON. Now the tree view will be re-opened as JSON Lines. - This remembered choice can be overridden by parsing as INI or JSON Lines again, selecting valid JSON, or (sometimes) selecting the entire document (if it is valid JSON).
- For example, previously if you used the
- All instances of
\r
(carriage return) in strings are now escaped to\\r
when generating CSVs with the JSON to CSV form. - Prompt user (can disable the prompt if desired) before pretty-printing JSON Lines documents.
- Bug where reformatting some large floating-point numbers would output text that could not subsequently be parsed.
- Fixed bug where changing the
try_parse_start_chars
setting would cause UI tests to fail. - JSON Lines documents can now be edited with RemesPath while keeping them in JSON Lines format.
- Issue where multiple tabs would be used for indentation when both the
tab_indent_pretty_print
andremember_comments
settings were true (only on files with comments). - Plugin crashes with single-line comments (both Python-style and JavaScript-style) that had no trailing newline.
- Bug where one-character comments that went to EOF would be truncated to an empty string.
- UI test failures when
sort_keys
setting was false.
- Toolbar icons for JSON pretty-print, JSON compress, treeview, and path to current position. Fix issue 36.
- Ability to select JSON or a JSON's children from the treeview.
- Variable assignment in RemesPath.
- Negated indexers in RemesPath.
- Ability to group by multiple variables with the
group_by
RemesPath function. - Option to skip the API request test when running tests.
- Selections that don't begin with a valid JSON document will now be ignored when parsing a document. See working with selections docs for more info and examples.
- Sort form previously did not follow Notepad++ styling on startup.
- Problems (introduced in v5.5) with running tests multiple times without cleaning up test files.
- New option for preserving comments when pretty-printing or compressing (just enable
remember_comments
in settings) - Support for projections of arbitrary type with the
->
operator.
- When a RemesPath query performed on a file with multiple selections fails on a selection, that selection is not shown at all in the tree view for the query result (previously it did appear, but the selection
start,end
was mapped tonull
).
- Fix crashes due to race conditions in the JSON from files and APIs form.
- Eliminated some annoying but harmless plugin crashes.
- Fix long-standing issue where closing buffer
A
with no associated treeview would not re-open the treeview of the fileB
automatically opened by Notepad++ whenA
was closed. - Dramatically reduce the frequency of Notepad++ freezing and crashing while running UI tests.
- Fix minor issue concerning the position assigned to JSON elements when pretty-printing or compressing JSON that didn't begin at the start of the file before being reformatted.
- Improved cursor tracking of arrays and objects when a RemesPath query selects a subset of their items.
- Bug where a RemesPath query that produced an object that was not a function of the input would have a runtime errror and fail to populate the treeview.
- Add support for operating on selections (fix issue 43).
- Add method for selecting every valid JSON element in the file
- Add
D&ump text of current document as JSON string
andDump JSON string(s) as ra&w text
convenience methods. - Add
parse
,type
andstringify
RemesPath functions. - Added UI tests.
- Improved RemesPath boolean indices so that they can be more easily chained together.
- Removed unneeded RemesPath lexer tests.
- Bug where
s_slice
,max_by
,min_by
,group_by
, andsort_by
all did not allow Python-style negative indices. - Bug where out-of-bounds negative indices when indexing in an array would throw an error rather than returning an empty array (which is the correct behavior, since RemesPath is not supposed to throw errors for indexing out of bounds).
- Eliminated huge latency when viewing very long JSON strings in the treeview.
- Eliminated potential access violation during plugin cleanup.
- Bug in which the plugin would be mistaken about the position of JSON elements after PPrint-style printing of some JSON containing non-ASCII characters in strings.
- Bug in which multiple Sort forms could be open.
- Bug in which running tests in Notepad++ versions older than v8 could cause Notepad++ to crash.
- Added support for tab indentation. Fix issue #38.
- Hitting
Enter
while in the error form causes the form to refresh. - In the error form, searching for the next row starting with a character now wraps around.
- Python constants
nan
andinf
can now be parsed asNaN
andInfinity
respectively. - Support for numbers with leading decimal points and hex numbers in RemesPath.
- Unquoted strings in RemesPath can now contain leading
$
, Unicode escapes, and all the Unicode characters that are allowed in unquoted JSON5 keys. - Add caching of RemesPath queries for slightly better performance on repeated execution of the same query.
- Massively impreoved test coverage.
- All arithmetic operations (
+
,-
,*
,/
,%
, and//
) can now accept booleans as one or both of their operands. not
is now a unary operator like-
(that is,not not @
is a valid statement, no parens needed). It also now tests "truthiness" like the same operator in Python.
- Bugs with operator precedence in RemesPath.
- Bugs with array and string slicing in RemesPath.
- Uncaught errors when parsing integers too large for the floating point spec (e.g., one followed by 400 zeros)
- Minor bug when scrolling up with the up arrow on error form.
- More appropriately silly error handling when dogeifying JSON.
- New error form for viewing syntax errors.
- When JSON is parsed, the document type status bar section changes to reflect the document's level of compliance with the JSON standard.
- Optional
sort_by_count
argument forvalue_counts
function, which sorts subarrays by count if true.
- Sort form for sorting and shuffling arrays.
- New RemesPath functions
rand
,enumerate
, anditerable
Alt-P-J-Y
key chord no longer dumps YAML. It instead opens the Sort form
- Opening a tree viewer no longer sets the document's lexer language to JSON if parsing failed.
- The
*
multiplication operator in RemesPath now supports multiplication of strings by integers (but not integers by strings). For example,["a", "b", "c"] * [1,2,3]
returns["a", "bb", "ccc"]
. - Setting,
offer_to_show_lint
to disable the pop-up prompt that asks if the user wants to see syntax errors. - Menu option to open a new document with the most recently found syntax errors for the current document.
- Dramatic improvement in speed of recursive search in RemesPath, which in turn improves the find/replace form.
- Support for validation of the
exclusiveMinimum
andexclusiveMaximum
keywords for numbers, but not random JSON generation that observes those keywords. - Further improvement of error messages from RemesPath queries.
- Whenever the user modifies a document that has an active tree viewer, a flag is set so that the document will be re-parsed the next time the user executes a query (including when the find/replace form is used).
- Bug where numbers did not have their type validated correctly when using
minimum
andmaximum
keywords.
Parsing is completely overhauled in version 5.0.0
. Here are the key changes:
- The parser tracks the cursor position of JSON elements instead of the line number.
- This is the cursor position of the start of the element in the UTF-8 encoding of the document.
- This makes navigating the document using the tree view much better because it is useful for navigation even when the entire document is one line.
- Errors while parsing need not throw errors
- Instead the parser has a
state
attribute that tracks how well the JSON string complies with JSON specifications of varying degrees of strictness. - The parser also has a
logger_level
attribute that determines how strictly the parser will enforce the JSON spec. - If the parser's
state
ever reachesFATAL
, parsing is immediately aborted and whatever has been parsed so far is returned. - The user can choose to throw an error if the state ever exceeds
logger_level
. - Advantages of the new approach:
- The parser can return all the valid parts of invalid JSON up to the point where the fatal error occurred.
- The plugin can use the status bar to show how severely the JSON deviates from the JSON standard.
- Tracking of errors in the parser's
lint
attribute is now independent of the strictness of the parser.
- Instead the parser has a
- The
allow_comments
,allow_unquoted_string
,allow_nan_inf
, andlinting
settings have been eliminated.- They have been replaced by the
logger_level
setting, described here
- They have been replaced by the
- Parsing appears to be about 30% faster.
- Changed the default value of
minimal_whitespace_compression
totrue
. - Made it so that automatic parsing and schema validation is off by default.
- New pretty-printing mode, PPrint.
- Find/replace form now automatically refreshes tree view on use, to ensure most up-to-date JSON is used
- Slight improvement to parsing performance, major improvement to pretty-print/compression performance
- Support for
minLength
andmaxLength
keywords in JSON Schema validation of strings. - Support for the rest of the JSON5 specification, with the following exception(s):
- Escaped newlines in strings are ignored. Note that this will not work if you are using newlines other than
\r
,\n
, or\r\n
! - Escaped digits are simply treated as digits, no matter what.
- Escaped newlines in strings are ignored. Note that this will not work if you are using newlines other than
- Support for the
undefined
andNone
literals, which are parsed asnull
. - Support for the
True
andFalse
literals. SinceNone
is now also supported, Python-style JSON documents are now fully supported. - Forms other than tree views are now colored to match the Notepad++ theme.
- Remove annoying bug where SOH characters (Ascii code
\x01
) were sometimes added to the end of the document when pretty-printing or compressing. - Comments immediately after numbers no longer throw an error
- Empty unclosed arrays and objects no longer throw an error
- Paths to treenodes including an empty string key (e.g.,
{"": 1}
) no longer throw an error - Better handling of comments, especially empty comments
- Performance bug (introduced in 4.14.0) in
Expand/Collapse all subtreees
tree node right-click menu option - Better RemesPath error message when user tries to use a function that doesn't exist
- RemesPath function names can be used unquoted when they're not being called as functions. For example,
@.items
would have raised an error previously becauseitems
is a function name, but now there's no problem. - Fixed annoying dinging when using Tab key to navigate Find/replace form.
- Lazy loading of tree view. This translates to a massive increase in responsiveness of the application. The tree viewer initially loads very quickly, but there is more latency expanding nodes that have not previously been expanded.
- Even if not all children of the root get their own tree node, the children that do can be expanded.
- The
use_tree
setting has been removed. It is no longer necessary, because loading of tree nodes is deferred until the user clicks on the tree. - Very long arrays and objects besides the root are now affected by the
max_json_length_full_tree
setting. Previously, if the root was an array with one element, but one of its children was an array with 1 million elements, the tree view might have attempted to create a tree node for all 1 million elements, which would have caused insane latency and possibly consumption of all available memory. Now, a hypothetical non-root array with 1 million elements will get 10 thousand tree nodes, same as the root.
- Automatic parsing and validation of JSON files every time the user stops acting for about 2 seconds after making a modification. This is disabled for large files, and can be disabled altogether if desired.
Settings->max_size_full_tree_MB
renamed toSettings->max_file_size_MB_slow_actions
to better reflect the fact that it configures the maximum file size for all slow actions, including full tree, automatic use of the JSON lexer, and automatic parsing and validation.- 40-50% speedup in JSON compression and pretty-printing when the
sort_keys
setting is set totrue
. The new sorting algorithm has the side-effect of slightly changing how two keys that are the same ignoring case are sorted, but other than that the behavior is the same.
- Support for
$defs
,definitions
, and$ref
keywords for random JSON generation. - When JSON parsing fails, jump to the position where the parsing stopped.
- Python-style
#
comments now supported with theallow_comments
setting turned on. - Option to turn off images on tree viewer.
- Non-empty arrays and objects now have
[length]
and{length}
indicators of their lengths. - Support for
contains
,minContains
, andmaxContains
keywords in JSON Schema validation of arrays. - Support for
minimum
andmaximum
keywords in JSON Schema validation and random generation.
allow_javascript_comments
setting name changed toallow_comments
because Python-style#
comments are now supported.
- Removed stupid dinging sounds when using control keys (tab, space, enter, escape) while in the tree view. Address issues #11 and #10
- Making several UI elements on various forms slightly larger and adding auto-sizing where possible, hopefully addressing issue #12.
- Added support for pattern JSON Schema keyword, allowing validation of strings against a regular expression.
- Added support for "definitions", "$defs", and "$ref" JSON Schema keywords, allowing schema re-use and even validation of recursive self-referential schemas.
- If auto-validation has been configured, it will now occur whenever a file is saved or renamed as well as when it is opened.
- JSON schema validation is significantly faster due to optimizations, pre-compilation of schemas into validation functions, and caching of schemas to avoid unnecessary reads from disk.
- Improvements to the
JSON from files and APIs
form (address #32):- URLs can now be entered into the URLs box as a JSON array or one per line as before. This could be helpful if there is a simple pattern in how the URLs are constructed and you want to use e.g. Remespath to build a list of URLs.
- The last 10 URLs searched are now remembered, and the URLs box is populated with them at startup.
- Bug where users who didn't have a JsonTools directory in the config folder would get a plugin crash on startup. Now a config subdirectory is automatically created if it doesn't already exist. This bug also existed with the
JSON from files and APIs
form, but now it has been solved in both places.
- Removed auto-installation of DSON UDL for Notepad++ older than
8.0
, because the UDL doesn't work anyway and the installation process causes an error message.
- Find/replace form no longer requires a perfect match to the string to be found in order to perform a replacement when regular expressions are turned off. For example, find/replace searching for
M
and replacing withZ
(regular expressions off) in the array["MOO", "BOO"]
would previously have left the array unchanged, but now will change it into["ZOO", "BOO"]
. - DSON is now sneakily hidden!
- Auto-validation of JSON files against JSON schema.
- To accommodate people who still want exact matching without having to write a regular expression, a
Match exactly?
checkbox has been added to the find/replace form. This is disabled whenever theregular expression
box is checked, and vice versa.
- Hopefully eliminated crash bug that sometimes seems to happen because a file that had a tree viewer associated with it was renamed. This bug is really unpredictable, so it may not be gone.
- Fixed bug in Main (based on failure to read SCI_GETTEXT documentation) that caused this plugin to be incompatible with versions of Notepad++ older than 8.4.1.
- Changed RemesPath
s_sub
function so that it either does regex-replace or simple string-replace, depending on the type of the second parameter.
- DSON emitter and UDL takes this plugin to the moon!
- Numbers (including
Infinity
) with leading+
signs can now be parsed if linting is turned on. If linting is not active, they will still raise an error.
- For performance reasons, the plugin no longer automatically turns on the JSON lexer for very long JSON files when pretty-printing, compressing, or showing query results. This is configurable via
Settings->max_size_full_tree_MB
. - Arrays and objects with a very large number of direct children no longer result in a tree view with pointers to every direct child. Instead, you just get pointers to a few evenly spaced children. Read more here.
- Previously if you used the
Save query result
button in the tree viewer, and the JSON contained non-ascii characters like 😀, the JSON would cut off early. TheJSON from files and APIs
form had the same problem when viewing results in a buffer.
- Prior to this release, JsonTools didn't track the active view/instance if there were multiple views/instances open. Now the plugin will track which view/instance you are currently editing and perform plugin actions accordingly.
- Problems with
stringify iterables
strategy of JSON->CSV with objects mapping to arrays where some of the arrays have unequal length.
- Adding an integer to any non-integer, non-float type will now raise an error.
- true and false will be treated as 1 and 0 respectively for the purposes of comparison operations.
- Any comparison of an integer, boolean, or float to anything not of one of those types will raise an error.
- Validation of
patternProperties
keyword in JSON Schema validation.
- Bugs with queries generated by find/replace form.
- Random JSON generation from a non-schema file.
- Tests for random JSON generation.
- Bug with random JSON generation where all keys (including non-required keys) in an object schema would always be included in random JSON. Now each object will have a random set of keys that is a superset of the required keys and a subset of all validated keys.
- JSON Schema generation is back!
- Support for extended ASCII characters (i.e., anything from
0x7f
(⌂) to0xff
(ÿ)) in random JSON.
- Non-ASCII characters (e.g., 😀, Я) are now displayed normally rather than being converted to ASCII using the
\u
notation (e.g.,\ud83d\ude00
,\u042f
). Resolve Issue #25.
- Fix bug where find/replace form advanced controls would not be toggled if the user manually resized the form.
- Fixed bugs where renaming a tree view (including the GrepperForm tree view) would cause problems, including a plugin crash upon closing Notepad++.
- Such crash bugs still seem to appear under conditions that I cannot reliably replicate, but they are rare and innocuous.
- Bugs with handling of binops in RemesPath. Also cleaned up the tests of
log
andlog2
. The longest-standing known bugs in RemesPath are finally squashed!
- Memory of past JSON from files+apis form directories chosen.
- When files are removed from the grepper form, the text in the associated buffer is refreshed with the pruned JSON.
any
andall
RemesPath functions for quickly determining if any or all of the values in a boolean array are true.- UI tests, implemented in Python with pyautogui. These should be used carefully because they use GUI automation.
- Double-clicking on the body of a tree viewer form (not on any of the buttons, just the empty space) now opens the file associated with that tree viewer.
- The arbitrary limit on the number of arguments for RemesPath functions like
zip
andappend
has been lifted. Fellow developers: to create a new function with any number of optional args, simply specify input_types up to min_args as normal, then the last input_type is the type for all optional args. - The default JSON->CSV algorithm now handles empty arrays by adding a row where all the parent keys of empty arrays are associated with an empty string. Basically, empty arrays are now treated as nulls, rather than being completely ignored.
- There can now be multiple tree viewer forms. Each is associated with a single file. You can still see a JSON tree for a different file than the one that you have open.
- Button for case-insensitive matching in find/replace form.
- Changed the API request tool to send asynchronous (not multithreaded) requests. This should result in better performance. The
max_api_request_threads
option in Settings has been removed because it is no longer needed. - A recursion limit of 512 has been added for JSON parsing to ensure that the plugin fails gracefully rather than causing Notepad++ to crash because of stack overflow. This is not configurable.
- This limit also applies to the number of unclosed parentheses in RemesPath, because a query like 2000 *
(
+1
+ 2000 *)
could also cause stack overflow.
- This limit also applies to the number of unclosed parentheses in RemesPath, because a query like 2000 *
- If a number is represented as an integer with absolute value
>= 2**63
, it will now be parsed as a double rather than throwing an overflow exception. Any number represented as a 64-bit integer will still be represented internally as an integer.- At present, RemesPath queries that might produce integers greater than
2**63
(e.g.,int(2**63)
) do not have such checks in place, so they will cause overflow errors rather than auto-convert to floating point.
- At present, RemesPath queries that might produce integers greater than
- Clicking the
Find/replace
button on the tree view when a find/replace form already exists now focuses the existing one rather than creating a new one.
- About form, containing information about the plugin. Resolves Issue 21
- Test files (the testfiles directory) are now included along with the DLL. This should address Issue 17 in which the plugin crashed while running the JSON grepper tests.
- The tree viewer's color scheme will now match the editor window. You can turn this off in the settings.
- The
Stringify iterables
strategy of the JSON to CSV form and theto_records
RemesPath function now correctly works with objects as well as arrays.
- Changed queries produced by find/replace form to make it more robust and easy to use.
- Eliminated potential errors when using the remove files button on the JSON from files and APIs form.
- Resolve Issue #17 with parsing of floating-point numbers in cultures where the decimal separator is
,
and not the.
used in the USA.
.NET Framework 4.8 must now be installed on the computer to run the plugin. As a practical matter, this means that any Windows OS older than Windows 10 May 2019 Update may be unable to use this plugin going forward.
- With the linter turned on, can now parse unterminated arrays and objects like
{"a": [1, {"b": 2
- This currently only works for non-empty arrays and objects (e.g.,
[
and{
will still raise errors).
- This currently only works for non-empty arrays and objects (e.g.,
- Removed
Search Up?
button from find/replace form because it does nothing.
- The API request tool can now send more than one request per thread.
- Improved tab-stop behavior on the find/replace form.
- Parsed JSON is now removed from memory when the associated file is closed.
- The find/replace form is automatically closed when its associated tree viewer is closed.
- Unfortunately, the implementation of this feature is such that temporarily hiding the tree view (which can happen when using the
JSON from files and APIs
form) will permanently close its find/replace form. Other solutions were considered and rejected as being even worse.
- Unfortunately, the implementation of this feature is such that temporarily hiding the tree view (which can happen when using the
- Closing a file other than the temporary buffer associated with the
JSON from files and APIs
tree view no longer closes that tree view. Closing the buffer associated with that tree view still deletes the tree.
- GUI form for finding and replacing in JSON.
..*
(recursive search with the star indexer) now returns an array containing all the scalar descendants of a JSON node, no matter their depth.- Replaced the
Current Path
button with a button for opening the find/replace form. - Recursive search always returns an array even if no keys match. In that case, an empty array is returned rather than an empty object.
- When a key contains singlequotes and double quotes (e.g.
"a'\""
), the Python and JavaScript keystyles now correctly formats that key. - Eliminated possibility of null dereferencing when using the
Path to current line
command on an unparsed file.
- Hotkeys for performing plugin commands when the
Plugins->JsonTools
submenu is open (resolve #14). to_records
RemesPath function for converting JSON to an array of objects. This essentially gives a JSON document with the same contents as the CSV file generated by the JSON to CSV form.pivot
RemesPath function for taking long data and pivoting it into wide data.- Benchmark test for floating-point arithmetic. Currently Remespath appears to be somewhat slower than Pandas (with default column dtypes) for string operations and faster for floating-point arithmetic.
- Annoying dinging sounds when pressing
Enter
,Tab
, orEscape
with the forms. Dinging sounds seem impossible to remove from theTreeView
control (see #11), but I will keep trying. - Make sure that changes to settings are propagated to the
JSON from files and APIs
form if it exists. - More useful error messages from RemesPath.
JSON from files and APIs
form's resources are disposed at cleanup.
- Bug with the
Refresh
button where editing a file with RemesPath would not allow Refresh to properly reflect the text in the file. - Bug where clicking on a node would not always snap the caret to the node's line if that node was the only one in the tree.
Refresh
button for resetting the form with the JSON in the currently active buffer (resolves Issue #13).- Tree view enhancements (resolves Issue #10):
- Clicking on a tree node to expand it also changes the displayed node path and snaps the caret.
Tab
can be used to switch between controls on the tree form.- Drop-down menu option for expanding/collapsing all subtrees when right-clicking on a tree node.
- Query box is auto-selected when tree is opened.
Ctrl+Enter
while query box is selected submits the query.Enter
while any button selected is equivalent to clicking it.Enter
while tree is selected toggles the selected node between expanded/collapsed.Escape
key takes focus from the tree back to the text editor (resolves Issue #11).
- Minimizing the tree view closes it completely.
- Resolved Issue #9. Navigating through the tree using the arrow keys instead of the mouse now correctly updates the line number and the current path displayed in the box below the tree.
- Menu command for getting path to first node in current line.
- Right-clicking on tree nodes lets you get the current node's value, key/index in parent iterable, or path.
- key_style option in settings for customizing how the path is formatted (e.g., dot syntax for JavaScript vs. obligatory square brackets and quotes for Python)
- Automatic resizing of the query box and the tree view when the docking box is resized.
- A text box containing the path to the currently selected tree node (in the default key style) and a button for copying it to the clipboard.
- Settings now persist between sessions. They are saved to an ini file in the Notepad++ config directory.
- New RemesPath functions:
concat
function in Remespath for concatenating arrays or merging objects.append
function for adding scalars to arraysadd_items
function for adding key-value pairs to objects
- Menu command for generating a JSON Lines document from a JSON array.
- JSON formatting options:
sort_keys
, whether to sort the keys of objectsminimal_whitespace_compression
, whether to remove ALL whitespace when compressing JSON or leave one space after each array/object item and after the colon in an object key-value pair, as is the standard style in Python.indent_pretty_print
, how many spaces of indentation to use per level of JSON.pretty_print_style
, the style of pretty-printing to use.
- You can no longer have more than one tree viewer open. The
Open JSON tree viewer
command closes the current tree viewer if one is already open.
- Checkbox in tree view for toggling full-tree view of the JSON.
- JSON Lines documents can now be parsed.
- Got rid of keyboard shortcut for
Run Tests
, since that's really only for people who are debugging the plugin.
- New setting (
use_tree
) for disabling the tree altogether. Since populating the tree is generally slower than parsing JSON or executing queries, this can provide a significant responsiveness boost. - New setting (
max_size_full_tree_MB
) for the maximum size, in megabytes, of a JSON file (default 4) such that the entire JSON tree will be recursively added to the tree view. Populating the full tree could lead to massive latency and memory consumption. Any file above this size will only have the direct children of the root added to the tree, to provide some minimal quality of life without greatly compromising performance.- This setting also applies to queries, although I will attempt to add some code to determine if the query resultset is small enough that populating the query's full tree would not be too expensive.
- Fully eliminated early cutoff of CSV files produced by the JSON->CSV form containing non-ascii characters by using
Encoding.UTF8.GetByteCount
instead of my own bespoke byte-counting algorithm. - For both the ToString method of string JNodes and the JsonParser, implemented the algorithm used by Python's JSON encoder and decoder for handling surrogate pairs of Unicode characters that represent characters greater than 0xffff.
- As noted above, the default behavior is now to only display the top-level nodes of the JSON for 4+ MB files in the tree view. This can be changed in settings.
- New 0-arg constructor for JNode that makes a JNode with null value, Dtype.NULL, line_num 0.
- New 0-arg constructors for JArray and JObject that create instances with no children.
- Fixed some bugs in JsonSchema, but it's still kind of a mess.
- The Make Schema button has been removed, and will not be reintroduced until JsonSchema.cs is debugged. There are enough known bugs with JsonSchema.cs on top of the unknown bugs that users should not be shown the feature at all, lest they believe it is robust enough to consistently give them a valid schema.
- Assignment operator in RemesPath. Now you can edit documents with RemesPath, not just query them!
- Menu option for converting a JSON document to YAML. Until I fix the bugs, it will throw up a message box warning the user that this option has some known bugs.
- So it turns out that
Convert.ToDouble(null)
,Convert.ToInt64(null)
, andConvert.ToBoolean(null)
all return0
, which meant that before I added a bunch more runtime type checking, there were stupid bugs with vectorized arithmetic where you could get something like querying@ - 1
with input[[]]
returning[-1.0]
. That has been fixed, and tests have been added to make sure it works.
RemesParser.Search
andRemesPathLexer.Compile
now have a requiredout bool
parameter that indicates whether the query was an assignment expression. This is a backwards-incompatible change.- I may try to come up with a better solution, but it seems important for the parser to give some indication of whether the input JSON was mutated.
- RemesPath querying to the tree viewer
- Conversion of RemesPath query results to CSV files
- Creation of JSON schemas for query results
- Because RemesPath querying has been added, the tree now tracks the query result rather than the underlying JSON. The caret tracking still mostly works, but only if the query is identity (
@
) or purely indexing-based (i.e., selecting indices from arrays, keys from objects, and applying boolean indices).
- JsonParser will no longer accept invalid JSON that has anything other than whitespace at the end of a valid document.
- For example
[1, 2, 3] d
would previously have been accepted (ignoring thed
at the end) and now the parser will reject it.
- For example
- Longs (type used for integers in our JSON) are always converted to doubles before comparison to other numbers.
- Previously, if x was an long and y was a double, the comparison
x > y
would involve converting y to a long, but an identical comparison with different operand ordery < x
would involve converting x to a double. - For example,
3.5 < 4
would previously (and still will) returntrue
because 4 would be converted to 4.0, but4 > 3.5
would previously have returnedfalse
because 3.5 would be converted to 4. - The only downside of this approach is that integers between 4.5036e15 (2 ^ 52) and 9.2234e18 (2 ^ 63) can be precisely represented by longs but not by doubles, so those integers will have a loss of precision.
- Previously, if x was an long and y was a double, the comparison
- Parsing multiple files found by grepping or multiple API request responses is now multithreaded.
- JSON tree viewer
- All known bugs with RemesPath, except the weird issue with uminus'd functions of CurJson as the second argument to the
range(x,y,z)
function. - Got rid of issue where RemesPath query compilation time was incorrectly calculated.
- Contains only the minimum functionality required to be useful. Linting syntax errors, changing parser settings to allow comments and whatnot, etc.