diff --git a/.gitignore b/.gitignore index 8b9ddb472..3448679da 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ /dist /tmp /out-tsc +.angular +.nx # dependencies /node_modules @@ -55,9 +57,4 @@ idl.extension.host.log compliance/3rdpartylicenses_condensed.md compliance/3rdpartylicenses_encryption.csv compliance/3rdpartylicenses.csv -compliance/compliance.json - -# IDL notebooks -idl/routines/notebooks/** - -.angular +compliance/compliance.json \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index fb48f4a2c..6027050a6 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,3 +16,5 @@ compliance *settings.json apps/test-tokenizer/src/test-maker/cache/cache.json .angular + +/.nx/cache \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index ca8eedb02..2f82cbcb3 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,6 +18,7 @@ "bubbleanimation", "defint", "Deref", + "didnt", "Doesnt", "dont", "ENVI", diff --git a/.vscodeignore b/.vscodeignore index c6952fa3f..5daf9b8fd 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,6 +1,7 @@ .angular/** .github/** .idl/idl.json +.nx/** .vscode/** .vscode-test/** apps/** @@ -19,6 +20,7 @@ dist/apps/client/assets/.gitkeep dist/apps/client-e2e/** dist/apps/idl-webview/3rdpartylicenses.txt dist/apps/i18n/** +dist/apps/notebook/components/3rdpartylicenses.txt dist/apps/package-json/** dist/apps/parsing-worker/3rdpartylicenses.txt dist/apps/parsing-worker/assets/.gitkeep diff --git a/CHANGELOG.md b/CHANGELOG.md index b9ac14df4..3a66b1b49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,11 +4,39 @@ All notable changes to the "idl" extension will be documented in this file. For much more detail on incremental work for large features, see our [developer notes](./extension/docs/developer/dev-notes/README.md). -## Unreleased +## Preview Features -Preview release of IDL Notebooks! This is a first pass at adding notebook support for IDL which is independent from Jupyter. +This section of the CHANGELOG documents features that have been added to the extension, but are still in an experimental phase. Feel free to try them out and provide feedback via discussions or issues on our GitHub page. -> Notebooks are a preview feature and, based on early adopter feedback, will likely change +Code style revamp! We reworked how routines, routine methods, properties, and structure names get formatted. This includes: + +- Support for camel case ("camelCase") and pascal case ("PascalCase") styling. Mileage may vary here, based on the routine names, so please let us know if this doesn't look quite right or do what you expect. Some routines that start with "IDL" or "ENVI" might surprise you with the case conversion. + +- New style setting called "routineMethods" so that you can indicate the styling for methods apart from normal functions or procedures + +- New style setting called "structureNames" so that you can have structure names have consistent formatting. + +- We also now format the structure names in inheritance statements. + +- We also use structure formatting preferences when auto-completing structure names + +- Routine formatting now gives you the benefit-of-the-doubt when formatting routines and routine methods. In the past, if we encountered an unknown routine, we would not change the appearance. Now, even if we don't know the class method or routine, we apply styling. Milage may vary here based on the style you use when we can't get the source information. + +- New defaults: + + - Properties: camelCase + + - Routines: match definition + + - Routine methods: camelCase + + - Structure names: PascalCase + +- When generating ENVI and IDL tasks, using our new case libraries, we attempt to make a pretty display name from parameter names. For example converting the keyword "my_keyword" to "My Keyword". This applied to task and parameter display names. + +## 4.0.0 November 2023 + +The official release of IDL Notebooks! This is a first pass at adding notebook support for IDL (which is independent from Jupyter). We are hoping to have early adopters try it out and provide feedback on how notebooks behave. Read below to learn more or find an example IDL and ENVI Notebook directly within VSCode in the IDL sidebar. Here are some of the features that notebooks bring: @@ -42,6 +70,52 @@ Here are some of the features that notebooks bring: - After each cell is executed we issue a `retall` command to make sure that we are at the top-level and not stopped in a weird state +Updated the IDL and ENVI icons throughout the extension and on our github pages. This is the same icon that will be used as part of the next official release of ENVI and IDL. + +We now use colored icons for file icons and added some new file associations for our ENVI within the editor. If you have a theme that doesn't look great with our icon colors, let us know! + +With the new icons, updated our custom icon theme to include the new ENVI logo for key ENVI file extensions. + +Added the ability to convert your IDL notebooks to PRO code! This exciting features uses intimate knowledge of IDL to break down the code in your cells and put it back together as a single PRO file. + +- Any routines and non-main level program code is put together first and follows the order of the cells. Then, any main-level programs within cells or single lines of code are added as one, large main level program at the end. + +- Milage may vary based on how you wrote your notebook, but it is very easy to get out your routine definitions + +- Use GitHub to let us know if this should behave differently! + +Expanded sidebar for notebooks with buttons for: + +- Creating a new notebook + +- Formatting the IDL Code in your notebook cells (shortcut for VSCode native command) + +- Ability to open an example IDL Notebook + +- Ability to open example ENVI Notebook + +- Converting notebooks to PRO code + +There's also a command added that will reset your example notebooks to what we had originally. it is called "IDL: Reset IDL and ENVI Example Notebooks'. + +When automatically opening ENVI files, the text displayed adds a note about how you can disable the behavior by looking at the extension documentation. + +Optimize the generation of the code outline and semantic tokens (static class references) to calculate both at the same time we are parsing a file or cell of code. This reduces extra CPU usage from retrieving complex information from our cache. + +When notebooks start, we now perform an extra check to make sure we have the routines needed to function correctly. This is mainly for developers and edge-cases where you weren't provided any feedback on the startup process and wouldn't know there was a problem. + +Resolved an issue where you couldn't view the output from a notebook cell in VSCode. We provided a default VSCode configuration which fixes this problem and added a new doc to the extension to capture known issues and how to solve them. + +Fixed an issue where statements being sent to IDL were not executing correctly for implied print + +When generating ENVI and IDL tasks, we try to make a nice display name for task and parameter names + +Added auto-complete for "inherits" statements in structure definitions + +Fixed an issue where we incorrectly identified main level programs in parsed PRO code that were only comments + +When we parse documentation for routines, we now accept docs within routine definitions. If you have a comment block immediately following parameters, then that takes priority over comment blocks above. + ## 3.2.4 October 2023 Fixed an issue where improper versions of node.js were used for the language server startup. This caused failures in the language server starting which would prevent any of the feature goodness of the language server from being accessible. diff --git a/README.md b/README.md index 8d84bc067..18fba75da 100644 --- a/README.md +++ b/README.md @@ -36,22 +36,42 @@ -**3.0 is here!** +**4.0.0 is here!** -This release offers many exciting and new features, such as syntax-error checking, linting, debugging, and profiling. With all these new features, there also may be some undocumented software enhancements (i.e. bugs). For these please use [GitHub](https://github.com/interactive-data-language/vscode-idl) to file bug/feature requests. There is also a quick link for submitting bugs for the extension in the IDL View. +This release headlines our newest feature: IDL Notebooks! The IDL Notebook format is standalone and only requires this extension to function (no extra dependencies on Python or Jupyter). -See below and the [CHANGELOG.md](./CHANGELOG.md) for full details. +Within the extension, you'll find a new sidebar entry to help create a new notebook, open IDL and ENVI Notebook examples, and convert your IDL Notebooks to a PRO file as well. If you have questions, feel free to reach out to us on GitHub with any feedback or issues you encounter. + +In addition to this, we have revamped our tools for styling/formatting your code to include other case styles like pascal and camel case. + +That's not all that is included in this release, so check out the [CHANGELOG.md](./CHANGELOG.md) for full details. > If you are looking to contribute, or get your development environment setup, see [CONTRIBUTING.md](./CONTRIBUTING.md). --- -This extension adds syntax highlighting, code snippets, debugging, problem reporting (undefined variables and syntax errors, 100+ in total!), and much more for the Interactive Data Language (IDL) from NV5 Geospatial Software (formerly Research Systems, Inc.). +This extension adds syntax highlighting, code snippets, debugging, problem reporting (undefined variables and syntax errors, 100+ in total!), IDL Notebooks, and much more for the Interactive Data Language (IDL) from NV5 Geospatial Software (formerly Research Systems, Inc.). For a full list of changes, see [CHANGELOG.md](./CHANGELOG.md) for lots of details. +## IDL Requirement + +Using the "debug" sessions of IDL requires that you have a version of IDL with lists, hashes, and orderedhashes (and the ability to parse/serialize JSON). + +The extension is tested against: + +- IDL 8.9 + +- IDL 9.0 + +Anything else is use-at-your-own-risk and may not work. + +For notebooks, we only test against the above versions, and the ENVI Notebook API does require ENVI in order to function. + ## Features +- IDL Notebooks for a new, modern, and ad-hoc way to develop IDL code! Check out the examples to learn about how they work (accessible through the sidebar of the extension). + - Before compiling any code, more than 100 syntax errors/problems/hints are detected and reported to users. - Syntax errors you encounter while writing code offer information/details on why they are problems to help you learn the in's and out's of IDL better. @@ -128,14 +148,6 @@ For a full list of changes, see [CHANGELOG.md](./CHANGELOG.md) for lots of detai - You may occasionally see some text that is printed to the console when IDL is running, this is a known bug that happens for a few rare cases and can be ignored. -- Using the "debug" sessions of IDL requires that you have a version of IDL with lists, hashes, and orderedhashes (and the ability to parse/serialize JSON). The extension has been tested against: - - - IDL 8.8 - - - IDL 8.9 - - Anything else is use-at-your-own-risk and may not work. - ## Release Notes See [CHANGELOG](CHANGELOG.md). diff --git a/apps/client-e2e/project.json b/apps/client-e2e/project.json index 0cc115b66..b92c1f8e0 100644 --- a/apps/client-e2e/project.json +++ b/apps/client-e2e/project.json @@ -43,7 +43,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/client-e2e/**/*.ts"] diff --git a/apps/client-e2e/src/main.ts b/apps/client-e2e/src/main.ts index f116d41dc..43702ca8a 100644 --- a/apps/client-e2e/src/main.ts +++ b/apps/client-e2e/src/main.ts @@ -1,5 +1,8 @@ +import { FindIDL } from '@idl/idl'; import { EXTENSION_FULL_NAME, GetExtensionPath } from '@idl/shared'; import { Sleep } from '@idl/test-helpers'; +import { GetWorkspaceConfig, IIDLWorkspaceConfig } from '@idl/vscode/config'; +import { IDL_EXTENSION_CONFIG_KEYS } from '@idl/vscode/extension-config'; import { IInitializeType } from '@idl/vscode/initialize-types'; import { OpenFileInVSCode, VSCODE_COMMANDS } from '@idl/vscode/shared'; import expect from 'expect'; @@ -34,11 +37,23 @@ export async function run(): Promise { // run our tests try { + /** + * Manually specify IDL folder + */ + const idlDir = FindIDL(); + + // validate we know where it is + if (!idlDir) { + throw new Error('Unable to find IDL, cannot run tests'); + } + + // alert user which IDL we are using + console.log(` `); + console.log(`Test are using this IDL: "${idlDir}"`); + // get extension const ext = vscode.extensions.getExtension(EXTENSION_FULL_NAME); - console.log(ext); - // activate extension ACTIVATION_RESULT = await ext.activate(); @@ -89,6 +104,16 @@ export async function run(): Promise { // close editor await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + // get the current workspace config + const config = GetWorkspaceConfig(); + + // set latest IDL folder + (config as IIDLWorkspaceConfig).update( + IDL_EXTENSION_CONFIG_KEYS.IDLDirectory, + idlDir, + true + ); + // check if we allow debug logs if (DEBUG_LOGS) { ACTIVATION_RESULT.client.logger.setDebug(DEBUG_LOGS); diff --git a/apps/client-e2e/src/tests/debugging/_debugging-runner.ts b/apps/client-e2e/src/tests/debugging/_debugging-runner.ts index f0fdd3bc6..cf701fbb9 100644 --- a/apps/client-e2e/src/tests/debugging/_debugging-runner.ts +++ b/apps/client-e2e/src/tests/debugging/_debugging-runner.ts @@ -6,6 +6,7 @@ import { Compile } from './compile'; import { Continue } from './continue'; import { Edit } from './edit'; import { Exit } from './exit'; +import { ImpliedPrint } from './implied-print'; import { RigorousAlwaysReturn } from './rigorous-always-return'; import { StartDebugging } from './start'; import { VariableReplacement } from './variable-replacement'; @@ -53,6 +54,12 @@ DEBUGGING_RUNNER.addTest({ critical: true, }); +DEBUGGING_RUNNER.addTest({ + name: 'Verify implied print works right', + fn: ImpliedPrint, + critical: true, +}); + DEBUGGING_RUNNER.addTest({ name: 'Manual exit closes cleanly', fn: Exit, diff --git a/apps/client-e2e/src/tests/debugging/implied-print.ts b/apps/client-e2e/src/tests/debugging/implied-print.ts new file mode 100644 index 000000000..de33ca435 --- /dev/null +++ b/apps/client-e2e/src/tests/debugging/implied-print.ts @@ -0,0 +1,30 @@ +import { CleanIDLOutput } from '@idl/idl'; +import { IDL_COMMANDS } from '@idl/shared'; +import expect from 'expect'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies that simple statements that should be executed as implied print are + * indeed interpreted like that + */ +export const ImpliedPrint: RunnerFunction = async (init) => { + /** + * Start IDL + */ + const started = await vscode.commands.executeCommand( + IDL_COMMANDS.DEBUG.START + ); + + // verify we started + expect(started).toBeTruthy(); + + // compile file + const res = CleanIDLOutput( + await init.debug.adapter.evaluate(`!version`, { echo: true }) + ).toLowerCase(); + + // make sure we compile + expect(res.includes('attempt to call undefined procedure')).toBeFalsy(); +}; diff --git a/apps/client-e2e/src/tests/interactions/notebooks-interact-right.ts b/apps/client-e2e/src/tests/interactions/notebooks-interact-right.ts index 7a070c6db..0a4c53b0e 100644 --- a/apps/client-e2e/src/tests/interactions/notebooks-interact-right.ts +++ b/apps/client-e2e/src/tests/interactions/notebooks-interact-right.ts @@ -89,7 +89,7 @@ export const NotebooksInteractRight: RunnerFunction = async (init) => { 'textDocument/semanticTokens/full', tokenParams ) - ).toBeNull(); + ).toEqual({ data: [] }); // short pause await Sleep(250); diff --git a/apps/client-e2e/src/tests/interactions/pro-code-interacts-right.ts b/apps/client-e2e/src/tests/interactions/pro-code-interacts-right.ts index c2cb39fb1..ebaf36e26 100644 --- a/apps/client-e2e/src/tests/interactions/pro-code-interacts-right.ts +++ b/apps/client-e2e/src/tests/interactions/pro-code-interacts-right.ts @@ -82,7 +82,7 @@ export const ProCodeInteractRight: RunnerFunction = async (init) => { 'textDocument/semanticTokens/full', tokenParams ) - ).toBeFalsy(); + ).toEqual({ data: [] }); // short pause await Sleep(250); diff --git a/apps/client-e2e/src/tests/notebooks/_notebook-runner.ts b/apps/client-e2e/src/tests/notebooks/_notebook-runner.ts index d79ba3856..1711071e9 100644 --- a/apps/client-e2e/src/tests/notebooks/_notebook-runner.ts +++ b/apps/client-e2e/src/tests/notebooks/_notebook-runner.ts @@ -1,16 +1,23 @@ import { Logger } from '@idl/logger'; import { Runner } from '../runner.class'; +import { NewNotebook } from './new-notebook'; import { NotebookFormats_1_0_0 } from './notebook-formats-1.0.0'; import { NotebookFormats_2_0_0 } from './notebook-formats-2.0.0'; import { NotebookProblemsTrackRight } from './notebook-problems-track-right'; import { RunNotebookReset } from './notebook-reset'; import { RunNotebookStop } from './notebook-stop'; +import { NotebookToProCodeAllCells } from './notebook-to-pro-code-all-cells'; +import { NotebookToProCodeOnlyCode } from './notebook-to-pro-code-only-code'; +import { OpenENVINotebookExample } from './open-envi-notebook-example'; +import { OpenIDLNotebookExample } from './open-idl-notebook-example'; +import { ResetNotebookExamples } from './reset-notebook-examples'; import { RunENVIMessageListenerTestNotebook } from './run-envi-message-listener-test-notebook'; import { RunProblemNotebooks } from './run-problem-notebooks'; import { RunTestENVIMapNotebook } from './run-test-envi-map-notebook'; import { RunTestENVINotebook } from './run-test-envi-notebook'; import { RunTestNotebook } from './run-test-notebook'; +import { RunUnsavedNotebook } from './run-unsaved-notebook'; import { SaveAndClearNotebook } from './save-and-clear-output'; /* @@ -40,12 +47,54 @@ NOTEBOOK_RUNNER.addTest({ critical: true, }); +NOTEBOOK_RUNNER.addTest({ + name: 'Verify we can create new notebooks', + fn: NewNotebook, + critical: false, +}); + +NOTEBOOK_RUNNER.addTest({ + name: 'Open IDL example notebook', + fn: OpenIDLNotebookExample, + critical: false, +}); + +NOTEBOOK_RUNNER.addTest({ + name: 'Open ENVI example notebook', + fn: OpenENVINotebookExample, + critical: false, +}); + +NOTEBOOK_RUNNER.addTest({ + name: 'Reset notebook examples', + fn: ResetNotebookExamples, + critical: false, +}); + +NOTEBOOK_RUNNER.addTest({ + name: 'Convert notebook to PRO code (only code)', + fn: NotebookToProCodeOnlyCode, + critical: false, +}); + +NOTEBOOK_RUNNER.addTest({ + name: 'Convert notebook to PRO code (all cells)', + fn: NotebookToProCodeAllCells, + critical: false, +}); + NOTEBOOK_RUNNER.addTest({ name: 'Run notebook that tests successes', fn: RunTestNotebook, critical: true, }); +NOTEBOOK_RUNNER.addTest({ + name: 'Run cells in notebook not saved to disk', + fn: RunUnsavedNotebook, + critical: false, +}); + NOTEBOOK_RUNNER.addTest({ name: 'Run notebooks that test problems are handled right', fn: RunProblemNotebooks, diff --git a/apps/client-e2e/src/tests/notebooks/new-notebook.ts b/apps/client-e2e/src/tests/notebooks/new-notebook.ts new file mode 100644 index 000000000..cfcb588f6 --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/new-notebook.ts @@ -0,0 +1,32 @@ +import { IDL_COMMANDS, IDL_NOTEBOOK_LANGUAGE_NAME, Sleep } from '@idl/shared'; +import { VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies we can create a new notebook document and open it with the right language ID + */ +export const NewNotebook: RunnerFunction = async (init) => { + // make a new notebook + vscode.commands.executeCommand(IDL_COMMANDS.NOTEBOOKS.NEW_NOTEBOOK); + + // short pause + await Sleep(100); + + // get active editor + const editor = vscode.window.activeNotebookEditor; + + // make sure we have an IDL Notebook as our editor + expect(editor?.notebook?.notebookType).toEqual(IDL_NOTEBOOK_LANGUAGE_NAME); + + // close + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we cleaned up + expect(vscode.window.activeNotebookEditor).toBeUndefined(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-all-cells.ts b/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-all-cells.ts new file mode 100644 index 000000000..20bc18814 --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-all-cells.ts @@ -0,0 +1,86 @@ +import { INotebookToProCodeOptions } from '@idl/notebooks/types'; +import { + GetExtensionPath, + IDL_COMMANDS, + IDL_LANGUAGE_NAME, + Sleep, +} from '@idl/shared'; +import { OpenNotebookInVSCode, VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import { readFileSync } from 'fs'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies we can convert notebooks to PRO code + */ +export const NotebookToProCodeAllCells: RunnerFunction = async (init) => { + const nbUri = GetExtensionPath( + 'idl/test/client-e2e/notebooks/notebook-to-pro-code/test-notebook.idlnb' + ); + + const expectedUri = GetExtensionPath( + 'idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_all_cells.pro' + ); + + // open notebook + const nb = await OpenNotebookInVSCode(nbUri, true); + + // short pause to parse + await Sleep(500); + + // get the code we should expect, independent of line ending + const expected = readFileSync(expectedUri, { encoding: 'utf-8' }).split( + /\r?\n/gim + ); + + /** + * Options to convert to PRO code + */ + const options: INotebookToProCodeOptions = { + includeAllCells: true, + }; + + // convert to PRO code + await vscode.commands.executeCommand( + IDL_COMMANDS.NOTEBOOKS.NOTEBOOK_TO_PRO_CODE, + options + ); + + // short pause + await Sleep(100); + + // get active editor + const editor = vscode.window.activeTextEditor; + + // make sure we have a window that appeared + expect(editor).toBeDefined(); + + // make sure it has IDL as language + expect(editor?.document?.languageId).toEqual(IDL_LANGUAGE_NAME); + + // get strings in editor + const actualContent = editor.document.getText().split(/\r?\n/gim); + + // close editor + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we closed + expect(vscode.window.activeTextEditor).toBeUndefined(); + + // verify the content matches what we should have + expect(expected).toEqual(actualContent); + + // close notebook + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we cleaned up + expect(vscode.window.activeNotebookEditor).toBeUndefined(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-only-code.ts b/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-only-code.ts new file mode 100644 index 000000000..09808a5bd --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/notebook-to-pro-code-only-code.ts @@ -0,0 +1,86 @@ +import { INotebookToProCodeOptions } from '@idl/notebooks/types'; +import { + GetExtensionPath, + IDL_COMMANDS, + IDL_LANGUAGE_NAME, + Sleep, +} from '@idl/shared'; +import { OpenNotebookInVSCode, VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import { readFileSync } from 'fs'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies we can convert notebooks to PRO code + */ +export const NotebookToProCodeOnlyCode: RunnerFunction = async (init) => { + const nbUri = GetExtensionPath( + 'idl/test/client-e2e/notebooks/notebook-to-pro-code/test-notebook.idlnb' + ); + + const expectedUri = GetExtensionPath( + 'idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_only_code.pro' + ); + + // open notebook + const nb = await OpenNotebookInVSCode(nbUri, true); + + // short pause to parse + await Sleep(500); + + // get the code we should expect, independent of line ending + const expected = readFileSync(expectedUri, { encoding: 'utf-8' }).split( + /\r?\n/gim + ); + + /** + * Options to convert to PRO code + */ + const options: INotebookToProCodeOptions = { + includeAllCells: false, + }; + + // convert to PRO code + await vscode.commands.executeCommand( + IDL_COMMANDS.NOTEBOOKS.NOTEBOOK_TO_PRO_CODE, + options + ); + + // short pause + await Sleep(100); + + // get active editor + const editor = vscode.window.activeTextEditor; + + // make sure we have a window that appeared + expect(editor).toBeDefined(); + + // make sure it has IDL as language + expect(editor?.document?.languageId).toEqual(IDL_LANGUAGE_NAME); + + // get strings in editor + const actualContent = editor.document.getText().split(/\r?\n/gim); + + // close editor + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we closed + expect(vscode.window.activeTextEditor).toBeUndefined(); + + // verify the content matches what we should have + expect(expected).toEqual(actualContent); + + // close notebook + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we cleaned up + expect(vscode.window.activeNotebookEditor).toBeUndefined(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/open-envi-notebook-example.ts b/apps/client-e2e/src/tests/notebooks/open-envi-notebook-example.ts new file mode 100644 index 000000000..b7e2effc6 --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/open-envi-notebook-example.ts @@ -0,0 +1,46 @@ +import { EXAMPLE_NOTEBOOKS } from '@idl/notebooks/shared'; +import { + CleanPath, + IDL_COMMANDS, + IDL_NOTEBOOK_LANGUAGE_NAME, + Sleep, +} from '@idl/shared'; +import { VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import { join } from 'path'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies we can open our IDL example notebook + */ +export const OpenENVINotebookExample: RunnerFunction = async (init) => { + // make a new notebook + await vscode.commands.executeCommand( + IDL_COMMANDS.NOTEBOOKS.OPEN_ENVI_EXAMPLE + ); + + // short pause + await Sleep(100); + + // get active editor + const editor = vscode.window.activeNotebookEditor; + + // make sure we have an IDL Notebook as our editor + expect(editor?.notebook?.notebookType).toEqual(IDL_NOTEBOOK_LANGUAGE_NAME); + + // verify the file we open + expect(CleanPath(editor?.notebook?.uri.fsPath) || '').toEqual( + join(EXAMPLE_NOTEBOOKS, 'hello-world-envi.idlnb') + ); + + // close + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we cleaned up + expect(vscode.window.activeNotebookEditor).toBeUndefined(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/open-idl-notebook-example.ts b/apps/client-e2e/src/tests/notebooks/open-idl-notebook-example.ts new file mode 100644 index 000000000..c270411a2 --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/open-idl-notebook-example.ts @@ -0,0 +1,44 @@ +import { EXAMPLE_NOTEBOOKS } from '@idl/notebooks/shared'; +import { + CleanPath, + IDL_COMMANDS, + IDL_NOTEBOOK_LANGUAGE_NAME, + Sleep, +} from '@idl/shared'; +import { VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import { join } from 'path'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Verifies we can open our IDL example notebook + */ +export const OpenIDLNotebookExample: RunnerFunction = async (init) => { + // make a new notebook + await vscode.commands.executeCommand(IDL_COMMANDS.NOTEBOOKS.OPEN_IDL_EXAMPLE); + + // short pause + await Sleep(100); + + // get active editor + const editor = vscode.window.activeNotebookEditor; + + // make sure we have an IDL Notebook as our editor + expect(editor?.notebook?.notebookType).toEqual(IDL_NOTEBOOK_LANGUAGE_NAME); + + // verify the file we open + expect(CleanPath(editor?.notebook?.uri.fsPath) || '').toEqual( + join(EXAMPLE_NOTEBOOKS, 'hello-world-idl.idlnb') + ); + + // close + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); + + // pause momentarily + await Sleep(100); + + // verify we cleaned up + expect(vscode.window.activeNotebookEditor).toBeUndefined(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/reset-notebook-examples.ts b/apps/client-e2e/src/tests/notebooks/reset-notebook-examples.ts new file mode 100644 index 000000000..78413c0ea --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/reset-notebook-examples.ts @@ -0,0 +1,32 @@ +import { EXAMPLE_NOTEBOOKS } from '@idl/notebooks/shared'; +import { IDL_COMMANDS, Sleep } from '@idl/shared'; +import expect from 'expect'; +import { existsSync, rmSync } from 'fs'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; + +/** + * Reset example notebooks + */ +export const ResetNotebookExamples: RunnerFunction = async (init) => { + // verify the folder exists after opening examples + expect(existsSync(EXAMPLE_NOTEBOOKS)).toBeTruthy(); + + // delete + rmSync(EXAMPLE_NOTEBOOKS, { recursive: true }); + + // make sure gone + expect(existsSync(EXAMPLE_NOTEBOOKS)).toBeFalsy(); + + // close + await vscode.commands.executeCommand( + IDL_COMMANDS.NOTEBOOKS.RESET_NOTEBOOK_EXAMPLES + ); + + // pause momentarily + await Sleep(100); + + // reset and make sure there + expect(existsSync(EXAMPLE_NOTEBOOKS)).toBeTruthy(); +}; diff --git a/apps/client-e2e/src/tests/notebooks/run-unsaved-notebook.ts b/apps/client-e2e/src/tests/notebooks/run-unsaved-notebook.ts new file mode 100644 index 000000000..cb3d09a60 --- /dev/null +++ b/apps/client-e2e/src/tests/notebooks/run-unsaved-notebook.ts @@ -0,0 +1,72 @@ +import { IDL_COMMANDS, IDL_NOTEBOOK_LANGUAGE_NAME, Sleep } from '@idl/shared'; +import { VSCODE_COMMANDS } from '@idl/vscode/shared'; +import expect from 'expect'; +import * as vscode from 'vscode'; + +import { RunnerFunction } from '../runner.interface'; +import { CompareCellOutputs } from './helpers/compare-cells'; +import { ICompareCellOutputs } from './helpers/compare-cells.interface'; +import { DEFAULT_RUNNER_TIMEOUT } from './helpers/run-notebook-and-compare-cells'; + +/** + * Types of outputs from cells that we expect to have + */ +export const CELL_OUTPUT: ICompareCellOutputs[] = [ + { + idx: 1, + success: true, + mimeTypes: ['text/plain'], + }, +]; + +/** + * Opens a new IDL notebook, adds a code cell, and makes sure we can run it + * without any issues considering it hasnt been saved to disk + */ +export const RunUnsavedNotebook: RunnerFunction = async (init) => { + /** Get reference to the notebook controller */ + const controller = init.notebooks.controller; + + // start IDL if it hasnt yet + if (!controller.isStarted()) { + await controller.launchIDL('Launching IDL'); + } + + // make sure launched + expect(controller.isStarted()).toBeTruthy(); + + // make new notebook + await vscode.commands.executeCommand(IDL_COMMANDS.NOTEBOOKS.NEW_NOTEBOOK); + + // short pause + await Sleep(DEFAULT_RUNNER_TIMEOUT); + + // get active editor + const editor = vscode.window.activeNotebookEditor; + + // make sure we have an IDL Notebook as our editor + expect(editor?.notebook?.notebookType).toEqual(IDL_NOTEBOOK_LANGUAGE_NAME); + + /** Get reference to the current notebook */ + const nb = editor.notebook; + + // update text + const cells = nb.getCells(); + + // verify we have two cells + expect(cells.length).toEqual(2); + + // run all cells + await vscode.commands.executeCommand(VSCODE_COMMANDS.NOTEBOOK_RUN_ALL); + + // short pause based on the number of cells we have + // sometimes the rendering takes too long to register (like complex maps) + // so we need an extra pause + await Sleep(DEFAULT_RUNNER_TIMEOUT); + + // compare cells + await CompareCellOutputs(nb, CELL_OUTPUT); + + // clear any existing outputs + await vscode.commands.executeCommand(VSCODE_COMMANDS.CLOSE_EDITOR); +}; diff --git a/apps/client/project.json b/apps/client/project.json index c605cc30b..43e21cba8 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -38,7 +38,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/client/**/*.ts"] diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 0060da59a..f4044b57a 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -38,15 +38,15 @@ export async function activate( // add our webview InitializeWebView(ctx); - // add notebooks - const notebooks = InitializeNotebooks(ctx); - // add our ENVI file opener InitializeENVIOpener(ctx); // add commands for docs InitializeDocs(ctx); + // add notebooks + const notebooks = InitializeNotebooks(ctx); + // return result return { client, diff --git a/apps/i18n/project.json b/apps/i18n/project.json index a29da85c2..c889a4587 100644 --- a/apps/i18n/project.json +++ b/apps/i18n/project.json @@ -36,7 +36,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/i18n/**/*.ts"] diff --git a/apps/idl-docs-parser/project.json b/apps/idl-docs-parser/project.json index 3a5cd68e4..eebf2bc8d 100644 --- a/apps/idl-docs-parser/project.json +++ b/apps/idl-docs-parser/project.json @@ -36,7 +36,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/idl-docs-parser/**/*.ts"] diff --git a/apps/idl-webview-e2e/project.json b/apps/idl-webview-e2e/project.json index 9b113feb4..468af1da3 100644 --- a/apps/idl-webview-e2e/project.json +++ b/apps/idl-webview-e2e/project.json @@ -18,7 +18,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/idl-webview-e2e/**/*.{js,ts}"] }, diff --git a/apps/idl-webview/project.json b/apps/idl-webview/project.json index 9f332b07e..ebd04350c 100644 --- a/apps/idl-webview/project.json +++ b/apps/idl-webview/project.json @@ -74,7 +74,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": [ "apps/idl-webview/src/**/*.ts", diff --git a/apps/idl-webview/src/assets/idlicon.png b/apps/idl-webview/src/assets/idlicon.png index e0520a3bb..7b63f8cba 100644 Binary files a/apps/idl-webview/src/assets/idlicon.png and b/apps/idl-webview/src/assets/idlicon.png differ diff --git a/apps/notebook/components-e2e/project.json b/apps/notebook/components-e2e/project.json index fa3c63194..879f3df53 100644 --- a/apps/notebook/components-e2e/project.json +++ b/apps/notebook/components-e2e/project.json @@ -21,7 +21,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/notebook/components-e2e/**/*.{js,ts}"] diff --git a/apps/notebook/components/project.json b/apps/notebook/components/project.json index bade55109..9255c8e30 100644 --- a/apps/notebook/components/project.json +++ b/apps/notebook/components/project.json @@ -81,7 +81,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": [ diff --git a/apps/notebook/renderer/project.json b/apps/notebook/renderer/project.json index c96b6ad54..c77af49c9 100644 --- a/apps/notebook/renderer/project.json +++ b/apps/notebook/renderer/project.json @@ -45,7 +45,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/notebook/renderer/**/*.ts"] diff --git a/apps/package-json/project.json b/apps/package-json/project.json index f35a729b6..ff6aa2696 100644 --- a/apps/package-json/project.json +++ b/apps/package-json/project.json @@ -37,7 +37,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/package-json/**/*.ts"] diff --git a/apps/package-json/src/contributes/config/code-config.ts b/apps/package-json/src/contributes/config/code-config.ts index 65a0f3a9b..7b5e5d906 100644 --- a/apps/package-json/src/contributes/config/code-config.ts +++ b/apps/package-json/src/contributes/config/code-config.ts @@ -250,38 +250,38 @@ export function AddCodeConfig(nls: IPackageNLS) { additionalProperties: false, default: DEFAULT_IDL_EXTENSION_CONFIG.code.formattingStyle, properties: { - quotes: { + binary: { type: 'string', description: TranslationFromConfiguration( - 'quotes', + 'binary', nls, formatStylePropertyBase ), - enum: ['single', 'double', 'none'], + enum: ['lower', 'upper', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['single', 'double', 'none'], + ['lower', 'upper', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - methods: { + control: { type: 'string', description: TranslationFromConfiguration( - 'methods', + 'control', nls, formatStylePropertyBase ), - enum: ['dot', 'arrow', 'none'], + enum: ['lower', 'upper', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['dot', 'arrow', 'none'], + ['lower', 'upper', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - keywords: { + hex: { type: 'string', description: TranslationFromConfiguration( - 'keywords', + 'hex', nls, formatStylePropertyBase ), @@ -292,10 +292,10 @@ export function AddCodeConfig(nls: IPackageNLS) { 'enumDescriptions.formatting.style' ), }, - properties: { + keywords: { type: 'string', description: TranslationFromConfiguration( - 'properties', + 'keywords', nls, formatStylePropertyBase ), @@ -306,38 +306,38 @@ export function AddCodeConfig(nls: IPackageNLS) { 'enumDescriptions.formatting.style' ), }, - control: { + localVariables: { type: 'string', description: TranslationFromConfiguration( - 'control', + 'localVariables', nls, formatStylePropertyBase ), - enum: ['lower', 'upper', 'none'], + enum: ['match', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['lower', 'upper', 'none'], + ['match', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - numbers: { + methods: { type: 'string', description: TranslationFromConfiguration( - 'numbers', + 'methods', nls, formatStylePropertyBase ), - enum: ['lower', 'upper', 'none'], + enum: ['dot', 'arrow', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['lower', 'upper', 'none'], + ['dot', 'arrow', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - hex: { + numbers: { type: 'string', description: TranslationFromConfiguration( - 'hex', + 'numbers', nls, formatStylePropertyBase ), @@ -362,30 +362,30 @@ export function AddCodeConfig(nls: IPackageNLS) { 'enumDescriptions.formatting.style' ), }, - binary: { + properties: { type: 'string', description: TranslationFromConfiguration( - 'binary', + 'properties', nls, formatStylePropertyBase ), - enum: ['lower', 'upper', 'none'], + enum: ['lower', 'upper', 'match', 'camel', 'pascal', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['lower', 'upper', 'none'], + ['lower', 'upper', 'match', 'camel', 'pascal', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - systemVariables: { + quotes: { type: 'string', description: TranslationFromConfiguration( - 'systemVariables', + 'quotes', nls, formatStylePropertyBase ), - enum: ['lower', 'upper', 'none'], + enum: ['single', 'double', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['lower', 'upper', 'none'], + ['single', 'double', 'none'], nls, 'enumDescriptions.formatting.style' ), @@ -397,23 +397,51 @@ export function AddCodeConfig(nls: IPackageNLS) { nls, formatStylePropertyBase ), - enum: ['match', 'none'], + enum: ['match', 'camel', 'pascal', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['match', 'none'], + ['match', 'camel', 'pascal', 'none'], nls, 'enumDescriptions.formatting.style' ), }, - localVariables: { + routineMethods: { type: 'string', description: TranslationFromConfiguration( - 'localVariables', + 'routineMethods', nls, formatStylePropertyBase ), - enum: ['match', 'none'], + enum: ['match', 'camel', 'pascal', 'none'], enumDescriptions: TranslationFromConfigurationChoices( - ['match', 'none'], + ['match', 'camel', 'pascal', 'none'], + nls, + 'enumDescriptions.formatting.style' + ), + }, + structureNames: { + type: 'string', + description: TranslationFromConfiguration( + 'structureNames', + nls, + formatStylePropertyBase + ), + enum: ['match', 'camel', 'pascal', 'none'], + enumDescriptions: TranslationFromConfigurationChoices( + ['match', 'camel', 'pascal', 'none'], + nls, + 'enumDescriptions.formatting.style' + ), + }, + systemVariables: { + type: 'string', + description: TranslationFromConfiguration( + 'systemVariables', + nls, + formatStylePropertyBase + ), + enum: ['lower', 'upper', 'none'], + enumDescriptions: TranslationFromConfigurationChoices( + ['lower', 'upper', 'none'], nls, 'enumDescriptions.formatting.style' ), diff --git a/apps/package-json/src/contributes/configuration.ts b/apps/package-json/src/contributes/configuration.ts index cb657832d..8b51f5a79 100644 --- a/apps/package-json/src/contributes/configuration.ts +++ b/apps/package-json/src/contributes/configuration.ts @@ -62,4 +62,11 @@ export function ProcessConfiguration( contrib['configurationDefaults'][`[${IDL_LANGUAGE_NAME}]`] = { 'editor.semanticHighlighting.enabled': true, }; + + /** + * Add config for opening outputs from notebook cells to work right + * + * https://stackoverflow.com/questions/75558543/vscode-unable-to-load-schema-for-package-json + */ + // contrib['configurationDefaults']['workbench.settings.openDefaultSettings'] = true; } diff --git a/apps/package-json/src/contributes/custom-editors.ts b/apps/package-json/src/contributes/custom-editors.ts index c34cc9e72..c0d959a22 100644 --- a/apps/package-json/src/contributes/custom-editors.ts +++ b/apps/package-json/src/contributes/custom-editors.ts @@ -10,13 +10,22 @@ const ENVI_OPENER_CONFIG = { viewType: ENVI_OPENER_TYPE, displayName: '%envi.openerTitle%', selector: [], - priority: 'default', + priority: 'option', }; /** * File extensions that we want to register to our ENVI opener */ -const FILE_EXTENSIONS = [`dat`, `tif`, `tiff`, `jp2`, `jp2000`, `ntf`].sort(); +const FILE_EXTENSIONS = [ + `dat`, + `tif`, + `tiff`, + `jp2`, + `jp2000`, + `ntf`, + `nitf`, + `r0`, +].sort(); /** * Updates the package.json file for our themes and makes sure everything exists @@ -45,4 +54,7 @@ export function ProcessCustomEditors( // made it here so lets update our package file contrib['customEditors'] = [ENVI_OPENER_CONFIG]; + + // handled automatically. if included, gets yellow tooltip in package.json + // packageJSON['activationEvents'].push(`onCustomEditor:${ENVI_OPENER_TYPE}`); } diff --git a/apps/package-json/src/contributes/icon-theme.ts b/apps/package-json/src/contributes/icon-theme.ts index af20a6257..b99eb9238 100644 --- a/apps/package-json/src/contributes/icon-theme.ts +++ b/apps/package-json/src/contributes/icon-theme.ts @@ -14,6 +14,31 @@ const ICON_THEMES = [ }, ]; +/** + * Extensions for IDL file types + */ +const IDL_EXTENSIONS = ['pro', 'sav', 'idllog', 'idlnb']; + +/** + * Extensions for ENVI file types + */ +const ENVI_EXTENSIONS = [ + 'dat', + 'hdr', + 'enp', + 'evs', + 'ept', + 'model', + 'style', + // 'shp', + // 'tif', + // 'tiff', + // 'nitf', + // 'ntf', + // 'r0', + // 'geojson', +]; + /** * Download's the VS Code theme files from github and makes changes for our extension */ @@ -57,44 +82,70 @@ async function DownloadFiles() { readFileSync(outDir + sep + 'vs-seti-icon-theme.json', 'utf-8') ); - /** Dark icon */ - const darkIcon = './../images/dark/idlicon.png'; + /** Dark IDL icon */ + const darkIconIDL = './../images/dark/idlicon-color.svg'; + + /** Resolve and make sure it exists */ + const qualifiedDarkIDL = resolve(outDir, darkIconIDL); + if (!existsSync(qualifiedDarkIDL)) { + throw new Error(`Dark icon theme file missing: "${qualifiedDarkIDL}"`); + } + + /** Light IDL icon */ + const lightIconIDL = './../images/light/idlicon-color.svg'; + + /** Resolve and make sure it exists */ + const qualifiedLightIDL = resolve(outDir, lightIconIDL); + if (!existsSync(qualifiedLightIDL)) { + throw new Error(`Light icon theme file missing: "${qualifiedLightIDL}"`); + } + + /** Dark ENVI icon */ + const darkIconENVI = './../images/dark/enviicon-color.svg'; /** Resolve and make sure it exists */ - const qualifiedDark = resolve(outDir, outDir); - if (!existsSync(qualifiedDark)) { - throw new Error(`Dark icon theme file missing: "${qualifiedDark}"`); + const qualifiedDarkENVI = resolve(outDir, darkIconENVI); + if (!existsSync(qualifiedDarkENVI)) { + throw new Error(`Dark icon theme file missing: "${qualifiedDarkENVI}"`); } - /** Dark icon */ - const lightIcon = './../images/light/idlicon.png'; + /** Light ENVI icon */ + const lightIconENVI = './../images/light/enviicon-color.svg'; /** Resolve and make sure it exists */ - const qualifiedLight = resolve(outDir, outDir); - if (!existsSync(qualifiedLight)) { - throw new Error(`Light icon theme file missing: "${qualifiedLight}"`); + const qualifiedLightENVI = resolve(outDir, lightIconENVI); + if (!existsSync(qualifiedLightENVI)) { + throw new Error(`Light icon theme file missing: "${qualifiedLightENVI}"`); } // add our icon definition for IDL json['iconDefinitions'] = { ...json['iconDefinitions'], _idl: { - iconPath: darkIcon, + iconPath: darkIconIDL, }, _idl_light: { - iconPath: lightIcon, + iconPath: lightIconIDL, + }, + _envi: { + iconPath: darkIconENVI, + }, + _envi_light: { + iconPath: lightIconENVI, }, }; - // update icon theme for IDL - json['fileExtensions']['pro'] = '_idl'; - json['fileExtensions']['sav'] = '_idl'; - json['fileExtensions']['idllog'] = '_idl'; - json['fileExtensions']['idlnb'] = '_idl'; - json['light']['fileExtensions']['pro'] = '_idl_light'; - json['light']['fileExtensions']['sav'] = '_idl_light'; - json['light']['fileExtensions']['idllog'] = '_idl_light'; - json['light']['fileExtensions']['idlnb'] = '_idl_light'; + // add IDL extensions + for (let i = 0; i < IDL_EXTENSIONS.length; i++) { + json['fileExtensions'][IDL_EXTENSIONS[i]] = '_idl'; + json['light']['fileExtensions'][IDL_EXTENSIONS[i]] = '_idl_light'; + } + + // add ENVI extensions + for (let i = 0; i < ENVI_EXTENSIONS.length; i++) { + json['fileExtensions'][ENVI_EXTENSIONS[i]] = '_envi'; + json['light']['fileExtensions'][ENVI_EXTENSIONS[i]] = '_envi_light'; + } // save changes to disk writeFileSync( diff --git a/apps/package-json/src/contributes/languages.ts b/apps/package-json/src/contributes/languages.ts index a83721cf9..46cba6217 100644 --- a/apps/package-json/src/contributes/languages.ts +++ b/apps/package-json/src/contributes/languages.ts @@ -3,7 +3,7 @@ import { EVS_FILE_EXTENSION, IDL_LANGUAGE_NAME, IDL_NOTEBOOK_EXTENSION, - IDL_NOTEBOOK_NAME, + IDL_NOTEBOOK_LANGUAGE_NAME, LOG_LANGUAGE_NAME, MODEL_FILE_EXTENSION, PRO_FILE_EXTENSION, @@ -32,7 +32,7 @@ export const LANGUAGES = [ id: `${IDL_LANGUAGE_NAME}-md-injection`, }, { - id: IDL_NOTEBOOK_NAME, + id: IDL_NOTEBOOK_LANGUAGE_NAME, extensions: [IDL_NOTEBOOK_EXTENSION], }, { diff --git a/apps/package-json/src/contributes/notebooks.ts b/apps/package-json/src/contributes/notebooks.ts index e3cf29675..4286cc53a 100644 --- a/apps/package-json/src/contributes/notebooks.ts +++ b/apps/package-json/src/contributes/notebooks.ts @@ -3,7 +3,7 @@ import { IDL_COMMANDS, IDL_NOTEBOOK_CONTROLLER_TRANSLATION_NAME, IDL_NOTEBOOK_EXTENSION, - IDL_NOTEBOOK_NAME, + IDL_NOTEBOOK_LANGUAGE_NAME, IDL_NOTEBOOK_RENDERER_NAME, } from '@idl/shared'; @@ -31,7 +31,7 @@ export const NOTEBOOK_TOOLBAR = [ */ export function ProcessNotebooks(packageJSON: IPackageJSON, nls: IPackageNLS) { const ourNotebook = { - type: IDL_NOTEBOOK_NAME, + type: IDL_NOTEBOOK_LANGUAGE_NAME, displayName: '%notebooks.title%', selector: [ { diff --git a/apps/parsing-worker/project.json b/apps/parsing-worker/project.json index 5d28db2a6..92b3cf036 100644 --- a/apps/parsing-worker/project.json +++ b/apps/parsing-worker/project.json @@ -37,7 +37,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/parsing-worker/**/*.ts"] diff --git a/apps/performance/project.json b/apps/performance/project.json index 7fba5af3f..118f9c68c 100644 --- a/apps/performance/project.json +++ b/apps/performance/project.json @@ -36,7 +36,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/performance/**/*.ts"] }, diff --git a/apps/sandbox/project.json b/apps/sandbox/project.json index af60e92cb..9caa93d61 100644 --- a/apps/sandbox/project.json +++ b/apps/sandbox/project.json @@ -28,7 +28,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/sandbox/**/*.ts"] diff --git a/apps/sandbox/src/main.ts b/apps/sandbox/src/main.ts index d99da5017..768432afc 100644 --- a/apps/sandbox/src/main.ts +++ b/apps/sandbox/src/main.ts @@ -1,9 +1,18 @@ -import { Sleep } from '@idl/shared'; -import { CLIENT_ID, InitializeUsageMetrics } from '@idl/usage-metrics'; +import { TransformCase } from '@idl/assembling/shared'; -InitializeUsageMetrics(true); -console.log(CLIENT_ID); +const samples = [ + 'url_password_2', + 'TEST_VALUE', + 'test$_value', + 'testValue', + '_testValue', + 'IDLRoutine', + 'ENVIRoutine', +]; -Sleep(3000).then(() => { - process.exit(); -}); +for (let i = 0; i < samples.length; i++) { + console.log( + TransformCase(samples[i], 'camel'), + TransformCase(samples[i], 'pascal') + ); +} diff --git a/apps/server/project.json b/apps/server/project.json index 48720ada5..c32d7fca1 100644 --- a/apps/server/project.json +++ b/apps/server/project.json @@ -37,7 +37,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/server/**/*.ts"] diff --git a/apps/test-tokenizer/project.json b/apps/test-tokenizer/project.json index 550e4662c..2efc2571d 100644 --- a/apps/test-tokenizer/project.json +++ b/apps/test-tokenizer/project.json @@ -36,7 +36,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["apps/test-tokenizer/**/*.ts"] }, diff --git a/apps/test-tokenizer/src/test-maker/cache/cache.json b/apps/test-tokenizer/src/test-maker/cache/cache.json index ca0f0abbd..b6f1f8c2a 100644 --- a/apps/test-tokenizer/src/test-maker/cache/cache.json +++ b/apps/test-tokenizer/src/test-maker/cache/cache.json @@ -1 +1 @@ -{"auto-token-tests":{"assignment.spec.ts":"{\"suiteName\":\"Validates assignment parsing\",\"fileName\":\"assignment.spec.ts\",\"tests\":[{\"name\":\"parses variable assignment\",\"code\":\"a = 5\"},{\"name\":\"parses system variable assignment\",\"code\":\"!null = 5\"},{\"name\":\"brackets with assignment\",\"code\":\"a[i] = b\"},{\"name\":\"parses variable assignment with line continuation\",\"code\":[\"z = $\",\" 5\"]},{\"name\":\"assignment with parentheses\",\"code\":\"(b) = 15\"},{\"name\":\"procedure after assignment in loop and keyword\",\"code\":\"for i=0, myFunc(a=42) do print, i\"}]}","blocks.spec.ts":"{\"suiteName\":\"Validates block parsing auto-closes\",\"fileName\":\"blocks.spec.ts\",\"tests\":[{\"name\":\"lib example from kruskal_wallis.pro\",\"code\":[\"\",\"if !true then $\",\"\",\"while !true DO BEGIN\",\" a = 42 \",\"ENDWHILE $\",\"\",\"ELSE stop = stop+1\",\"end\"]}]}","brackets.spec.ts":"{\"suiteName\":\"Validates bracket parsing\",\"fileName\":\"brackets.spec.ts\",\"tests\":[{\"name\":\"parses standalone brackets\",\"code\":\"[1 + 2]\"},{\"name\":\"parses standalone brackets with line continuations\",\"code\":[\"[1 + $\",\" 2]\"]},{\"name\":\"indexing and compound expression\",\"code\":\"array1[1 + 2] * (1 + 2)\"},{\"name\":\"brackets with assignment\",\"code\":\"_a[i] = 5 * b\"},{\"name\":\"brackets with compound assignment\",\"code\":\"_aA$[i] *= b\"}]}","colon.spec.ts":"{\"suiteName\":\"Validates colon parsing\",\"fileName\":\"colon.spec.ts\",\"tests\":[{\"name\":\"simple colon test\",\"code\":\"[:]\"},{\"name\":\"array indexing\",\"code\":\"a[0:I] = 42\"}]}","commas.spec.ts":"{\"suiteName\":\"Validates comma parsing (mostly covered elsewhere)\",\"fileName\":\"commas.spec.ts\",\"tests\":[{\"name\":\"don't find commas on their own\",\"code\":\",\"},{\"name\":\"find commas in function\",\"code\":\"f(,)\"},{\"name\":\"find commas in pro\",\"code\":\"p,\"}]}","comments.spec.ts":"{\"suiteName\":\"Validates comment parsing\",\"fileName\":\"comments.spec.ts\",\"tests\":[{\"name\":\"parses simple comments\",\"code\":\" ; something()\"},{\"name\":\"parses code with comments at the end\",\"code\":\"a = b() ; something()\"},{\"name\":\"parses simple comments with TODO\",\"code\":\" ; TODO: something()\"},{\"name\":\"parses code with comments at the end with TODO\",\"code\":\"a = b() ; TODO: something()\"},{\"name\":\"parses code with comments and line continuations\",\"code\":[\"a = $ ; TODO: something()\",\" b()\"]}]}","control.1.spec.ts":"{\"suiteName\":\"Validates control statement parsing\",\"fileName\":\"control.1.spec.ts\",\"tests\":[{\"name\":\"parses basic control statements\",\"code\":[\"break\",\"continue\",\"jump: a = func()\",\"jump: mypro, $\",\" 5\",\"jumpy17$: ;comment\"]},{\"name\":\"parses break in if statements\",\"code\":\"if !true then break\"},{\"name\":\"parses continue in if statements\",\"code\":\"if !true then continue\"},{\"name\":\"parses continue and break in loops\",\"code\":[\"for i=0,99 do begin\",\" continue\",\" break\",\"endfor\"]},{\"name\":\"parses jump in blocks\",\"code\":[\"for i=0,99 do begin\",\" jump:\",\"endfor\"]},{\"name\":\"parses compound control statements\",\"code\":[\"common, group, var1, var2, var3 ; comment\",\"compile_opt, idl2, $ ; line continuation\",\" hidden\",\"compile_opt\",\"forward_function, idl2, hidden\",\"goto, label\"]},{\"name\":\"goto in in statement\",\"code\":\"if not wild then goto, done else printf, outunit\"},{\"name\":\"statements end at line separator\",\"code\":\"GOTO, do_six & END\"}]}","executive-command.spec.ts":"{\"suiteName\":\"Validates executive command parsing\",\"fileName\":\"executive-command.spec.ts\",\"tests\":[{\"name\":\"simple 1\",\"code\":\".compile\"},{\"name\":\"simple 2\",\"code\":\".run myfile.pro\"},{\"name\":\"simple 3 start with spaces\",\"code\":\" .run myfile.pro\"},{\"name\":\"ignore methods\",\"code\":\"obj.method\"},{\"name\":\"ignore properties\",\"code\":\"!null = obj.method\"}]}","include.spec.ts":"{\"suiteName\":\"Validates include statements, but not correct location\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"basic test\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"find in loops\",\"code\":\"for i=0,99 do @very_wrong\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"},{\"name\":\"don't capture afterwards\",\"code\":\"@include.pro ; comment\"}]}","lambda.spec.ts":"{\"suiteName\":\"Validates lambda functions parsed as special token\",\"fileName\":\"lambda.spec.ts\",\"tests\":[{\"name\":\"correctly parse lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","line-modifiers.spec.ts":"{\"suiteName\":\"Validates line modifier (separators)\",\"fileName\":\"line-modifiers.spec.ts\",\"tests\":[{\"name\":\"parses multi-line as single-line\",\"code\":[\"a = a + b() & proc & a.procMethod,1 & $\",\"a={struct}\"]},{\"name\":\"loops properly stop in line modifier\",\"code\":[\"proc & for i=0,99 do print, i & while !true do b = awesome() & foreach val, b, key do print, key, val & endedit\"]},{\"name\":\"line separators in case statement\",\"code\":[\"CASE typ OF\",\" 7: begin val = \\\"\\\" & cnt = 1 & endcase\",\" 8: val = tiff_sint(val, 0, len=cnt)\",\"ENDCASE\"]},{\"name\":\"verifies nested line continuations use basic token\",\"code\":\"scale=scale, $, $\"}]}","logic.if-then-else.1.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [1]\",\"fileName\":\"logic.if-then-else.1.spec.ts\",\"tests\":[{\"name\":\"parses basic if-then loop\",\"code\":\"if !true then print, 'yes'\"},{\"name\":\"parses basic if-then-else loop\",\"code\":\"if ~doIt then print, 'yes' else a = yellow()\"},{\"name\":\"parses basic if-then loop with line continuation 1\",\"code\":[\"if !true $\",\" then print, 'yes'\"]},{\"name\":\"parses basic if-then loop with line continuation 2\",\"code\":[\"if !true $\",\" then print $\",\" , 'yes'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 1\",\"code\":[\"if !true then print, 'yes' $\",\" else print, 'no'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 2\",\"code\":[\"if !true then print, 'yes' $\",\" else $\",\" print, 'no'\"]},{\"name\":\"nested if-then-else\",\"code\":\"if ~(myFunc(_a17$) * 2) then if !false then print, 'yes'\"}]}","logic.if-then-else.2.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [2]\",\"fileName\":\"logic.if-then-else.2.spec.ts\",\"tests\":[{\"name\":\"with blocks [1]\",\"code\":[\"if a++ then begin\",\" super = awesome()\",\"endif else print, 'else'\"]}]}","logic.if-then-else.3.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [3]\",\"fileName\":\"logic.if-then-else.3.spec.ts\",\"tests\":[{\"name\":\"example from IDL code [1]\",\"code\":\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\"},{\"name\":\"example from IDL code [2]\",\"code\":[\"if (ISA(equation)) then begin\",\" graphic.SetProperty, EQUATION=equation\",\" arg1 = equation\",\" if (ISA(style)) then arg2 = style\",\"endif\"]},{\"name\":\"example from IDL code [3]\",\"code\":[\"IF (nms[i-1, j] && ~marked[i-1, j]) THEN $\",\" canny_follow, i-1, j, nms, marked\"]},{\"name\":\"example from IDL code [4]\",\"code\":[\"IF (max(step) && ~n_elements(stepflag)) THEN $\",\" suppMag = nmsupp_mask * mag\"]},{\"name\":\"example from IDL code [5]\",\"code\":[\"if (~Isa(hDefinition, 'Hash') || $\",\" ~hDefinition.HasKey('schema') || $\",\" ~(hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)) then begin\",\" message, 'File does not contain a valid color gradient definition.', /NONAME \",\"endif\"]}]}","logic.case.1.spec.ts":"{\"suiteName\":\"Validates case statement\",\"fileName\":\"logic.case.1.spec.ts\",\"tests\":[{\"name\":\"parses case loop with many syntaxes\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\"]},{\"name\":\"nested case statement\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\"]}]}","logic.switch.1.spec.ts":"{\"suiteName\":\"Validates switch statement\",\"fileName\":\"logic.switch.1.spec.ts\",\"tests\":[{\"name\":\"parses switch loop with many syntaxes\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDSWITCH\"]},{\"name\":\"nested switch statement\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" SWITCH x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDSWITCH\",\"END\",\"ENDSWITCH\"]}]}","logic.ternary.1.spec.ts":"{\"suiteName\":\"Validates for ternary statement parsing\",\"fileName\":\"logic.ternary.1.spec.ts\",\"tests\":[{\"name\":\"simplest ternary statement\",\"code\":\"a = something ? 5 : 6\"},{\"name\":\"nested ternary statement grouped\",\"code\":\"a = !true ? (!false ? 7 : 8) : 6\"},{\"name\":\"nested ternary statement without grouping\",\"code\":\"mypro, something ? ~something ? 7 : 8 : 6, 2\"},{\"name\":\"ternary as argument\",\"code\":\"a = myfunc(something ? otherfunc() : !awesomesauce) + 3\"},{\"name\":\"operators end on ternary statements\",\"code\":\"a = 5*something ? 5- 4 : 6^3\"},{\"name\":\"multi-line ternary 1\",\"code\":[\"a = _myvar $\",\" ? 'jello' : \\\"jelly\\\"\"]},{\"name\":\"multi-line ternary 2\",\"code\":[\"a = myfunc( $\",\" a,b,c) ? b4d $\",\" : $\",\" s1nt4x3x4mple\"]},{\"name\":\"ternary works in braces as expected\",\"code\":[\"_17 = arr[!true ? 0 : -3: -1]\"]}]}","loops.for.spec.ts":"{\"suiteName\":\"Validates for loop parsing\",\"fileName\":\"loops.for.spec.ts\",\"tests\":[{\"name\":\"parses basic for loop\",\"code\":\"for i=0, 99 do print, i\"},{\"name\":\"parses basic for loop with increment\",\"code\":\"for i=0, 99, 2 do !null = myFunc(i)\"},{\"name\":\"parses basic for loop with line continuation\",\"code\":[\"for i=0, jj do $\",\" print, i\"]},{\"name\":\"parses basic for loop with block\",\"code\":[\"for i=0, 99 do begin\",\" !null = myFunc(i)\",\"endfor\"]},{\"name\":\"parses nested for loop\",\"code\":\"for i=0, 99 do for j=0, 99 do print, i + j\"}]}","loops.foreach.spec.ts":"{\"suiteName\":\"Validates foreach loop parsing\",\"fileName\":\"loops.foreach.spec.ts\",\"tests\":[{\"name\":\"parses basic foreach loop\",\"code\":\"foreach val, arr do print, i\"},{\"name\":\"parses basic foreach loop with key\",\"code\":\"foreach val, arr, idx do !null = myFunc(i)\"},{\"name\":\"parses basic foreach loop with line continuation\",\"code\":[\"foreach val, arr do $\",\" print, i\"]},{\"name\":\"parses basic foreach loop with block\",\"code\":[\"foreach val, arr do begin\",\" !null = myFunc(i)\",\"endforeach\"]},{\"name\":\"parses nested foreach loop\",\"code\":\"foreach val, arr do foreach val2, val do print, val2\"}]}","loops.repeat.spec.ts":"{\"suiteName\":\"Validates repeat loop parsing\",\"fileName\":\"loops.repeat.spec.ts\",\"tests\":[{\"name\":\"parses basic repeat loop\",\"code\":\"REPEAT A = A * 2 UNTIL A GT B\"},{\"name\":\"parses procedure in repeat loop\",\"code\":\"REPEAT PRINT, A UNTIL A GT B\"},{\"name\":\"parses basic repeat loop with line continuations\",\"code\":[\"REPEAT A = $\",\" A * 2 UNTIL $\",\" A GT B\"]},{\"name\":\"parses basic repeat loop with block\",\"code\":[\"REPEAT BEGIN\",\" A = A * 2\",\"ENDREP UNTIL A GT B\"]},{\"name\":\"correctly parses loops with if statements inside\",\"code\":[\"repeat if !true then break until !true\"]}]}","loops.while.spec.ts":"{\"suiteName\":\"Validates while loop parsing\",\"fileName\":\"loops.while.spec.ts\",\"tests\":[{\"name\":\"parses basic while loop\",\"code\":\"while !true do print, i\"},{\"name\":\"parses basic nested while loop\",\"code\":\"while !true do while !false do print, i\"},{\"name\":\"parses basic while loop with line continuation\",\"code\":[\"while !true do $\",\" print, $\",\" i\"]},{\"name\":\"parses basic while loop with block\",\"code\":[\"while (a eq 5) do begin\",\" !null = myFunc(i)\",\"endwhile\"]}]}","methods.functions.spec.ts":"{\"suiteName\":\"Validates function method parsing\",\"fileName\":\"methods.functions.spec.ts\",\"tests\":[{\"name\":\"parses function methods with dots\",\"code\":\"!NULL = a.myFunc(1)\"},{\"name\":\"parses function methods with arrows\",\"code\":\"!NULL = a->myFunc(1)\"},{\"name\":\"parses super function methods with dots\",\"code\":\"a.super::myfunc(1)\"},{\"name\":\"parses super function methods with arrows\",\"code\":\"a->super::myfunc(a)\"},{\"name\":\"parses function methods with dots and line continuation\",\"code\":[\"!NULL = a.myFunc( $\",\" 1)\"]},{\"name\":\"single-character function method\",\"code\":\"a.b()\"}]}","methods.procedures.spec.ts":"{\"suiteName\":\"Validates procedure method parsing\",\"fileName\":\"methods.procedures.spec.ts\",\"tests\":[{\"name\":\"parses procedure methods with dots\",\"code\":\"a.myProc, 1\"},{\"name\":\"parses procedure methods with arrows\",\"code\":\"a->myProc, a\"},{\"name\":\"parses super procedure methods with dots\",\"code\":\"a.super::myProc, 1\"},{\"name\":\"parses super procedure methods with arrows\",\"code\":\"a->super::myProc, a\"},{\"name\":\"parses procedure methods with dots and line continuations\",\"code\":[\"a.myProc, $\",\" 1\"]},{\"name\":\"procedure method from IDL lib\",\"code\":[\"((*state).markers).Add, CGRAD_NEW_MARKER(POSITION=marker['position'], $\",\" COLOR=color, $\",\" MIDDLE=marker['middle'])\"]},{\"name\":\"single-character procedure method\",\"code\":\"a.b\"}]}","numbers.spec.ts":"{\"suiteName\":\"Validates special cases for number parsing\",\"fileName\":\"numbers.spec.ts\",\"tests\":[{\"name\":\"correctly parse scientific notations\",\"code\":[\"a = -1e34\",\"a = -1e34i\",\"a = -1e34j\"]},{\"name\":\"correctly parse scientific notations with negatives 1\",\"code\":[\"a = 1e-34\",\"a = 1e-34i\",\"a = 1e-34j\"]},{\"name\":\"correctly parse scientific notations with negatives 2\",\"code\":[\"a = 1e-\",\"a = 1e-i\",\"a = 1e-j\"]},{\"name\":\"correctly parse hex notation\",\"code\":[\"a = 0x8FFF + 0x8Fub + 0x8FulL\",\"a = 0x8FFFI + 0x8FubI + 0x8FulLi\",\"a = 0x8FFFJ + 0x8Fubj + 0x8FulLJ\"]},{\"name\":\"correctly parse octal notation\",\"code\":[\"a = 0o8FFF + 0o8Fub + 0o8FulL\",\"a = 0o8FFFI + 0o8FubI + 0o8FulLi\",\"a = 0o8FFFJ + 0o8Fubj + 0o8FulLJ\"]},{\"name\":\"correctly parse binary notation\",\"code\":[\"a = 0b8FFF + 0b8Fub + 0b8FulL\",\"a = 0b8FFFI + 0b8FubI + 0b8FulLi\",\"a = 0b8FFFJ + 0b8Fubj + 0b8FulLJ\"]},{\"name\":\"correctly parse scientific notations with doubles\",\"code\":[\"a = -1d34\",\"a = -1d34i\",\"a = -1d34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 1\",\"code\":[\"a = 1d-34\",\"a = 1d-34i\",\"a = 1d-34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 2\",\"code\":[\"a = 1d-\",\"a = 1d-i\",\"a = 1d-j\"]},{\"name\":\"correctly parse new syntax for complex\",\"code\":[\"a = 1i\",\"a = 1j\"]},{\"name\":\"catch unfinished dot statement 1\",\"code\":\"a.\"},{\"name\":\"catch unfinished dot statement 2\",\"code\":\"a = b.\"},{\"name\":\"catch standalone dot\",\"code\":\"a = .\"},{\"name\":\"edge case scientific\",\"code\":\"a = .1e+12\"},{\"name\":\"solo dot\",\"code\":\".\"}]}","number-string.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36 + \\\"45\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36b + \\\"45ull\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'b\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'x\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'o\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"b\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"x\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"o\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XS\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XS\"}]}","number-string.complex-i.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-i.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36i + \\\"45i\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bi + \\\"45ulli\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bi\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xi\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oi\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bi\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xi\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oi\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSi\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSi\"}]}","number-string.complex-j.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-j.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36j + \\\"45j\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bj + \\\"45ullj\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bj\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xj\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oj\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bj\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xj\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oj\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSj\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSj\"}]}","operators.compound.spec.ts":"{\"suiteName\":\"Validates compound operator parsing\",\"fileName\":\"operators.compound.spec.ts\",\"tests\":[{\"name\":\"parses with line continuation\",\"code\":[\"z *= $\",\" 5\"]},{\"name\":\"does not recurse with \\\"||\\\" operator\",\"code\":\"a || b || c\"},{\"name\":\"does not recurse with \\\"or\\\" operator\",\"code\":\"a or b or c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a && b && c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a and b and c\"}]}","operators.spec.ts":"{\"suiteName\":\"Validates operator parsing\",\"fileName\":\"operators.spec.ts\",\"tests\":[{\"name\":\"close on braces\",\"code\":\"{1+2}\"},{\"name\":\"close on brackets\",\"code\":\"[1+2]\"},{\"name\":\"close on parentheses\",\"code\":\"(1+2)\"},{\"name\":\"close on commas\",\"code\":\"1+2,3+4\"},{\"name\":\"close on then and else\",\"code\":\"if 1+2 then a = 3+4 else a = 4^3\"},{\"name\":\"close on do in loops\",\"code\":\"for i=0, 99-1 do print, i\"},{\"name\":\"operators with line continuations\",\"code\":[\"zach + $ \",\"awesome\"]},{\"name\":\"operators end on \\\"of\\\"\",\"code\":[\"case n_params()-1 of\",\" 0: call_method, method_name, oObj[i], _extra=e\",\" 1: call_method, method_name, oObj[i], p1, _extra=e\",\"endcase\"]},{\"name\":\"operators end on arrow function\",\"code\":\"*(*pState).pTitle->SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators end on procedure method\",\"code\":\"*pTitle.SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle.SetProperty(color=[255, 255, 255])\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle->SetProperty(color=[255, 255, 255])\"},{\"name\":\"special token for increment\",\"code\":[\"++a\",\"a++\"]},{\"name\":\"special token for decrement\",\"code\":[\"--a\",\"a+--\"]},{\"name\":\"next to each other\",\"code\":\"a = b++ + 5\"}]}","parentheses.spec.ts":"{\"suiteName\":\"Validates parentheses parsing\",\"fileName\":\"parentheses.spec.ts\",\"tests\":[{\"name\":\"parses standalone parentheses\",\"code\":\"(1 + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone parentheses with line continuation\",\"code\":[\"(1 + $ \",\" 2)\"]}]}","prompts.spec.ts":"{\"suiteName\":\"Validates prompt parsing\",\"fileName\":\"prompts.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\"IDL> print, 42\"},{\"name\":\"parses ENVI prompt\",\"code\":\"ENVI> print, 17\"}]}","properties.spec.ts":"{\"suiteName\":\"Validates property parsing\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"parses property assignment\",\"code\":\"a.thing = 5\"},{\"name\":\"parses property access\",\"code\":\"b = a.thing\"},{\"name\":\"parses property access with line continuation\",\"code\":[\"b = $\",\" a.thing\"]},{\"name\":\"parses nested property access\",\"code\":\"b = a.thing1.thing2\"},{\"name\":\"parses property access as arguments\",\"code\":\"myPro, a.thing, b.thing\"},{\"name\":\"property example from IDL lib\",\"code\":\"(*state).bottomSelection = lMarkers.Count()-1\"},{\"name\":\"structure property via indexing\",\"code\":\"a = b.(i)\"}]}","python.spec.ts":"{\"suiteName\":\"Validates Python code parsing\",\"fileName\":\"python.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\">>>import numpy as np\"}]}","quotes.spec.ts":"{\"suiteName\":\"Validates quote parsing\",\"fileName\":\"quotes.spec.ts\",\"tests\":[{\"name\":\"parses standalone single quotes\",\"code\":\"'myFunc(1 + 2)'\"},{\"name\":\"parses standalone double quotes\",\"code\":\"\\\"myFunc(1 + 2)\\\"\"},{\"name\":\"verify single quotes without closing\",\"code\":\"'string\"},{\"name\":\"verify double quotes without closing\",\"code\":\"\\\"string\"},{\"name\":\"confusing single quote\",\"code\":\"hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)\"},{\"name\":\"confusing double quote\",\"code\":\"hDefinition[\\\"schema\\\"]).StartsWith(\\\"IDLColorGradientDefinition\\\", /FOLD_CASE)\"},{\"name\":\"quotes end at important statements 1\",\"code\":[\"if \\\"bad-quote\\\"then \\\"bad-quote\\\"else\"]},{\"name\":\"quotes end at important statements 2\",\"code\":[\"case \\\"bad-quote\\\"of\"]},{\"name\":\"quotes end at important statements 3\",\"code\":[\"for \\\"bad-quote\\\"do\"]},{\"name\":\"quotes end at important statements 4\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"quotes end at important statements 5\",\"code\":[\"if 'bad-quote'then 'bad-quote'else\"]},{\"name\":\"quotes end at important statements 6\",\"code\":[\"case 'bad-quote'of\"]},{\"name\":\"quotes end at important statements 7\",\"code\":[\"for 'bad-quote'do\"]},{\"name\":\"quotes end at important statements 8\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"verifies quote vs number is correctly identified\",\"code\":[\"arr = [\\\"0.00000000\\\"]\"]}]}","quotes.escaped.spec.ts":"{\"suiteName\":\"Validates escaped quote parsing\",\"fileName\":\"quotes.escaped.spec.ts\",\"tests\":[{\"name\":\"simple single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d'\"},{\"name\":\"simple double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\"},{\"name\":\"complex single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d''lots of''other''string'\"},{\"name\":\"complex double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\\\"lots of\\\"\\\"other\\\"\\\"string\\\"\"}]}","quotes.edge-cases.spec.ts":"{\"suiteName\":\"Validates edge case quote parsing\",\"fileName\":\"quotes.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for number-string like strings\",\"code\":\"a = \\\"5\\\"\"}]}","routines.functions.spec.ts":"{\"suiteName\":\"Validates function parsing\",\"fileName\":\"routines.functions.spec.ts\",\"tests\":[{\"name\":\"parses standalone functions\",\"code\":\"myFunc(1 + 2)\"},{\"name\":\"parses nested functions\",\"code\":\"myFunc(myFunc2(_y7$) + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone functions with line continuations\",\"code\":[\"myFunc(1 $\",\" + 2)\"]},{\"name\":\"single-character function\",\"code\":\"a()\"}]}","routines.keywords.spec.ts":"{\"suiteName\":\"Validates keyword parsing\",\"fileName\":\"routines.keywords.spec.ts\",\"tests\":[{\"name\":\"parses keyword assignment\",\"code\":\"myfunc(a = 5)\"},{\"name\":\"parses multiple keywords\",\"code\":\"_otherfunc(a = 5, _b=42)\"},{\"name\":\"parses multiple keywords with line continuation\",\"code\":[\"myfunc(a = 5, $\",\" _b=42)\"]},{\"name\":\"parses keyword assignment with line continuation\",\"code\":[\"myfunc(a $\",\" = 5)\"]},{\"name\":\"parses variable assignment\",\"code\":\"_y = _superFunction(a = 5)\"}]}","routines.procedures.spec.ts":"{\"suiteName\":\"Validates procedure parsing\",\"fileName\":\"routines.procedures.spec.ts\",\"tests\":[{\"name\":\"parses standalone procedures\",\"code\":\"myPro, 1 + 2\"},{\"name\":\"separate pro from variables\",\"code\":\"myPro, arg1, arg2\"},{\"name\":\"pro with line continuations\",\"code\":[\"myPro, $\",\" arg1, arg2\"]},{\"name\":\"pro in loop after arguments and function\",\"code\":\"for i=0, 2*5-jello(1) do print, i\"},{\"name\":\"single-character procedure\",\"code\":\"a\"}]}","routines.spacing.spec.ts":"{\"suiteName\":\"Validates routine spacing\",\"fileName\":\"routines.spacing.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":\"myFunc (1 + 2)\"},{\"name\":\"procedures\",\"code\":\"mypro ,\"},{\"name\":\"function method (dots)\",\"code\":\"a . method ()\"},{\"name\":\"function method (arrow)\",\"code\":\"a -> method ()\"},{\"name\":\"procedure method 1 (dots)\",\"code\":\"a . method \"},{\"name\":\"procedure method 2 (dots)\",\"code\":\"a . method , \"},{\"name\":\"procedure method 1 (arrow)\",\"code\":\"a -> method \"},{\"name\":\"procedure method 2 (arrow)\",\"code\":\"a -> method , \"}]}","routines.definitions.1.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.1.spec.ts\",\"tests\":[{\"name\":\"verifies procedure with arguments and keywords\",\"code\":[\"PRO EndMagic, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies functions with arguments and keywords\",\"code\":[\"function myfunc, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies procedure method with arguments and keywords\",\"code\":[\"PRO myclass::mymethod, arg1, $ ; comment\",\" ; skip empty lines\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies function method with arguments and keywords\",\"code\":[\"function myfuncclass::mymethod, arg1, $ ; comment\",\"\",\" arg2, KW1 = $\",\"\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies more than one routine\",\"code\":[\"Function f1\",\" return, 5\",\"end\",\"\",\"pro p1\",\" print, 42\",\"end\"]}]}","routines.definitions.2.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.2.spec.ts\",\"tests\":[{\"name\":\"verifies we only stop on \\\"end\\\"\",\"code\":[\"PRO EndMagic, Unit, Id\",\" PRINTF, Unit\",\"END\"]},{\"name\":\"verifies we parse names with \\\"!\\\"\",\"code\":[\"pro !sosobad,\",\"END\"]},{\"name\":\"verifies we parse method names with \\\"!\\\"\",\"code\":[\"pro !sosobad::method,\",\"END\"]},{\"name\":\"routines in a very bad single-line\",\"code\":\"FUNCTION VarName, Ptr & RETURN,'' & END\"}]}","string-literal.spec.ts":"{\"suiteName\":\"Verify string literal processing\",\"fileName\":\"string-literal.spec.ts\",\"tests\":[{\"name\":\"simple with substitution\",\"code\":\"a = `my string with ${expression + 5}`\"},{\"name\":\"simple without substitution\",\"code\":\"a = `my string without substitution`\"},{\"name\":\"properly capture nested literals\",\"code\":\"a = `start ${ `nested` } else`\"},{\"name\":\"complex nested case\",\"code\":\"a = `something ${func(a = b, `nested`, /kw) + 6*12} else ${5*5 + `something` + nested} some`\"},{\"name\":\"parse escaped backticks\",\"code\":\"a = `something \\\\` included `\"},{\"name\":\"preserve spacing when extracting tokens\",\"code\":\"a = ` first `\"},{\"name\":\"template literal string with formatting\",\"code\":\"a = `${1.234,\\\"%10.3f\\\"}`\"}]}","string-literal.multiline.spec.ts":"{\"suiteName\":\"Verify string literal processing with multi-line statements\",\"fileName\":\"string-literal.multiline.spec.ts\",\"tests\":[{\"name\":\"preserve spacing and handle multi-line string literals\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"last`\",\"end\"]}]}","string-literal.escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"string-literal.escape.spec.ts\",\"tests\":[{\"name\":\"for syntax highlighting\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"a = `\\\\a `\",\"end\"]}]}","structures.1.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.1.spec.ts\",\"tests\":[{\"name\":\"verifies simplest structure parsing\",\"code\":\"_z5$ = {thing}\"},{\"name\":\"verifies multi-line structure name parsing\",\"code\":[\"_17$ = { $\",\" thing}\"]},{\"name\":\"verifies simplest property parsing without structure name\",\"code\":\"_17$ = {thing:z}\"},{\"name\":\"verifies simplest property parsing without structure name and line continuation\",\"code\":[\"_17$ = { $\",\" thing:z}\"]},{\"name\":\"verifies simplest nested structure parsing\",\"code\":\"_z5$ = {thing1:{thing2:z}}\"},{\"name\":\"verifies structure with inheritance\",\"code\":\"_z5$ = {thing, inherits _jklol}\"},{\"name\":\"verifies all components in single-line\",\"code\":\"a17 = {_th1g, abc:def, b:5, c:f()}\"}]}","structures.2.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.2.spec.ts\",\"tests\":[{\"name\":\"verifies multiple structure names (even though wrong syntax)\",\"code\":\"a = {one,two,three,inherits thing, inherits other, prop:5} ; comment\"},{\"name\":\"verifies nested structures, line continuations, and comments\",\"code\":[\"_17$ = { $ ; something\",\" thing: {name, some:value}}\"]},{\"name\":\"verifies weird syntax for named structures\",\"code\":[\"new_event = {FILESEL_EVENT, parent, ev.top, 0L, $\",\"path+filename, 0L, theFilter}\"]},{\"name\":\"structure names with exclamation points\",\"code\":\"a = {!exciting}\"},{\"name\":\"structure names and then line continuation\",\"code\":\"void = {mlLabelingTool_GraphicOverlay $\"},{\"name\":\"inherits supports spaces\",\"code\":[\" void = {IDLitDataIDLArray2D, $\",\" inherits IDLitData}\"]}]}","unexpected.1.spec.ts":"{\"suiteName\":\"Validates unexpected closer parsing\",\"fileName\":\"unexpected.1.spec.ts\",\"tests\":[{\"name\":\"verifies we catch unexpected closers (other tests cover correctly catching real closers instead of these)\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]}]}","unknown.spec.ts":"{\"suiteName\":\"Validates unknown token parsing\",\"fileName\":\"unknown.spec.ts\",\"tests\":[{\"name\":\"improper arrow function\",\"code\":\"sEvent.component-> $\"},{\"name\":\"text after comment\",\"code\":\"a = $ bad bad\"},{\"name\":\"unknown has right positioning with zero-width matches\",\"code\":\"scale=scale, $, $\"}]}"},"auto-textmate-tests":{"assignment.spec.ts":"{\"suiteName\":\"Validates assignment parsing\",\"fileName\":\"assignment.spec.ts\",\"tests\":[{\"name\":\"parses variable assignment\",\"code\":\"a = 5\"},{\"name\":\"parses system variable assignment\",\"code\":\"!null = 5\"},{\"name\":\"brackets with assignment\",\"code\":\"a[i] = b\"},{\"name\":\"parses variable assignment with line continuation\",\"code\":[\"z = $\",\" 5\"]},{\"name\":\"assignment with parentheses\",\"code\":\"(b) = 15\"},{\"name\":\"procedure after assignment in loop and keyword\",\"code\":\"for i=0, myFunc(a=42) do print, i\"}]}","blocks.spec.ts":"{\"suiteName\":\"Validates block parsing auto-closes\",\"fileName\":\"blocks.spec.ts\",\"tests\":[{\"name\":\"lib example from kruskal_wallis.pro\",\"code\":[\"\",\"if !true then $\",\"\",\"while !true DO BEGIN\",\" a = 42 \",\"ENDWHILE $\",\"\",\"ELSE stop = stop+1\",\"end\"]}]}","brackets.spec.ts":"{\"suiteName\":\"Validates bracket parsing\",\"fileName\":\"brackets.spec.ts\",\"tests\":[{\"name\":\"parses standalone brackets\",\"code\":\"[1 + 2]\"},{\"name\":\"parses standalone brackets with line continuations\",\"code\":[\"[1 + $\",\" 2]\"]},{\"name\":\"indexing and compound expression\",\"code\":\"array1[1 + 2] * (1 + 2)\"},{\"name\":\"brackets with assignment\",\"code\":\"_a[i] = 5 * b\"},{\"name\":\"brackets with compound assignment\",\"code\":\"_aA$[i] *= b\"}]}","colon.spec.ts":"{\"suiteName\":\"Validates colon parsing\",\"fileName\":\"colon.spec.ts\",\"tests\":[{\"name\":\"simple colon test\",\"code\":\"[:]\"},{\"name\":\"array indexing\",\"code\":\"a[0:I] = 42\"}]}","commas.spec.ts":"{\"suiteName\":\"Validates comma parsing (mostly covered elsewhere)\",\"fileName\":\"commas.spec.ts\",\"tests\":[{\"name\":\"don't find commas on their own\",\"code\":\",\"},{\"name\":\"find commas in function\",\"code\":\"f(,)\"},{\"name\":\"find commas in pro\",\"code\":\"p,\"}]}","comments.spec.ts":"{\"suiteName\":\"Validates comment parsing\",\"fileName\":\"comments.spec.ts\",\"tests\":[{\"name\":\"parses simple comments\",\"code\":\" ; something()\"},{\"name\":\"parses code with comments at the end\",\"code\":\"a = b() ; something()\"},{\"name\":\"parses simple comments with TODO\",\"code\":\" ; TODO: something()\"},{\"name\":\"parses code with comments at the end with TODO\",\"code\":\"a = b() ; TODO: something()\"},{\"name\":\"parses code with comments and line continuations\",\"code\":[\"a = $ ; TODO: something()\",\" b()\"]}]}","control.1.spec.ts":"{\"suiteName\":\"Validates control statement parsing\",\"fileName\":\"control.1.spec.ts\",\"tests\":[{\"name\":\"parses basic control statements\",\"code\":[\"break\",\"continue\",\"jump: a = func()\",\"jump: mypro, $\",\" 5\",\"jumpy17$: ;comment\"]},{\"name\":\"parses break in if statements\",\"code\":\"if !true then break\"},{\"name\":\"parses continue in if statements\",\"code\":\"if !true then continue\"},{\"name\":\"parses continue and break in loops\",\"code\":[\"for i=0,99 do begin\",\" continue\",\" break\",\"endfor\"]},{\"name\":\"parses jump in blocks\",\"code\":[\"for i=0,99 do begin\",\" jump:\",\"endfor\"]},{\"name\":\"parses compound control statements\",\"code\":[\"common, group, var1, var2, var3 ; comment\",\"compile_opt, idl2, $ ; line continuation\",\" hidden\",\"compile_opt\",\"forward_function, idl2, hidden\",\"goto, label\"]},{\"name\":\"goto in in statement\",\"code\":\"if not wild then goto, done else printf, outunit\"},{\"name\":\"statements end at line separator\",\"code\":\"GOTO, do_six & END\"}]}","executive-command.spec.ts":"{\"suiteName\":\"Validates executive command parsing\",\"fileName\":\"executive-command.spec.ts\",\"tests\":[{\"name\":\"simple 1\",\"code\":\".compile\"},{\"name\":\"simple 2\",\"code\":\".run myfile.pro\"},{\"name\":\"simple 3 start with spaces\",\"code\":\" .run myfile.pro\"},{\"name\":\"ignore methods\",\"code\":\"obj.method\"},{\"name\":\"ignore properties\",\"code\":\"!null = obj.method\"}]}","include.spec.ts":"{\"suiteName\":\"Validates include statements, but not correct location\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"basic test\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"find in loops\",\"code\":\"for i=0,99 do @very_wrong\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"},{\"name\":\"don't capture afterwards\",\"code\":\"@include.pro ; comment\"}]}","lambda.spec.ts":"{\"suiteName\":\"Validates lambda functions parsed as special token\",\"fileName\":\"lambda.spec.ts\",\"tests\":[{\"name\":\"correctly parse lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","line-modifiers.spec.ts":"{\"suiteName\":\"Validates line modifier (separators)\",\"fileName\":\"line-modifiers.spec.ts\",\"tests\":[{\"name\":\"parses multi-line as single-line\",\"code\":[\"a = a + b() & proc & a.procMethod,1 & $\",\"a={struct}\"]},{\"name\":\"loops properly stop in line modifier\",\"code\":[\"proc & for i=0,99 do print, i & while !true do b = awesome() & foreach val, b, key do print, key, val & endedit\"]},{\"name\":\"line separators in case statement\",\"code\":[\"CASE typ OF\",\" 7: begin val = \\\"\\\" & cnt = 1 & endcase\",\" 8: val = tiff_sint(val, 0, len=cnt)\",\"ENDCASE\"]},{\"name\":\"verifies nested line continuations use basic token\",\"code\":\"scale=scale, $, $\"}]}","logic.if-then-else.1.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [1]\",\"fileName\":\"logic.if-then-else.1.spec.ts\",\"tests\":[{\"name\":\"parses basic if-then loop\",\"code\":\"if !true then print, 'yes'\"},{\"name\":\"parses basic if-then-else loop\",\"code\":\"if ~doIt then print, 'yes' else a = yellow()\"},{\"name\":\"parses basic if-then loop with line continuation 1\",\"code\":[\"if !true $\",\" then print, 'yes'\"]},{\"name\":\"parses basic if-then loop with line continuation 2\",\"code\":[\"if !true $\",\" then print $\",\" , 'yes'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 1\",\"code\":[\"if !true then print, 'yes' $\",\" else print, 'no'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 2\",\"code\":[\"if !true then print, 'yes' $\",\" else $\",\" print, 'no'\"]},{\"name\":\"nested if-then-else\",\"code\":\"if ~(myFunc(_a17$) * 2) then if !false then print, 'yes'\"}]}","logic.if-then-else.2.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [2]\",\"fileName\":\"logic.if-then-else.2.spec.ts\",\"tests\":[{\"name\":\"with blocks [1]\",\"code\":[\"if a++ then begin\",\" super = awesome()\",\"endif else print, 'else'\"]}]}","logic.if-then-else.3.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [3]\",\"fileName\":\"logic.if-then-else.3.spec.ts\",\"tests\":[{\"name\":\"example from IDL code [1]\",\"code\":\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\"},{\"name\":\"example from IDL code [2]\",\"code\":[\"if (ISA(equation)) then begin\",\" graphic.SetProperty, EQUATION=equation\",\" arg1 = equation\",\" if (ISA(style)) then arg2 = style\",\"endif\"]},{\"name\":\"example from IDL code [3]\",\"code\":[\"IF (nms[i-1, j] && ~marked[i-1, j]) THEN $\",\" canny_follow, i-1, j, nms, marked\"]},{\"name\":\"example from IDL code [4]\",\"code\":[\"IF (max(step) && ~n_elements(stepflag)) THEN $\",\" suppMag = nmsupp_mask * mag\"]},{\"name\":\"example from IDL code [5]\",\"code\":[\"if (~Isa(hDefinition, 'Hash') || $\",\" ~hDefinition.HasKey('schema') || $\",\" ~(hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)) then begin\",\" message, 'File does not contain a valid color gradient definition.', /NONAME \",\"endif\"]}]}","logic.case.1.spec.ts":"{\"suiteName\":\"Validates case statement\",\"fileName\":\"logic.case.1.spec.ts\",\"tests\":[{\"name\":\"parses case loop with many syntaxes\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\"]},{\"name\":\"nested case statement\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\"]}]}","logic.switch.1.spec.ts":"{\"suiteName\":\"Validates switch statement\",\"fileName\":\"logic.switch.1.spec.ts\",\"tests\":[{\"name\":\"parses switch loop with many syntaxes\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDSWITCH\"]},{\"name\":\"nested switch statement\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" SWITCH x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDSWITCH\",\"END\",\"ENDSWITCH\"]}]}","logic.ternary.1.spec.ts":"{\"suiteName\":\"Validates for ternary statement parsing\",\"fileName\":\"logic.ternary.1.spec.ts\",\"tests\":[{\"name\":\"simplest ternary statement\",\"code\":\"a = something ? 5 : 6\"},{\"name\":\"nested ternary statement grouped\",\"code\":\"a = !true ? (!false ? 7 : 8) : 6\"},{\"name\":\"nested ternary statement without grouping\",\"code\":\"mypro, something ? ~something ? 7 : 8 : 6, 2\"},{\"name\":\"ternary as argument\",\"code\":\"a = myfunc(something ? otherfunc() : !awesomesauce) + 3\"},{\"name\":\"operators end on ternary statements\",\"code\":\"a = 5*something ? 5- 4 : 6^3\"},{\"name\":\"multi-line ternary 1\",\"code\":[\"a = _myvar $\",\" ? 'jello' : \\\"jelly\\\"\"]},{\"name\":\"multi-line ternary 2\",\"code\":[\"a = myfunc( $\",\" a,b,c) ? b4d $\",\" : $\",\" s1nt4x3x4mple\"]},{\"name\":\"ternary works in braces as expected\",\"code\":[\"_17 = arr[!true ? 0 : -3: -1]\"]}]}","loops.for.spec.ts":"{\"suiteName\":\"Validates for loop parsing\",\"fileName\":\"loops.for.spec.ts\",\"tests\":[{\"name\":\"parses basic for loop\",\"code\":\"for i=0, 99 do print, i\"},{\"name\":\"parses basic for loop with increment\",\"code\":\"for i=0, 99, 2 do !null = myFunc(i)\"},{\"name\":\"parses basic for loop with line continuation\",\"code\":[\"for i=0, jj do $\",\" print, i\"]},{\"name\":\"parses basic for loop with block\",\"code\":[\"for i=0, 99 do begin\",\" !null = myFunc(i)\",\"endfor\"]},{\"name\":\"parses nested for loop\",\"code\":\"for i=0, 99 do for j=0, 99 do print, i + j\"}]}","loops.foreach.spec.ts":"{\"suiteName\":\"Validates foreach loop parsing\",\"fileName\":\"loops.foreach.spec.ts\",\"tests\":[{\"name\":\"parses basic foreach loop\",\"code\":\"foreach val, arr do print, i\"},{\"name\":\"parses basic foreach loop with key\",\"code\":\"foreach val, arr, idx do !null = myFunc(i)\"},{\"name\":\"parses basic foreach loop with line continuation\",\"code\":[\"foreach val, arr do $\",\" print, i\"]},{\"name\":\"parses basic foreach loop with block\",\"code\":[\"foreach val, arr do begin\",\" !null = myFunc(i)\",\"endforeach\"]},{\"name\":\"parses nested foreach loop\",\"code\":\"foreach val, arr do foreach val2, val do print, val2\"}]}","loops.repeat.spec.ts":"{\"suiteName\":\"Validates repeat loop parsing\",\"fileName\":\"loops.repeat.spec.ts\",\"tests\":[{\"name\":\"parses basic repeat loop\",\"code\":\"REPEAT A = A * 2 UNTIL A GT B\"},{\"name\":\"parses procedure in repeat loop\",\"code\":\"REPEAT PRINT, A UNTIL A GT B\"},{\"name\":\"parses basic repeat loop with line continuations\",\"code\":[\"REPEAT A = $\",\" A * 2 UNTIL $\",\" A GT B\"]},{\"name\":\"parses basic repeat loop with block\",\"code\":[\"REPEAT BEGIN\",\" A = A * 2\",\"ENDREP UNTIL A GT B\"]},{\"name\":\"correctly parses loops with if statements inside\",\"code\":[\"repeat if !true then break until !true\"]}]}","loops.while.spec.ts":"{\"suiteName\":\"Validates while loop parsing\",\"fileName\":\"loops.while.spec.ts\",\"tests\":[{\"name\":\"parses basic while loop\",\"code\":\"while !true do print, i\"},{\"name\":\"parses basic nested while loop\",\"code\":\"while !true do while !false do print, i\"},{\"name\":\"parses basic while loop with line continuation\",\"code\":[\"while !true do $\",\" print, $\",\" i\"]},{\"name\":\"parses basic while loop with block\",\"code\":[\"while (a eq 5) do begin\",\" !null = myFunc(i)\",\"endwhile\"]}]}","methods.functions.spec.ts":"{\"suiteName\":\"Validates function method parsing\",\"fileName\":\"methods.functions.spec.ts\",\"tests\":[{\"name\":\"parses function methods with dots\",\"code\":\"!NULL = a.myFunc(1)\"},{\"name\":\"parses function methods with arrows\",\"code\":\"!NULL = a->myFunc(1)\"},{\"name\":\"parses super function methods with dots\",\"code\":\"a.super::myfunc(1)\"},{\"name\":\"parses super function methods with arrows\",\"code\":\"a->super::myfunc(a)\"},{\"name\":\"parses function methods with dots and line continuation\",\"code\":[\"!NULL = a.myFunc( $\",\" 1)\"]},{\"name\":\"single-character function method\",\"code\":\"a.b()\"}]}","methods.procedures.spec.ts":"{\"suiteName\":\"Validates procedure method parsing\",\"fileName\":\"methods.procedures.spec.ts\",\"tests\":[{\"name\":\"parses procedure methods with dots\",\"code\":\"a.myProc, 1\"},{\"name\":\"parses procedure methods with arrows\",\"code\":\"a->myProc, a\"},{\"name\":\"parses super procedure methods with dots\",\"code\":\"a.super::myProc, 1\"},{\"name\":\"parses super procedure methods with arrows\",\"code\":\"a->super::myProc, a\"},{\"name\":\"parses procedure methods with dots and line continuations\",\"code\":[\"a.myProc, $\",\" 1\"]},{\"name\":\"procedure method from IDL lib\",\"code\":[\"((*state).markers).Add, CGRAD_NEW_MARKER(POSITION=marker['position'], $\",\" COLOR=color, $\",\" MIDDLE=marker['middle'])\"]},{\"name\":\"single-character procedure method\",\"code\":\"a.b\"}]}","numbers.spec.ts":"{\"suiteName\":\"Validates special cases for number parsing\",\"fileName\":\"numbers.spec.ts\",\"tests\":[{\"name\":\"correctly parse scientific notations\",\"code\":[\"a = -1e34\",\"a = -1e34i\",\"a = -1e34j\"]},{\"name\":\"correctly parse scientific notations with negatives 1\",\"code\":[\"a = 1e-34\",\"a = 1e-34i\",\"a = 1e-34j\"]},{\"name\":\"correctly parse scientific notations with negatives 2\",\"code\":[\"a = 1e-\",\"a = 1e-i\",\"a = 1e-j\"]},{\"name\":\"correctly parse hex notation\",\"code\":[\"a = 0x8FFF + 0x8Fub + 0x8FulL\",\"a = 0x8FFFI + 0x8FubI + 0x8FulLi\",\"a = 0x8FFFJ + 0x8Fubj + 0x8FulLJ\"]},{\"name\":\"correctly parse octal notation\",\"code\":[\"a = 0o8FFF + 0o8Fub + 0o8FulL\",\"a = 0o8FFFI + 0o8FubI + 0o8FulLi\",\"a = 0o8FFFJ + 0o8Fubj + 0o8FulLJ\"]},{\"name\":\"correctly parse binary notation\",\"code\":[\"a = 0b8FFF + 0b8Fub + 0b8FulL\",\"a = 0b8FFFI + 0b8FubI + 0b8FulLi\",\"a = 0b8FFFJ + 0b8Fubj + 0b8FulLJ\"]},{\"name\":\"correctly parse scientific notations with doubles\",\"code\":[\"a = -1d34\",\"a = -1d34i\",\"a = -1d34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 1\",\"code\":[\"a = 1d-34\",\"a = 1d-34i\",\"a = 1d-34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 2\",\"code\":[\"a = 1d-\",\"a = 1d-i\",\"a = 1d-j\"]},{\"name\":\"correctly parse new syntax for complex\",\"code\":[\"a = 1i\",\"a = 1j\"]},{\"name\":\"catch unfinished dot statement 1\",\"code\":\"a.\"},{\"name\":\"catch unfinished dot statement 2\",\"code\":\"a = b.\"},{\"name\":\"catch standalone dot\",\"code\":\"a = .\"},{\"name\":\"edge case scientific\",\"code\":\"a = .1e+12\"},{\"name\":\"solo dot\",\"code\":\".\"}]}","number-string.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36 + \\\"45\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36b + \\\"45ull\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'b\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'x\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'o\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"b\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"x\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"o\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XS\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XS\"}]}","number-string.complex-i.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-i.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36i + \\\"45i\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bi + \\\"45ulli\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bi\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xi\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oi\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bi\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xi\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oi\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSi\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSi\"}]}","number-string.complex-j.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-j.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36j + \\\"45j\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bj + \\\"45ullj\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bj\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xj\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oj\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bj\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xj\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oj\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSj\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSj\"}]}","operators.compound.spec.ts":"{\"suiteName\":\"Validates compound operator parsing\",\"fileName\":\"operators.compound.spec.ts\",\"tests\":[{\"name\":\"parses with line continuation\",\"code\":[\"z *= $\",\" 5\"]},{\"name\":\"does not recurse with \\\"||\\\" operator\",\"code\":\"a || b || c\"},{\"name\":\"does not recurse with \\\"or\\\" operator\",\"code\":\"a or b or c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a && b && c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a and b and c\"}]}","operators.spec.ts":"{\"suiteName\":\"Validates operator parsing\",\"fileName\":\"operators.spec.ts\",\"tests\":[{\"name\":\"close on braces\",\"code\":\"{1+2}\"},{\"name\":\"close on brackets\",\"code\":\"[1+2]\"},{\"name\":\"close on parentheses\",\"code\":\"(1+2)\"},{\"name\":\"close on commas\",\"code\":\"1+2,3+4\"},{\"name\":\"close on then and else\",\"code\":\"if 1+2 then a = 3+4 else a = 4^3\"},{\"name\":\"close on do in loops\",\"code\":\"for i=0, 99-1 do print, i\"},{\"name\":\"operators with line continuations\",\"code\":[\"zach + $ \",\"awesome\"]},{\"name\":\"operators end on \\\"of\\\"\",\"code\":[\"case n_params()-1 of\",\" 0: call_method, method_name, oObj[i], _extra=e\",\" 1: call_method, method_name, oObj[i], p1, _extra=e\",\"endcase\"]},{\"name\":\"operators end on arrow function\",\"code\":\"*(*pState).pTitle->SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators end on procedure method\",\"code\":\"*pTitle.SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle.SetProperty(color=[255, 255, 255])\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle->SetProperty(color=[255, 255, 255])\"},{\"name\":\"special token for increment\",\"code\":[\"++a\",\"a++\"]},{\"name\":\"special token for decrement\",\"code\":[\"--a\",\"a+--\"]},{\"name\":\"next to each other\",\"code\":\"a = b++ + 5\"}]}","parentheses.spec.ts":"{\"suiteName\":\"Validates parentheses parsing\",\"fileName\":\"parentheses.spec.ts\",\"tests\":[{\"name\":\"parses standalone parentheses\",\"code\":\"(1 + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone parentheses with line continuation\",\"code\":[\"(1 + $ \",\" 2)\"]}]}","prompts.spec.ts":"{\"suiteName\":\"Validates prompt parsing\",\"fileName\":\"prompts.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\"IDL> print, 42\"},{\"name\":\"parses ENVI prompt\",\"code\":\"ENVI> print, 17\"}]}","properties.spec.ts":"{\"suiteName\":\"Validates property parsing\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"parses property assignment\",\"code\":\"a.thing = 5\"},{\"name\":\"parses property access\",\"code\":\"b = a.thing\"},{\"name\":\"parses property access with line continuation\",\"code\":[\"b = $\",\" a.thing\"]},{\"name\":\"parses nested property access\",\"code\":\"b = a.thing1.thing2\"},{\"name\":\"parses property access as arguments\",\"code\":\"myPro, a.thing, b.thing\"},{\"name\":\"property example from IDL lib\",\"code\":\"(*state).bottomSelection = lMarkers.Count()-1\"},{\"name\":\"structure property via indexing\",\"code\":\"a = b.(i)\"}]}","python.spec.ts":"{\"suiteName\":\"Validates Python code parsing\",\"fileName\":\"python.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\">>>import numpy as np\"}]}","quotes.spec.ts":"{\"suiteName\":\"Validates quote parsing\",\"fileName\":\"quotes.spec.ts\",\"tests\":[{\"name\":\"parses standalone single quotes\",\"code\":\"'myFunc(1 + 2)'\"},{\"name\":\"parses standalone double quotes\",\"code\":\"\\\"myFunc(1 + 2)\\\"\"},{\"name\":\"verify single quotes without closing\",\"code\":\"'string\"},{\"name\":\"verify double quotes without closing\",\"code\":\"\\\"string\"},{\"name\":\"confusing single quote\",\"code\":\"hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)\"},{\"name\":\"confusing double quote\",\"code\":\"hDefinition[\\\"schema\\\"]).StartsWith(\\\"IDLColorGradientDefinition\\\", /FOLD_CASE)\"},{\"name\":\"quotes end at important statements 1\",\"code\":[\"if \\\"bad-quote\\\"then \\\"bad-quote\\\"else\"]},{\"name\":\"quotes end at important statements 2\",\"code\":[\"case \\\"bad-quote\\\"of\"]},{\"name\":\"quotes end at important statements 3\",\"code\":[\"for \\\"bad-quote\\\"do\"]},{\"name\":\"quotes end at important statements 4\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"quotes end at important statements 5\",\"code\":[\"if 'bad-quote'then 'bad-quote'else\"]},{\"name\":\"quotes end at important statements 6\",\"code\":[\"case 'bad-quote'of\"]},{\"name\":\"quotes end at important statements 7\",\"code\":[\"for 'bad-quote'do\"]},{\"name\":\"quotes end at important statements 8\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"verifies quote vs number is correctly identified\",\"code\":[\"arr = [\\\"0.00000000\\\"]\"]}]}","quotes.escaped.spec.ts":"{\"suiteName\":\"Validates escaped quote parsing\",\"fileName\":\"quotes.escaped.spec.ts\",\"tests\":[{\"name\":\"simple single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d'\"},{\"name\":\"simple double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\"},{\"name\":\"complex single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d''lots of''other''string'\"},{\"name\":\"complex double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\\\"lots of\\\"\\\"other\\\"\\\"string\\\"\"}]}","quotes.edge-cases.spec.ts":"{\"suiteName\":\"Validates edge case quote parsing\",\"fileName\":\"quotes.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for number-string like strings\",\"code\":\"a = \\\"5\\\"\"}]}","routines.functions.spec.ts":"{\"suiteName\":\"Validates function parsing\",\"fileName\":\"routines.functions.spec.ts\",\"tests\":[{\"name\":\"parses standalone functions\",\"code\":\"myFunc(1 + 2)\"},{\"name\":\"parses nested functions\",\"code\":\"myFunc(myFunc2(_y7$) + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone functions with line continuations\",\"code\":[\"myFunc(1 $\",\" + 2)\"]},{\"name\":\"single-character function\",\"code\":\"a()\"}]}","routines.keywords.spec.ts":"{\"suiteName\":\"Validates keyword parsing\",\"fileName\":\"routines.keywords.spec.ts\",\"tests\":[{\"name\":\"parses keyword assignment\",\"code\":\"myfunc(a = 5)\"},{\"name\":\"parses multiple keywords\",\"code\":\"_otherfunc(a = 5, _b=42)\"},{\"name\":\"parses multiple keywords with line continuation\",\"code\":[\"myfunc(a = 5, $\",\" _b=42)\"]},{\"name\":\"parses keyword assignment with line continuation\",\"code\":[\"myfunc(a $\",\" = 5)\"]},{\"name\":\"parses variable assignment\",\"code\":\"_y = _superFunction(a = 5)\"}]}","routines.procedures.spec.ts":"{\"suiteName\":\"Validates procedure parsing\",\"fileName\":\"routines.procedures.spec.ts\",\"tests\":[{\"name\":\"parses standalone procedures\",\"code\":\"myPro, 1 + 2\"},{\"name\":\"separate pro from variables\",\"code\":\"myPro, arg1, arg2\"},{\"name\":\"pro with line continuations\",\"code\":[\"myPro, $\",\" arg1, arg2\"]},{\"name\":\"pro in loop after arguments and function\",\"code\":\"for i=0, 2*5-jello(1) do print, i\"},{\"name\":\"single-character procedure\",\"code\":\"a\"}]}","routines.spacing.spec.ts":"{\"suiteName\":\"Validates routine spacing\",\"fileName\":\"routines.spacing.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":\"myFunc (1 + 2)\"},{\"name\":\"procedures\",\"code\":\"mypro ,\"},{\"name\":\"function method (dots)\",\"code\":\"a . method ()\"},{\"name\":\"function method (arrow)\",\"code\":\"a -> method ()\"},{\"name\":\"procedure method 1 (dots)\",\"code\":\"a . method \"},{\"name\":\"procedure method 2 (dots)\",\"code\":\"a . method , \"},{\"name\":\"procedure method 1 (arrow)\",\"code\":\"a -> method \"},{\"name\":\"procedure method 2 (arrow)\",\"code\":\"a -> method , \"}]}","routines.definitions.1.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.1.spec.ts\",\"tests\":[{\"name\":\"verifies procedure with arguments and keywords\",\"code\":[\"PRO EndMagic, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies functions with arguments and keywords\",\"code\":[\"function myfunc, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies procedure method with arguments and keywords\",\"code\":[\"PRO myclass::mymethod, arg1, $ ; comment\",\" ; skip empty lines\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies function method with arguments and keywords\",\"code\":[\"function myfuncclass::mymethod, arg1, $ ; comment\",\"\",\" arg2, KW1 = $\",\"\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies more than one routine\",\"code\":[\"Function f1\",\" return, 5\",\"end\",\"\",\"pro p1\",\" print, 42\",\"end\"]}]}","routines.definitions.2.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.2.spec.ts\",\"tests\":[{\"name\":\"verifies we only stop on \\\"end\\\"\",\"code\":[\"PRO EndMagic, Unit, Id\",\" PRINTF, Unit\",\"END\"]},{\"name\":\"verifies we parse names with \\\"!\\\"\",\"code\":[\"pro !sosobad,\",\"END\"]},{\"name\":\"verifies we parse method names with \\\"!\\\"\",\"code\":[\"pro !sosobad::method,\",\"END\"]},{\"name\":\"routines in a very bad single-line\",\"code\":\"FUNCTION VarName, Ptr & RETURN,'' & END\"}]}","string-literal.spec.ts":"{\"suiteName\":\"Verify string literal processing\",\"fileName\":\"string-literal.spec.ts\",\"tests\":[{\"name\":\"simple with substitution\",\"code\":\"a = `my string with ${expression + 5}`\"},{\"name\":\"simple without substitution\",\"code\":\"a = `my string without substitution`\"},{\"name\":\"properly capture nested literals\",\"code\":\"a = `start ${ `nested` } else`\"},{\"name\":\"complex nested case\",\"code\":\"a = `something ${func(a = b, `nested`, /kw) + 6*12} else ${5*5 + `something` + nested} some`\"},{\"name\":\"parse escaped backticks\",\"code\":\"a = `something \\\\` included `\"},{\"name\":\"preserve spacing when extracting tokens\",\"code\":\"a = ` first `\"},{\"name\":\"template literal string with formatting\",\"code\":\"a = `${1.234,\\\"%10.3f\\\"}`\"}]}","string-literal.multiline.spec.ts":"{\"suiteName\":\"Verify string literal processing with multi-line statements\",\"fileName\":\"string-literal.multiline.spec.ts\",\"tests\":[{\"name\":\"preserve spacing and handle multi-line string literals\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"last`\",\"end\"]}]}","string-literal.escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"string-literal.escape.spec.ts\",\"tests\":[{\"name\":\"for syntax highlighting\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"a = `\\\\a `\",\"end\"]}]}","structures.1.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.1.spec.ts\",\"tests\":[{\"name\":\"verifies simplest structure parsing\",\"code\":\"_z5$ = {thing}\"},{\"name\":\"verifies multi-line structure name parsing\",\"code\":[\"_17$ = { $\",\" thing}\"]},{\"name\":\"verifies simplest property parsing without structure name\",\"code\":\"_17$ = {thing:z}\"},{\"name\":\"verifies simplest property parsing without structure name and line continuation\",\"code\":[\"_17$ = { $\",\" thing:z}\"]},{\"name\":\"verifies simplest nested structure parsing\",\"code\":\"_z5$ = {thing1:{thing2:z}}\"},{\"name\":\"verifies structure with inheritance\",\"code\":\"_z5$ = {thing, inherits _jklol}\"},{\"name\":\"verifies all components in single-line\",\"code\":\"a17 = {_th1g, abc:def, b:5, c:f()}\"}]}","structures.2.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.2.spec.ts\",\"tests\":[{\"name\":\"verifies multiple structure names (even though wrong syntax)\",\"code\":\"a = {one,two,three,inherits thing, inherits other, prop:5} ; comment\"},{\"name\":\"verifies nested structures, line continuations, and comments\",\"code\":[\"_17$ = { $ ; something\",\" thing: {name, some:value}}\"]},{\"name\":\"verifies weird syntax for named structures\",\"code\":[\"new_event = {FILESEL_EVENT, parent, ev.top, 0L, $\",\"path+filename, 0L, theFilter}\"]},{\"name\":\"structure names with exclamation points\",\"code\":\"a = {!exciting}\"},{\"name\":\"structure names and then line continuation\",\"code\":\"void = {mlLabelingTool_GraphicOverlay $\"},{\"name\":\"inherits supports spaces\",\"code\":[\" void = {IDLitDataIDLArray2D, $\",\" inherits IDLitData}\"]}]}","unexpected.1.spec.ts":"{\"suiteName\":\"Validates unexpected closer parsing\",\"fileName\":\"unexpected.1.spec.ts\",\"tests\":[{\"name\":\"verifies we catch unexpected closers (other tests cover correctly catching real closers instead of these)\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]}]}","unknown.spec.ts":"{\"suiteName\":\"Validates unknown token parsing\",\"fileName\":\"unknown.spec.ts\",\"tests\":[{\"name\":\"improper arrow function\",\"code\":\"sEvent.component-> $\"},{\"name\":\"text after comment\",\"code\":\"a = $ bad bad\"},{\"name\":\"unknown has right positioning with zero-width matches\",\"code\":\"scale=scale, $, $\"}]}"},"auto-post-processor-tests":{"arg-defs.spec.ts":"{\"suiteName\":\"Correctly extract argument definitions from code\",\"fileName\":\"arg-defs.spec.ts\",\"tests\":[{\"name\":\"Convert variables to arguments in standard routine definitions\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"Convert variables to arguments in routine method definition\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","arrows.spec.ts":"{\"suiteName\":\"Correctly map arrows\",\"fileName\":\"arrows.spec.ts\",\"tests\":[{\"name\":\"as procedure-method, but incomplete\",\"code\":[\"compile_opt idl2\",\"a->\",\"end\"]},{\"name\":\"as function method, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b->\",\"end\"]}]}","comment-blocks.1.spec.ts":"{\"suiteName\":\"Correctly map comments to comment blocks\",\"fileName\":\"comment-blocks.1.spec.ts\",\"tests\":[{\"name\":\"ignore normal comments\",\"code\":[\"compile_opt idl2\",\"; i am properly ignored like i should be\",\"a = 5\",\"end\"]},{\"name\":\"single-line blocks\",\"code\":[\"compile_opt idl2\",\";+ i am a basic block on only one line\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks without end\",\"code\":[\"compile_opt idl2\",\";+\",\"; something about docs\",\"; like, really cool information\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks with close\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\";- ended\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks with close\",\"code\":[\"compile_opt idl2\",\";+ definition of life\",\"a = 42\",\";+ second definition of life\",\"fortyTwo = 42\",\"end\"]}]}","comment-blocks.2.spec.ts":"{\"suiteName\":\"Advanced comment block cases\",\"fileName\":\"comment-blocks.2.spec.ts\",\"tests\":[{\"name\":\"end on block end and dont include excess comments\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\";-\",\"; not included in block\",\"a = 5\",\"end\"]},{\"name\":\"allow two blocks next to each other\",\"code\":[\"compile_opt idl2\",\";+\",\"; first block\",\";-\",\";+\",\"; second block\",\";-\",\"a = 5\",\"end\"]},{\"name\":\"capture recursive blocks\",\"code\":[\"compile_opt idl2\",\";+\",\"; first block\",\";-\",\"\",\"if !true then begin\",\" ;+\",\" ; second block\",\" ;-\",\" a = 5\",\"endif\",\"\",\"end\"]}]}","comment-blocks.3.spec.ts":"{\"suiteName\":\"Confusing comment blocks \",\"fileName\":\"comment-blocks.3.spec.ts\",\"tests\":[{\"name\":\"ignore markdown lists\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\"; - some bulleted list\",\"; - some bulleted list\",\";-\",\"a = 5\",\"end\"]}]}","control-options.spec.ts":"{\"suiteName\":\"Correctly map options for compound control statements\",\"fileName\":\"control-options.spec.ts\",\"tests\":[{\"name\":\"Convert variables to control options\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" common blockName ; ignore for now\",\" forward_function myfunc1, myfunc2, myfunc3\",\" goto, stmnt\",\"\",\"end\"]}]}","dot.spec.ts":"{\"suiteName\":\"Correctly map periods to dots\",\"fileName\":\"dot.spec.ts\",\"tests\":[{\"name\":\"as procedure-method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a.\",\"end\"]},{\"name\":\"as function method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b.\",\"end\"]},{\"name\":\"standalone 1\",\"code\":[\"compile_opt idl2\",\"a = .\",\"end\"]},{\"name\":\"standalone 2\",\"code\":[\"compile_opt idl2\",\".\",\"end\"]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly extract keyword names from routine calls\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"Convert variables to keywords when calling procedures\",\"code\":[\"compile_opt idl2\",\"mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling procedure methods\",\"code\":[\"compile_opt idl2\",\"obj.method, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling functions\",\"code\":[\"compile_opt idl2\",\"res = mypro(arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3)\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling function methods\",\"code\":[\"compile_opt idl2\",\"res = obj.method(arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3)\",\"\",\"end\"]}]}","keywords-binary.spec.ts":"{\"suiteName\":\"Correctly detect binary keywords\",\"fileName\":\"keywords-binary.spec.ts\",\"tests\":[{\"name\":\"in procedure\",\"code\":\"mypro, /kw1, /KW2\"},{\"name\":\"in procedure method\",\"code\":[\"myclass.method, $\",\" /KW3, KW=!true\"]},{\"name\":\"in function\",\"code\":\"a = myfunc(/KW1, /KW2)\"},{\"name\":\"in function method\",\"code\":[\"ZACH = AWESOME.SAUCE(/kw3, $\",\"/KW17, KW18 = !false)\"]},{\"name\":\"preserve other children after keyword\",\"code\":[\"compile_opt idl2\",\"tvcrs,x,y,/dev $\\t;Restore cursor\",\" kw=2\",\"\",\"end\"]},{\"name\":\"properly handle comments in function calls\",\"code\":[\"compile_opt idl2\",\"wDatatable = WIDGET_TABLE(id_datarow, $\",\"; FORMAT='(A)', $\",\" /RESIZEABLE_COLUMNS)\",\"\",\"end\"]}]}","keyword-defs.spec.ts":"{\"suiteName\":\"Correctly extract keyword definitions\",\"fileName\":\"keyword-defs.spec.ts\",\"tests\":[{\"name\":\"Convert variables to keywords in standard routine definitions\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords in routine method definition\",\"code\":[\"pro mypro::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"from complex example\",\"code\":[\"function TS_HANTS2, timeseries, $\",\"amplitudes = amp, $\",\"delta = delta, $\",\"dod = dod, $\",\"double = double, $\",\"err_tolerance = err_tolerance, $\",\"; FREQUENCIES=freq, $\",\"HIGH = HIGH, $\",\"low = low, $\",\"num_frequencies = num_frequencies, $\",\"num_period = num_period, $\",\"phases = phases, $\",\"range_maximum = range_maximum, $\",\"range_minimum = range_minimum, $\",\"time_sample = time_sample, $\",\"num_images = num_images\",\"\",\"compile_opt idl2\",\"\",\"a = IDL_Number.total()\",\"\",\"return, name\",\"end\"]}]}","main.spec.ts":"{\"suiteName\":\"Correctly maps main level tokens\",\"fileName\":\"main.spec.ts\",\"tests\":[{\"name\":\"do nothing without main level\",\"code\":[\"function myfunc\",\"compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"process single-line code 1\",\"code\":[\"a = plot(/TEST)\"]},{\"name\":\"process single-line code 2\",\"code\":[\"a = `${42, '42'}${42, '42'}`\"]},{\"name\":\"catch correct\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"catch with no end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"]},{\"name\":\"catch with statements after the end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\",\"; bad comment\",\"something = else\"]},{\"name\":\"ignore only comments\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"; another comment\"]},{\"name\":\"edge case\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"!null = myfunc()\"]}]}","operator.pointer-deref.basic.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.basic.spec.ts\",\"tests\":[{\"name\":\"ignore multiplication\",\"code\":[\"a = 6 * 7\"]},{\"name\":\"ignore multiplication\",\"code\":[\"a = (6) * (7)\"]},{\"name\":\"assignment\",\"code\":[\"a = *var\"]},{\"name\":\"after operators\",\"code\":[\"a = 5 + *var\"]},{\"name\":\"after mod operator\",\"code\":[\"a = mod *var\"]},{\"name\":\"after logical operators\",\"code\":[\"a = 5 le *var\"]},{\"name\":\"single line\",\"code\":[\"*ptr = 42\"]}]}","operator.pointer-deref.loops.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.loops.spec.ts\",\"tests\":[{\"name\":\"in for loop statements\",\"code\":[\"for i=*var, *other do *val = 42\"]},{\"name\":\"in foreach loop statements\",\"code\":[\"foreach val, *thing, key do *val = 42\"]},{\"name\":\"in while loop statements\",\"code\":[\"while *var do *val = 42\"]},{\"name\":\"in repeat loop statements\",\"code\":[\"repeat *val = 42 until *var\"]}]}","operator.pointer-deref.if.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.if.spec.ts\",\"tests\":[{\"name\":\"in if-then-else\",\"code\":[\"if *val then *var = 42 else *var = 84\"]}]}","operator.pointer-deref.case.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.case.spec.ts\",\"tests\":[{\"name\":\"all parts of case statement\",\"code\":[\"compile_opt idl2\",\"case *val of\",\" *thing: *other = 42\",\" else: *value = 84\",\"endcase\",\"end\"]}]}","operator.pointer-deref.routines.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.routines.spec.ts\",\"tests\":[{\"name\":\"in functions\",\"code\":[\"a = func(*val, *other, kw=*last)\"]},{\"name\":\"in function methods\",\"code\":[\"a = var.func(*val, *other, kw=*last)\"]},{\"name\":\"in procedure definitions\",\"code\":[\"function mypro\",\" compile_opt idl2\",\" *val = 5\",\" *val2 = 5\",\" return, !null\",\"end\"]},{\"name\":\"in procedures\",\"code\":[\"mypro, *val, *other, kw=*last\"]},{\"name\":\"in procedure methods\",\"code\":[\"var.mypro, *val, *other, kw=*last\"]},{\"name\":\"in multi-line procedures\",\"code\":[\"mypro,$\",\" *val\",\"end\"]},{\"name\":\"in procedure definitions\",\"code\":[\"pro mypro\",\"compile_opt idl2\",\" *val = 5\",\" *val2 = 5\",\" return\",\"end\"]}]}","operator.pointer-deref.paren.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.paren.spec.ts\",\"tests\":[{\"name\":\"as first statement in paren\",\"code\":[\"a = (*var)\"]}]}","operator.pointer-deref.struct.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.struct.spec.ts\",\"tests\":[{\"name\":\"after structure properties\",\"code\":[\"a = {prop: *ptr}\"]},{\"name\":\"after indexed structure properties\",\"code\":[\"a = var.(*thing)\"]}]}","operator.pointer-deref.switch.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.switch.spec.ts\",\"tests\":[{\"name\":\"all parts of switch statement\",\"code\":[\"\",\"compile_opt idl2\",\"switch *val of\",\" *thing: *other = 42\",\" *thing2: *other = 42\",\" else: *value = 84\",\"endcase\",\"end\"]}]}","operator.pointer-deref.ternary.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.ternary.spec.ts\",\"tests\":[{\"name\":\"all parts of ternary operators\",\"code\":[\"a = *val ? *truthy : *falsy\"]}]}","operator.indexing.array.spec.ts":"{\"suiteName\":\"Correctly identify array indexing\",\"fileName\":\"operator.indexing.array.spec.ts\",\"tests\":[{\"name\":\"all parts of ternary operators\",\"code\":[\"compile_opt idl2\",\"subsel = sel[*, 1:*val]\",\"end\"]}]}","operator.pointer-deref.regression.spec.ts":"{\"suiteName\":\"Correctly identify array indexing\",\"fileName\":\"operator.pointer-deref.regression.spec.ts\",\"tests\":[{\"name\":\"instead of de-referencing\",\"code\":[\"compile_opt idl2\",\"temp = reform(mask[i*8 : min([s[1] - 1, i*8 + 7]), j])\",\"end\"]}]}","strings.spec.ts":"{\"suiteName\":\"Correctly merge strings together\",\"fileName\":\"strings.spec.ts\",\"tests\":[{\"name\":\"merge single quotes\",\"code\":[\"a = 'string''escaped'\"]},{\"name\":\"merge double quotes\",\"code\":[\"a = \\\"string\\\"\\\"escaped\\\"\"]},{\"name\":\"ignore single quotes that cannot be merged\",\"code\":[\"a = 'string' 'escaped'\"]},{\"name\":\"ignore double quotes that cannot be merged\",\"code\":[\"a = \\\"string\\\" \\\"escaped\\\"\"]}]}","var-not-function.spec.ts":"{\"suiteName\":\"Correctly identify variables instead of function calls\",\"fileName\":\"var-not-function.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}"},"auto-syntax-validator-tests":{"bad-routine-def.spec.ts":"{\"suiteName\":\"Verify that we can parse and report problems\",\"fileName\":\"bad-routine-def.spec.ts\",\"tests\":[{\"name\":\"for bad function\",\"code\":[\"function \",\"\",\"; pro test_myurl\",\"\",\"a = curl_easy_init()\",\"curlopt_header = 42\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_header, 1)\",\"curlopt_url = 10002\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_url, 'http://www.google.com')\",\"print, 'curl_easy_perform', curl_easy_perform(a)\",\"curl_easy_cleanup, a\",\"end\"]},{\"name\":\"for bad pro\",\"code\":[\"pro \",\"\",\"; pro test_myurl\",\"\",\"a = curl_easy_init()\",\"curlopt_header = 42\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_header, 1)\",\"curlopt_url = 10002\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_url, 'http://www.google.com')\",\"print, 'curl_easy_perform', curl_easy_perform(a)\",\"curl_easy_cleanup, a\",\"end\"]}]}","code.0.not-closed.spec.ts":"{\"suiteName\":\"Detects problems with statements not being closed\",\"fileName\":\"code.0.not-closed.spec.ts\",\"tests\":[{\"name\":\"parentheses\",\"code\":\"(\"},{\"name\":\"brackets\",\"code\":\"[\"},{\"name\":\"structures\",\"code\":\"{\"},{\"name\":\"functions\",\"code\":\"myfunc(\"},{\"name\":\"blocks\",\"code\":\"begin\"},{\"name\":\"switch\",\"code\":\"switch\"},{\"name\":\"case\",\"code\":\"case\"},{\"name\":\"procedures\",\"code\":\"pro mypro\"},{\"name\":\"functions\",\"code\":\"function myfunc\"},{\"name\":\"across line boundaries\",\"code\":[\"( $\",\" ;something\"]},{\"name\":\"only report last instance of unclosed in main\",\"code\":[\"compile_opt idl2\",\"p = plot(var var, $\",\" plot(var var\",\"end\"]},{\"name\":\"only report last instance of unclosed in routine\",\"code\":[\"pro myAwesomePro\",\"compile_opt idl2\",\"p = plot(var var, $\",\" plot(var var\",\"end\"]}]}","code.1.unexpected-closer.spec.ts":"{\"suiteName\":\"Detects unexpected closers\",\"fileName\":\"code.1.unexpected-closer.spec.ts\",\"tests\":[{\"name\":\"finds all unexpected closers\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]},{\"name\":\"correctly processes routines and expects no errors\",\"code\":[\"Function f1\",\" if keyword_set(fclip) then begin\",\" return, 1\",\" endif\",\"end\"]}]}","code.3.after-main.spec.ts":"{\"suiteName\":\"Detects problems after main level\",\"fileName\":\"code.3.after-main.spec.ts\",\"tests\":[{\"name\":\"statements after main level\",\"code\":[\"compile_opt idl2\",\"end\",\"a = 5\"]},{\"name\":\"allow comments after main\",\"code\":[\"compile_opt idl2\",\"end\",\"; ok\"]}]}","code.6.todo.spec.ts":"{\"suiteName\":\"Detects TODO statements\",\"fileName\":\"code.6.todo.spec.ts\",\"tests\":[{\"name\":\"with basic lower-case comment\",\"code\":\"; todo: something\"},{\"name\":\"with basic upper-case comment\",\"code\":\"; todo: something\"}]}","code.7.unknown-token.spec.ts":"{\"suiteName\":\"Detects unknown tokens\",\"fileName\":\"code.7.unknown-token.spec.ts\",\"tests\":[{\"name\":\"with example in structure\",\"code\":\"a = {1+2}\"},{\"name\":\"after line continuation\",\"code\":[\"compile_opt idl2\",\"a = $ , $ ; ok\",\"42\",\"end\"]},{\"name\":\"ternary without assignment\",\"code\":\"!true ? a : b\"},{\"name\":\"comma in assignment\",\"code\":\"a = ,\"},{\"name\":\"quotes in structures 1\",\"code\":\"a = {'bad'}\"},{\"name\":\"quotes in structures 2\",\"code\":\"a = {\\\"bad\\\"}\"}]}","code.8.illegal-arrow.spec.ts":"{\"suiteName\":\"Detects illegal arrows\",\"fileName\":\"code.8.illegal-arrow.spec.ts\",\"tests\":[{\"name\":\"missing super/method\",\"code\":[\"compile_opt idl2\",\"a = b-> $\",\"method\",\"end\"]},{\"name\":\"missing method with super before\",\"code\":[\"compile_opt idl2\",\"oContainer = self->IDLitContainer:: $\",\"method\",\"end\"]}]}","code.9.illegal-comma.spec.ts":"{\"suiteName\":\"Detects illegal commas\",\"fileName\":\"code.9.illegal-comma.spec.ts\",\"tests\":[{\"name\":\"after assignment\",\"code\":\"a = ,\"},{\"name\":\"standalone\",\"code\":\",\"},{\"name\":\"in right place\",\"code\":[\"a = something()\",\",\"]},{\"name\":\"in parentheses\",\"code\":[\"a = (,)\"]},{\"name\":\"in switch\",\"code\":[\"compile_opt idl2\",\"switch a, of\",\" , !true: , \",\"endswitch\",\"end\"]},{\"name\":\"in case\",\"code\":[\"compile_opt idl2\",\"case a, of\",\" , !true: , \",\"endcase\",\"end\"]},{\"name\":\"in ternary\",\"code\":[\"a = !true ? ,'bad' : ,'still bad'\"]}]}","code.10.illegal-colon.spec.ts":"{\"suiteName\":\"Detects illegal colon\",\"fileName\":\"code.10.illegal-colon.spec.ts\",\"tests\":[{\"name\":\"standalone\",\"code\":\":\"},{\"name\":\"with reserved word in jump statement\",\"code\":\"break:\"},{\"name\":\"function call\",\"code\":\"myfunc(a:b)\"},{\"name\":\"bad array syntax\",\"code\":\"myarr(a:b)\"},{\"name\":\"ignore lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","code.11.illegal-include.spec.ts":"{\"suiteName\":\"Detects illegal include statements\",\"fileName\":\"code.11.illegal-include.spec.ts\",\"tests\":[{\"name\":\"correctly find no problems\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"}]}","code.12.reserved-var.spec.ts":"{\"suiteName\":\"Detects reserved variable names. Not all are detected as you might think and require other syntax rules to verify\",\"fileName\":\"code.12.reserved-var.spec.ts\",\"tests\":[{\"name\":\"correctly detects \\\"for\\\"\",\"code\":\"a = for\"},{\"name\":\"correctly detects \\\"foreach\\\"\",\"code\":\"a = foreach\"},{\"name\":\"correctly detects \\\"while\\\"\",\"code\":\"a = while\"},{\"name\":\"correctly detects \\\"do\\\"\",\"code\":\"a = do\"},{\"name\":\"correctly detects \\\"repeat\\\"\",\"code\":\"a = repeat\"},{\"name\":\"correctly detects \\\"until\\\"\",\"code\":\"a = until\"},{\"name\":\"correctly detects \\\"if\\\"\",\"code\":\"a = if\"},{\"name\":\"correctly detects \\\"then\\\"\",\"code\":\"a = then\"},{\"name\":\"correctly detects \\\"else\\\"\",\"code\":\"a = else\"},{\"name\":\"correctly detects \\\"switch\\\"\",\"code\":\"a = switch\"},{\"name\":\"correctly detects \\\"case\\\"\",\"code\":\"a = case\"},{\"name\":\"correctly detects \\\"of\\\"\",\"code\":\"a = of\"},{\"name\":\"correctly detects \\\"begin\\\"\",\"code\":\"a = begin\"},{\"name\":\"correctly detects \\\"end\\\"\",\"code\":\"a = end\"},{\"name\":\"correctly detects \\\"endif\\\"\",\"code\":\"a = endif\"},{\"name\":\"correctly detects \\\"endelse\\\"\",\"code\":\"a = endelse\"},{\"name\":\"correctly detects \\\"endfor\\\"\",\"code\":\"a = endfor\"},{\"name\":\"correctly detects \\\"endforeach\\\"\",\"code\":\"a = endforeach\"},{\"name\":\"correctly detects \\\"endrep\\\"\",\"code\":\"a = endrep\"},{\"name\":\"correctly detects \\\"endwhile\\\"\",\"code\":\"a = endwhile\"},{\"name\":\"correctly detects \\\"endswitch\\\"\",\"code\":\"a = endswitch\"},{\"name\":\"correctly detects \\\"endcase\\\"\",\"code\":\"a = endcase\"},{\"name\":\"correctly detects \\\"pro\\\"\",\"code\":\"a = pro\"},{\"name\":\"correctly detects \\\"function\\\"\",\"code\":\"a = function\"},{\"name\":\"correctly detects \\\"break\\\"\",\"code\":\"a = break\"},{\"name\":\"correctly detects \\\"continue\\\"\",\"code\":\"a = continue\"},{\"name\":\"correctly detects \\\"common\\\"\",\"code\":\"a = common\"},{\"name\":\"correctly detects \\\"compile_opt\\\"\",\"code\":\"a = compile_opt\"},{\"name\":\"correctly detects \\\"forward_function\\\"\",\"code\":\"a = forward_function\"},{\"name\":\"correctly detects \\\"goto\\\"\",\"code\":\"a = goto\"},{\"name\":\"correctly detects \\\"mod\\\"\",\"code\":\"a = mod\"},{\"name\":\"correctly detects \\\"not\\\"\",\"code\":\"a = not\"},{\"name\":\"correctly detects \\\"eq\\\"\",\"code\":\"a = eq\"},{\"name\":\"correctly detects \\\"ne\\\"\",\"code\":\"a = ne\"},{\"name\":\"correctly detects \\\"le\\\"\",\"code\":\"a = le\"},{\"name\":\"correctly detects \\\"lt\\\"\",\"code\":\"a = lt\"},{\"name\":\"correctly detects \\\"ge\\\"\",\"code\":\"a = ge\"},{\"name\":\"correctly detects \\\"gt\\\"\",\"code\":\"a = gt\"},{\"name\":\"correctly detects \\\"and\\\"\",\"code\":\"a = and\"},{\"name\":\"correctly detects \\\"or\\\"\",\"code\":\"a = or\"},{\"name\":\"correctly detects \\\"xor\\\"\",\"code\":\"a = xor\"},{\"name\":\"correctly detects \\\"inherits\\\"\",\"code\":\"a = inherits\"}]}","code.13.illegal-ternary.spec.ts":"{\"suiteName\":\"Detects illegal ternary operators\",\"fileName\":\"code.13.illegal-ternary.spec.ts\",\"tests\":[{\"name\":\"correctly find no problems\",\"code\":\"a = !true ? 'yes' : 'no'\"},{\"name\":\"find problem\",\"code\":\"!true ? 'yes' : 'no'\"}]}","code.14.colon-in-func.spec.ts":"{\"suiteName\":\"Detects illegal colons in functions\",\"fileName\":\"code.14.colon-in-func.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = var(0:-1)\"}]}","code.15.colon-in-func-method.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.15.colon-in-func-method.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = objOrStruct.var(0:-1)\"}]}","code.16.double-token.spec.ts":"{\"suiteName\":\"Detects two tokens next to each other\",\"fileName\":\"code.16.double-token.spec.ts\",\"tests\":[{\"name\":\"variables\",\"code\":\"procedure, var1 var2\"},{\"name\":\"functions\",\"code\":\"func1() func2()\"},{\"name\":\"operators\",\"code\":\"a + + b\"},{\"name\":\"commas\",\"code\":\"mypro,,\"},{\"name\":\"valid structures\",\"code\":\"a = {mystruct, {known:val}}\"},{\"name\":\"bad structures\",\"code\":\"a = {{known:val}}\"},{\"name\":\"ignore comments\",\"code\":[\"; first\",\";second\"]},{\"name\":\"OK separate lines\",\"code\":[\"pro1\",\"pro2\"]},{\"name\":\"All of these operators can be next to each other\",\"code\":[\"compile_opt idl2\",\"a = b && ~c && d\",\"a = b || ~c || d\",\"a = b not ~c not d\",\"a = b eq ~c eq d\",\"a = b ne ~c ne d\",\"a = b le ~c le d\",\"a = b lt ~c lt d\",\"a = b ge ~c gt d\",\"a = b gt ~c gt d\",\"a = b and ~c and d\",\"a = b or ~c or d\",\"a = b xor ~c xor d\",\"a = b.prop.prop.prop\",\"a = 42 & b = 42 & c = 42\",\"tol = (N_ELEMENTS(tolIn) eq 1) ? tolIn[0] : use_double ? 2d-12 : 1e-5\",\"end\"]},{\"name\":\"ignore template escape characters\",\"code\":[\"a = `\\\\r\\\\r\\\\n\\\\n`\"]},{\"name\":\"ignore nested function methods (caught elsewhere)\",\"code\":[\"a = var.myfunc().ohNotOk()\"]}]}","code.16.double-token.exclusions1.spec.ts":"{\"suiteName\":\"Allows these tokens next to each other\",\"fileName\":\"code.16.double-token.exclusions1.spec.ts\",\"tests\":[{\"name\":\"string literal expressions\",\"code\":\"a = `${42}${42}`\"}]}","code.17.illegal-struct.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.17.illegal-struct.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a ={{}}\"}]}","code.18.illegal-paren.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.18.illegal-paren.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = {()}\"}]}","code.19.illegal-bracket.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.19.illegal-bracket.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = {[]}\"}]}","code.20.return-vals-pro.spec.ts":"{\"suiteName\":\"Detects invalid return statements in procedures\",\"fileName\":\"code.20.return-vals-pro.spec.ts\",\"tests\":[{\"name\":\"ok in procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"ok in main\",\"code\":[\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"pro mypro::method\",\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"bad in main\",\"code\":[\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"ok with comment after return\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return ; done\",\"end\"]}]}","code.21.return-vals-func.spec.ts":"{\"suiteName\":\"Detects invalid return statements in functions (too many vals)\",\"fileName\":\"code.21.return-vals-func.spec.ts\",\"tests\":[{\"name\":\"ok\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1,2\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return,1,2\",\"end\"]},{\"name\":\"return value from function OK\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,weirdCall(1,2,3)\",\"end\"]},{\"name\":\"ok with comment after return\",\"code\":[\"function mypro\",\" compile_opt idl2\",\" return, 1 ; done\",\"end\"]}]}","code.22.return-vals-missing-func.spec.ts":"{\"suiteName\":\"Detects invalid return statements in functions (no val)\",\"fileName\":\"code.22.return-vals-missing-func.spec.ts\",\"tests\":[{\"name\":\"ok\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return\",\"end\"]}]}","code.29.reserved-pro.spec.ts":"{\"suiteName\":\"Detects reserved procedures\",\"fileName\":\"code.29.reserved-pro.spec.ts\",\"tests\":[{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro WRITEU\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.30.reserved-func.spec.ts":"{\"suiteName\":\"Detects reserved functions\",\"fileName\":\"code.30.reserved-func.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function label_region\",\" compile_opt idl2\",\" return,1\",\"end\"]}]}","code.31.return-missing.spec.ts":"{\"suiteName\":\"Detects missing return procedure in functions\",\"fileName\":\"code.31.return-missing.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok in methods\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad in methods\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.32.routines-first.spec.ts":"{\"suiteName\":\"Detects invalid tokens before routine definition\",\"fileName\":\"code.32.routines-first.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"@include\",\"\",\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"; this is OK\",\"this = wrong * 5\",\"\",\"; this is OK too\",\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"; main level\",\"something = 42\",\"end\"]}]}","code.33.unclosed-main.spec.ts":"{\"suiteName\":\"Detects missing end to main level program\",\"fileName\":\"code.33.unclosed-main.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"]},{\"name\":\"problems after end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\",\"a = 17\"]}]}","code.33.unclosed-main.notebooks.spec.ts":"{\"suiteName\":\"Detects missing end to main level program\",\"fileName\":\"code.33.unclosed-main.notebooks.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"],\"config\":{\"isNotebook\":true}},{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"a = myfunc()\"],\"config\":{\"isNotebook\":true}}]}","code.34.empty-main.spec.ts":"{\"suiteName\":\"Detects empty main level programs\",\"fileName\":\"code.34.empty-main.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"; main level\",\"compile_opt idl2\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"; main level\",\"end\"]},{\"name\":\"also problems\",\"code\":[\"\",\"end\"]}]}","code.35.after-continuation.spec.ts":"{\"suiteName\":\"Detects invalid text after line continuations\",\"fileName\":\"code.35.after-continuation.spec.ts\",\"tests\":[{\"name\":\"no problems with nothing after continuation\",\"code\":[\"compile_opt idl2\",\"something = $\",\" 5\",\"end\"]},{\"name\":\"no problems with comment\",\"code\":[\"compile_opt idl2\",\"something = $ ; ok\",\" 5\",\"end\"]},{\"name\":\"problems\",\"code\":[\"compile_opt idl2\",\"something = $ bad\",\" 5\",\"end\"]},{\"name\":\"problems, same location as previous test\",\"code\":[\"compile_opt idl2\",\"something = $ bad ; ok\",\" 5\",\"end\"]}]}","code.36.reserved-pro-method.spec.ts":"{\"suiteName\":\"Detects reserved procedure methods\",\"fileName\":\"code.36.reserved-pro-method.spec.ts\",\"tests\":[{\"name\":\"ok procedure method\",\"code\":[\"pro IDLffVideoRead::myownmethod\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure method\",\"code\":[\"pro IDLffVideoRead::Cleanup\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.37.reserved-func-method.spec.ts":"{\"suiteName\":\"Detects reserved function methods\",\"fileName\":\"code.37.reserved-func-method.spec.ts\",\"tests\":[{\"name\":\"ok function method\",\"code\":[\"function list::myownmethod\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function method\",\"code\":[\"function list::where\",\" compile_opt idl2\",\" return,1\",\"end\"]}]}","code.38.no-comp-opt.spec.ts":"{\"suiteName\":\"Detects missing compile options\",\"fileName\":\"code.38.no-comp-opt.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" return,1\",\"end\"]},{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" return\",\"end\"]},{\"name\":\"ok main\",\"code\":[\"compile_opt idl2\",\"; main level program\",\" a = 5\",\"end\"]},{\"name\":\"bad main\",\"code\":[\"; main level program\",\" a = 5\",\"end\"]}]}","code.38.no-comp-opt.notebooks.spec.ts":"{\"suiteName\":\"Detects missing compile options\",\"fileName\":\"code.38.no-comp-opt.notebooks.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" return,1\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" return\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ok main\",\"code\":[\"compile_opt idl2\",\"; main level program\",\" a = 5\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad main\",\"code\":[\"; main level program\",\" a = 5\",\"end\"],\"config\":{\"isNotebook\":true}}]}","code.39.no-idl2.spec.ts":"{\"suiteName\":\"Detects missing compile option idl2\",\"fileName\":\"code.39.no-idl2.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt hidden\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt hidden\",\" return\",\"end\"]},{\"name\":\"don't complain about idl3\",\"code\":[\"pro mypro\",\" compile_opt idl3\",\" return\",\"end\"]}]}","code.40.illegal-comp-opt.spec.ts":"{\"suiteName\":\"Detects bad compile options\",\"fileName\":\"code.40.illegal-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2, bad1\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2, bad2\",\" return\",\"end\"]}]}","code.40.illegal-comp-opt.regressions.spec.ts":"{\"suiteName\":\"Detects bad compile options (regression)\",\"fileName\":\"code.40.illegal-comp-opt.regressions.spec.ts\",\"tests\":[{\"name\":\"fine\",\"code\":[\"pro mypro\",\" compile_opt idl2, strictarrsubs\",\" return\",\"end\"]}]}","code.41.empty-comp-opt.spec.ts":"{\"suiteName\":\"Detects compile opt without options\",\"fileName\":\"code.41.empty-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt\",\" return\",\"end\"]}]}","code.42.use-idl2.spec.ts":"{\"suiteName\":\"Detects compile opt without options\",\"fileName\":\"code.42.use-idl2.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt defint32, strictarr\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt defint32, strictarr\",\" return\",\"end\"]}]}","code.43.expected-comma.spec.ts":"{\"suiteName\":\"Detects statements that do expect a comma first\",\"fileName\":\"code.43.expected-comma.spec.ts\",\"tests\":[{\"name\":\"in go to\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" goto jumper\",\"end\"]},{\"name\":\"in procedure method call\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" p = plot(/TEST)\",\" p.method abc\",\"end\"]},{\"name\":\"in procedure call\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" print something\",\"end\"]},{\"name\":\"in routine name\",\"code\":[\"pro mypro var1\",\" compile_opt idl2\",\"end\"]}]}","code.44.unexpected-comma.spec.ts":"{\"suiteName\":\"Detects statements that don't expect a comma first\",\"fileName\":\"code.44.unexpected-comma.spec.ts\",\"tests\":[{\"name\":\"verify braces are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = b[,]\",\"end\"]},{\"name\":\"verify compile_opt is caught\",\"code\":[\"pro mypro\",\" compile_opt, idl2\",\"end\"]},{\"name\":\"verify common blocks are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" common, named\",\"end\"]},{\"name\":\"verify forward function is caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" forward_function, funcy\",\"end\"]},{\"name\":\"verify function calls are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = func(,)\",\"end\"]},{\"name\":\"verify function method calls are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = b.func(,)\",\"end\"]},{\"name\":\"verify for loops are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" for, i=0,100 do print, i\",\"end\"]},{\"name\":\"verify foreach loops are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" foreach, val, arr do print, val\",\"end\"]},{\"name\":\"verify structures are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = {,name}\",\"end\"]}]}","code.45.multiple-comp-opt.spec.ts":"{\"suiteName\":\"Detects multiple compile_opt statements\",\"fileName\":\"code.45.multiple-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad main\",\"code\":[\" compile_opt idl2\",\" compile_opt idl2\",\"end\"]}]}","code.46.unclosed-quote.spec.ts":"{\"suiteName\":\"Detects unclosed quotes\",\"fileName\":\"code.46.unclosed-quote.spec.ts\",\"tests\":[{\"name\":\"ok double quote\",\"code\":[\"a = \\\"good\\\"\"]},{\"name\":\"bad double quote\",\"code\":[\"a = \\\"bad\"]},{\"name\":\"verify exclude fancy numbers\",\"code\":[\"a = \\\"0\"]},{\"name\":\"ok single quote\",\"code\":[\"a = 'good'\"]},{\"name\":\"bad single quote\",\"code\":[\"a = 'bad\"]}]}","code.47.args-first.spec.ts":"{\"suiteName\":\"Detects bad argument definitions\",\"fileName\":\"code.47.args-first.spec.ts\",\"tests\":[{\"name\":\"ok args in routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, $\",\" arg4, arg5\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"bad args in routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, $\",\" arg4, arg5, KW1 = kw1, $\",\" arg6, arg7\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok args in routine method\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, $\",\" arg4, arg5\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"bad args in routine method\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, $\",\" arg4, arg5, KW1 = kw1, $\",\" arg6, arg7\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.48.docs-missing-arg.spec.ts":"{\"suiteName\":\"Detects args missing from docs\",\"fileName\":\"code.48.docs-missing-arg.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.49.no-args-to-doc.spec.ts":"{\"suiteName\":\"Detects documented args when there are no args\",\"fileName\":\"code.49.no-args-to-doc.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod\",\" compile_opt idl2\",\"end\"]}]}","code.50.docs-missing-kw.spec.ts":"{\"suiteName\":\"Detects keywords missing from docs\",\"fileName\":\"code.50.docs-missing-kw.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]}]}","code.51.no-kws-to-doc.spec.ts":"{\"suiteName\":\"Detects documented keywords when there are no keywords\",\"fileName\":\"code.51.no-kws-to-doc.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod\",\" compile_opt idl2\",\"end\"]}]}","code.52.docs-missing-return.spec.ts":"{\"suiteName\":\"Detects documented keywords when there are no keywords\",\"fileName\":\"code.52.docs-missing-return.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Returns: number\",\";-\",\"function myfunc\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";-\",\"function myfunc\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.53.docs-invalid-in-out.spec.ts":"{\"suiteName\":\"Detects when in/out is incorrect for docs\",\"fileName\":\"code.53.docs-invalid-in-out.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: wrong, optional, type=boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.54.docs-invalid-require.spec.ts":"{\"suiteName\":\"Detects when required/optional is incorrect for docs\",\"fileName\":\"code.54.docs-invalid-require.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, WRONG, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.56.docs-invalid-private.spec.ts":"{\"suiteName\":\"Detects when private/public is incorrect for docs\",\"fileName\":\"code.56.docs-invalid-private.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, hidden\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.57.docs-too-few-params.spec.ts":"{\"suiteName\":\"Detects when not enough documentation parameters are present\",\"fileName\":\"code.57.docs-too-few-params.spec.ts\",\"tests\":[{\"name\":\"no problems for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]}]}","code.58.docs-too-many-params.spec.ts":"{\"suiteName\":\"Detects when too many documentation parameters are present\",\"fileName\":\"code.58.docs-too-many-params.spec.ts\",\"tests\":[{\"name\":\"no problems for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, private, mcScrooge\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean, public, somethingWrong\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]}]}","code.59.docs-left-align.spec.ts":"{\"suiteName\":\"Detects when docs are not left-aligned as expected\",\"fileName\":\"code.59.docs-left-align.spec.ts\",\"tests\":[{\"name\":\"no problems in params/keywords\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\"; And another line\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in params/keywords\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\"; And another line\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in other blocks\",\"code\":[\";+\",\"; First line is great\",\"; THEN CHAOS ENSUES\",\";\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems in variables\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"end\"]},{\"name\":\"problems in variables\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ;and need a big description\",\" ;-\",\" a = 42\",\"end\"]}]}","code.60.docs-return-has-no-type.spec.ts":"{\"suiteName\":\"Detects when the returns tag for docs is missing the data type\",\"fileName\":\"code.60.docs-return-has-no-type.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns:\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.61.docs-return-invalid.spec.ts":"{\"suiteName\":\"Detects when the returns tag has too much information\",\"fileName\":\"code.61.docs-return-invalid.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\"; Fun fact about zach\",\"; he is a vegetarian\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"no problem with extra spaces\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";\",\";\",\";\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.62.docs-return-not-needed.spec.ts":"{\"suiteName\":\"Detects when the returns tag is present for procedures\",\"fileName\":\"code.62.docs-return-not-needed.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\";-\",\"pro myroutine, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"pro myroutine, var1\",\" compile_opt idl2\",\"end\"]}]}","code.63.docs-not-real-param.spec.ts":"{\"suiteName\":\"Detects when a documented parameter does not exist in routine definition\",\"fileName\":\"code.63.docs-not-real-param.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem with args and keywords\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, var2, KW1=kw1, KW2=kw2\",\" compile_opt idl2\",\"end\"]},{\"name\":\"do not mistake colons in the description as parameters\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing: something else\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag: something else\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"detect in structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","code.64.pdocs-param-missing.spec.ts":"{\"suiteName\":\"Detects when a defined parameter is missing from user docs\",\"fileName\":\"code.64.pdocs-param-missing.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem with args and keywords\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\";\",\"; :Keywords:\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]}]}","code.65.string-literal-too-many-args.spec.ts":"{\"suiteName\":\"Detects when a string literal has too many arguments\",\"fileName\":\"code.65.string-literal-too-many-args.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":\"`${1.234,\\\"%10.3f\\\"}`\"},{\"name\":\"no problems - string literal in formatting\",\"code\":\"`${1.234,`%${w}.3f`}`\"},{\"name\":\"problem with too many args\",\"code\":\"`${1.234,abc,\\\"%10.3f\\\"}`\"}]}","code.66.bad-continue.spec.ts":"{\"suiteName\":\"Detects bad continue statements\",\"fileName\":\"code.66.bad-continue.spec.ts\",\"tests\":[{\"name\":\"no problems in loops\",\"code\":[\"compile_opt idl2\",\"for i=0,10 do if !true then continue\",\"foreach val, key do if !true then continue\",\"while !true do if !false then continue\",\"repeat if !true then continue until !true\",\"end\"]},{\"name\":\"problems outside of loops\",\"code\":[\"compile_opt idl2\",\"continue\",\"end\"]}]}","code.67.bad-break.spec.ts":"{\"suiteName\":\"Detects bad break statements\",\"fileName\":\"code.67.bad-break.spec.ts\",\"tests\":[{\"name\":\"no problems in loops\",\"code\":[\"compile_opt idl2\",\"for i=0,10 do if !true then break\",\"foreach val, key do if !true then break\",\"while !true do if !false then break\",\"repeat if !true then break until !true\",\"end\"]},{\"name\":\"no problems in switch\",\"code\":[\"compile_opt idl2\",\"switch a of\",\" !true: break\",\"endswitch\",\"end\"]},{\"name\":\"no problems in case\",\"code\":[\"compile_opt idl2\",\"case a of\",\" !true: break\",\"endcase\",\"end\"]},{\"name\":\"problems outside of loops\",\"code\":[\"compile_opt idl2\",\"break\",\"end\"]}]}","code.68.expected-statement.spec.ts":"{\"suiteName\":\"Detects tokens that are empty but shouldn't be\",\"fileName\":\"code.68.expected-statement.spec.ts\",\"tests\":[{\"name\":\"problem in assignment\",\"code\":[\"compile_opt idl2\",\"a = \",\"end\"]},{\"name\":\"problem in basic operators\",\"code\":[\"compile_opt idl2\",\"a = 42 +\",\"end\"]},{\"name\":\"problem in compound operator\",\"code\":[\"compile_opt idl2\",\"a *= \",\"end\"]},{\"name\":\"problem in logical operator\",\"code\":[\"compile_opt idl2\",\"a = 5 and \",\"end\"]},{\"name\":\"problem in negative sign\",\"code\":[\"compile_opt idl2\",\"a = - \",\"end\"]},{\"name\":\"problem in pointer dereference\",\"code\":[\"compile_opt idl2\",\"a = *\",\"end\"]},{\"name\":\"problem in parentheses\",\"code\":[\"compile_opt idl2\",\"a = ()\",\"end\"]},{\"name\":\"problem in for\",\"code\":[\"compile_opt idl2\",\"for\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"foreach\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"while\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"for i=0,1 do\",\"end\"]},{\"name\":\"problem in repeat\",\"code\":[\"compile_opt idl2\",\"repeat\",\"end\"]},{\"name\":\"problem in until\",\"code\":[\"compile_opt idl2\",\"repeat a = 5 until\",\"end\"]},{\"name\":\"problem in if\",\"code\":[\"compile_opt idl2\",\"if\",\"end\"]},{\"name\":\"problem in then\",\"code\":[\"compile_opt idl2\",\"if !true then\",\"end\"]},{\"name\":\"problem in else\",\"code\":[\"compile_opt idl2\",\"if !true then a = 42 else\",\"end\"]},{\"name\":\"problem in ternary then\",\"code\":[\"compile_opt idl2\",\"a = !true ?\",\"end\"]},{\"name\":\"problem in ternary else\",\"code\":[\"compile_opt idl2\",\"a = !true ? 42 :\",\"end\"]},{\"name\":\"problem in switch\",\"code\":[\"compile_opt idl2\",\"switch\",\"end\"]},{\"name\":\"problem in case\",\"code\":[\"compile_opt idl2\",\"case\",\"end\"]},{\"name\":\"problem in of for switch\",\"code\":[\"compile_opt idl2\",\"switch !true of\",\"end\"]},{\"name\":\"problem in of for case\",\"code\":[\"compile_opt idl2\",\"switch !true of\",\"end\"]}]}","code.69.unfinished-dot.spec.ts":"{\"suiteName\":\"Detects tokens that are empty but shouldn't be\",\"fileName\":\"code.69.unfinished-dot.spec.ts\",\"tests\":[{\"name\":\"as procedure-method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a.\",\"end\"]},{\"name\":\"as function method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b.\",\"end\"]},{\"name\":\"standalone 1\",\"code\":[\"compile_opt idl2\",\"a = .\",\"end\"]},{\"name\":\"standalone 2\",\"code\":[\"compile_opt idl2\",\".\",\"end\"]}]}","code.70.illegal-hex-escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"code.70.illegal-hex-escape.spec.ts\",\"tests\":[{\"name\":\"only have a problem with the last one\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"]}]}","code.71.unknown-template-escape.spec.ts":"{\"suiteName\":\"Find unknown string literal escape characters\",\"fileName\":\"code.71.unknown-template-escape.spec.ts\",\"tests\":[{\"name\":\"no problems with all good\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00`\",\"end\"]},{\"name\":\"problems with incomplete and bad ones\",\"code\":[\"compile_opt idl2\",\"a = `\\\\ `\",\"a = `\\\\a`\",\"a = `\\\\42`\",\"a = `\\\\lark \\\\r\\\\n`\",\"end\"]}]}","code.72.duplicate-arg-kw-var-def.spec.ts":"{\"suiteName\":\"Find duplicate arg and keyword variables and detect\",\"fileName\":\"code.72.duplicate-arg-kw-var-def.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"pro mypro, a, b, AKW = akw, BKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedures\",\"code\":[\"pro mypro, a, a, b, B = b, C = b\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedure methods\",\"code\":[\"pro myclass::mymethod, a, a, b, B = b, C = b\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in functions\",\"code\":[\"function myfunc, a, a, b, B = b, C = b\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problems in function methods\",\"code\":[\"function myclass::mymethod, a, a, b, B = b, C = b\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.73.duplicate-kw-def.spec.ts":"{\"suiteName\":\"Find duplicate keyword definitions\",\"fileName\":\"code.73.duplicate-kw-def.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"pro mypro, AKW = akw, BKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedures\",\"code\":[\"pro mypro, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedure methods\",\"code\":[\"pro myclass::mypro, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in functions\",\"code\":[\"function myfunc, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problems in function methods\",\"code\":[\"function myfunc::mymethod, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.74.duplicate-property.spec.ts":"{\"suiteName\":\"Find duplicate properties and find\",\"fileName\":\"code.74.duplicate-property.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = {a:a, B :b}\",\"end\"]},{\"name\":\"problems when we have them\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = {a:a, A :b}\",\"end\"]}]}","code.75.duplicate-kw-usage.spec.ts":"{\"suiteName\":\"Find keyword usage and detect problems in\",\"fileName\":\"code.75.duplicate-kw-usage.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"plot, kw1=5, KW1=5, kw1=5, /KW1\",\"end\"]},{\"name\":\"procedure methods\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a.plot, kw1=5, KW1=5, kw1=5, /KW1\",\"end\"]},{\"name\":\"functions\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = plot(kw1=5, KW1=5, kw1=5, /KW1)\",\"end\"]},{\"name\":\"function methods\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = b.plot(kw1=5, KW1=5, kw1=5, /KW1)\",\"end\"]}]}","code.76.init-method-pro.spec.ts":"{\"suiteName\":\"Check for init methods\",\"fileName\":\"code.76.init-method-pro.spec.ts\",\"tests\":[{\"name\":\"being procedures incorrectly\",\"code\":[\"pro mypro::init\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.77.unknown-structure.spec.ts":"{\"suiteName\":\"Check for structure names\",\"fileName\":\"code.77.unknown-structure.spec.ts\",\"tests\":[{\"name\":\"reported not in class definitions\",\"code\":[\"pro auto_doc_example\",\" compile_opt idl2\",\" a = {ENVIRaster2}\",\"end\"]},{\"name\":\"ignored in class definitions\",\"code\":[\"pro auto_doc_example__define\",\" compile_opt idl2\",\" a = {ENVIRaster2}\",\"end\"]}]}","code.78.illegal-chain.spec.ts":"{\"suiteName\":\"Check for bad access\",\"fileName\":\"code.78.illegal-chain.spec.ts\",\"tests\":[{\"name\":\"from function calls\",\"code\":[\"pro so_bad\",\" compile_opt idl2\",\" a = myfunc().ohNo\",\" a = myfunc().(42)\",\" myfunc().ohMeOhMy\",\" a = myfunc().ohNotOk()\",\"end\"]},{\"name\":\"from function method calls\",\"code\":[\"pro so_sad\",\" compile_opt idl2\",\" a = var.myfunc().ohNo\",\" a = var.myfunc().(42)\",\" var.myfunc().ohMeOhMy\",\" a = var.myfunc().ohNotOk()\",\"end\"]}]}","code.79.docs-missing-struct.spec.ts":"{\"suiteName\":\"Check for missing structure definitions\",\"fileName\":\"code.79.docs-missing-struct.spec.ts\",\"tests\":[{\"name\":\"from docs 1\",\"code\":[\";+\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"from docs 2\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\"; prop2:any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when no docs\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when just procedure\",\"code\":[\";+\",\";-\",\"pro pro4\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" return, 1\",\"end\"]}]}","code.80.docs-missing-prop.spec.ts":"{\"suiteName\":\"Check for missing properties\",\"fileName\":\"code.80.docs-missing-prop.spec.ts\",\"tests\":[{\"name\":\"in our docs\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","code.81.class-no-params.spec.ts":"{\"suiteName\":\"Check for args and keywords in procedure class definitions\",\"fileName\":\"code.81.class-no-params.spec.ts\",\"tests\":[{\"name\":\"with arg\",\"code\":[\"pro pro4__define, a\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"with kw\",\"code\":[\"pro pro4__define, KW = kw\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"with both\",\"code\":[\"pro pro4__define, arg, KW = kw\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok with neither\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.82.docs-prop-too-few-params.spec.ts":"{\"suiteName\":\"Not enough parameters for properties\",\"fileName\":\"code.82.docs-prop-too-few-params.spec.ts\",\"tests\":[{\"name\":\"without anything\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1:\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: \",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]},{\"name\":\"no problems\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String | number\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]}]}","code.83.docs-prop-too-many-params.spec.ts":"{\"suiteName\":\"Too many parameters for properties\",\"fileName\":\"code.83.docs-prop-too-many-params.spec.ts\",\"tests\":[{\"name\":\"with extra\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: any, bad\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String, noop\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]},{\"name\":\"no problems\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: Hash\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]}]}","code.84.illegal-subscript.spec.ts":"{\"suiteName\":\"Illegal subscript\",\"fileName\":\"code.84.illegal-subscript.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro index_problems, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\" ; for arrays\",\" a1 = arg1[*]\",\" a2 = arg1[0, 1, *]\",\" a3 = arg1[0, 1, 2]\",\" a4 = arg1[0 : -1 : 1]\",\" a5 = arg1[0, 1, *]\",\"\",\" ; for lists\",\" l1 = arg2[*]\",\" l2 = arg2[0, 1, *]\",\" l3 = arg2[0, 1, 2]\",\" l4 = arg2[0 : -1 : 1]\",\" l5 = arg2[0, 1, *]\",\"\",\" ; for hashes\",\" h1 = arg3[*]\",\" h2 = arg3[0, 1, *]\",\" h3 = arg3[0, 1, 2]\",\" h4 = arg3[0 : -1 : 1]\",\" h5 = arg3[0, 1, *]\",\"\",\" ; for ordered hashes\",\" oh1 = arg4[*]\",\" oh2 = arg4[0, 1, *]\",\" oh3 = arg4[0, 1, 2]\",\" oh4 = arg4[0 : -1 : 1]\",\" oh5 = arg4[0, 1, *]\",\"\",\" ; for dictionaries\",\" d1 = arg5[*]\",\" d2 = arg5[0, 1, *]\",\" d3 = arg5[0, 1, 2]\",\" d3 = arg5[0 : -1 : 1]\",\" d5 = arg5[0, 1, *]\",\"end\"]}]}","code.85.illegal-struct-op.spec.ts":"{\"suiteName\":\"Illegal structure\",\"fileName\":\"code.85.illegal-struct-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro struct_checks\",\"compile_opt idl2\",\"\",\"str = {a: 42}\",\"\",\"a = 1 + str\",\"\",\"b = str + {a: 42}\",\"\",\"c = str + list()\",\"\",\"d = str + hash()\",\"\",\"e = str + orderedhash()\",\"\",\"f = str + dictionary()\",\"end\"]}]}","code.86.illegal-list-op.spec.ts":"{\"suiteName\":\"Illegal list\",\"fileName\":\"code.86.illegal-list-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro list_checks\",\"compile_opt idl2\",\"\",\"a = 1 + list()\",\"\",\"b = list() + list()\",\"\",\"c = list() + hash()\",\"\",\"d = list() + orderedhash()\",\"\",\"e = list() + dictionary()\",\"end\"]}]}","code.87.illegal-hash-op.spec.ts":"{\"suiteName\":\"Illegal hash\",\"fileName\":\"code.87.illegal-hash-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro hash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + hash()\",\"\",\"b = hash() + list()\",\"\",\"c = hash() + hash()\",\"\",\"d = hash() + orderedhash()\",\"\",\"e = hash() + dictionary()\",\"end\"]}]}","code.88.illegal-ordered-hash-op.spec.ts":"{\"suiteName\":\"Illegal ordered hash\",\"fileName\":\"code.88.illegal-ordered-hash-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro orderedhash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + orderedhash()\",\"\",\"b = orderedhash() + list()\",\"\",\"c = orderedhash() + hash()\",\"\",\"d = orderedhash() + orderedhash()\",\"\",\"e = orderedhash() + dictionary()\",\"end\"]}]}","code.89.illegal-dictionary-op.spec.ts":"{\"suiteName\":\"Illegal dictionary\",\"fileName\":\"code.89.illegal-dictionary-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro dictionary_checks\",\"compile_opt idl2\",\"\",\"a = 1 + dictionary()\",\"\",\"b = dictionary() + list()\",\"\",\"c = dictionary() + hash()\",\"\",\"d = dictionary() + orderedhash()\",\"\",\"e = dictionary() + dictionary()\",\"end\"]}]}","code.90.potential-type-incompatibility.spec.ts":"{\"suiteName\":\"Potential type incompatibility in\",\"fileName\":\"code.90.potential-type-incompatibility.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"a = 1 + ENVIRaster()\",\"\",\"b = 1 + plot()\",\"end\"]},{\"name\":\"no problems with array creation\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"arr1 = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster()]\",\"arr2 = [{}, {}]\",\"end\"]},{\"name\":\"problems with array creation\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"bad1 = [ENVIRaster(), {}]\",\"bad2 = [{}, 1]\",\"end\"]}]}","code.91.illegal-index-type.spec.ts":"{\"suiteName\":\"Illegal index checks for\",\"fileName\":\"code.91.illegal-index-type.spec.ts\",\"tests\":[{\"name\":\"all types\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro index_problems, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\" ; for arrays\",\" !null = arg1[plot()]\",\" !null = arg1[1j]\",\" !null = arg1[1i]\",\" !null = arg1[1di]\",\" !null = arg1[1dj]\",\"\",\" ; for lists\",\" !null = arg2[plot()]\",\" !null = arg2[1j]\",\" !null = arg2[1i]\",\" !null = arg2[1di]\",\" !null = arg2[1dj]\",\"\",\" ; for hashes\",\" !null = arg3[plot()]\",\" !null = arg3[1j]\",\" !null = arg3[1i]\",\" !null = arg3[1di]\",\" !null = arg3[1dj]\",\"\",\" ; for ordered hashes\",\" !null = arg4[plot()]\",\" !null = arg4[1j]\",\" !null = arg4[1i]\",\" !null = arg4[1di]\",\" !null = arg4[1dj]\",\"\",\" ; for dictionaries\",\" !null = arg5[plot()]\",\" !null = arg5[1j]\",\" !null = arg5[1i]\",\" !null = arg5[1di]\",\" !null = arg5[1dj]\",\"end\"]},{\"name\":\"allow boolean since it is really a number\",\"code\":[\"pro index_problems\",\" compile_opt idl2\",\"\",\" ; for arrays\",\" display = strarr(c)\",\" i = keyword_set(!null)\",\" !null = display[i]\",\"end\"]}]}","code.92.potential-arr-type-incompatibility.spec.ts":"{\"suiteName\":\"Array data type incompatibility\",\"fileName\":\"code.92.potential-arr-type-incompatibility.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro array_incompatibility, arg1, arg4, arg5\",\" compile_opt idl2\",\"\",\" ; OK\",\" a = arg1 + arg4\",\"\",\" ; bad\",\" b = arg1 + arg4 + arg5\",\"end\"]}]}","code.93.ptr-nothing-to-de-ref.spec.ts":"{\"suiteName\":\"De-referencing noting\",\"fileName\":\"code.93.ptr-nothing-to-de-ref.spec.ts\",\"tests\":[{\"name\":\"with asterisks\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\"\",\" ; yikes\",\" a = *\",\"\",\" ; bad\",\" b = (*)\",\"end\"]}]}","code.94.ptr-de-ref-illegal.spec.ts":"{\"suiteName\":\"Pointer de-ref without pointers\",\"fileName\":\"code.94.ptr-de-ref-illegal.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; any, unable to de-reference\",\" d = *5\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"end\"]}]}","code.95.indexing-error.spec.ts":"{\"suiteName\":\"Errors for indexing\",\"fileName\":\"code.95.indexing-error.spec.ts\",\"tests\":[{\"name\":\"variables that cannot be indexed\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; a: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\"; b: in, required, ComplexNumber\",\"; Placeholder docs for argument, keyword, or property\",\"; c: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; d: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; e: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; f: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; g: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\"; h: in, required, ENVIRasterMetadata\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function allowed_to_index, a, b, c, d, e, f, g, h\",\" compile_opt idl2\",\"\",\" ; OK\",\" !null = c[0]\",\" !null = d[0]\",\" !null = e[0]\",\" !null = f[0]\",\" !null = g[0]\",\"\",\" ; also OK, though non standard IDL types\",\" !null = h[0]\",\"\",\" ; problems\",\" byte = ('s' + 1b)[0]\",\" int = ('s' + 1s)[0]\",\" uint = ('s' + 1us)[0]\",\" long = ('s' + 1l)[0]\",\" ulong = ('s' + 1ul)[0]\",\" long64 = ('s' + 1ll)[0]\",\" ulong64 = ('s' + 1ull)[0]\",\" float1 = ('s' + 1.)[0]\",\" float2 = ('s' + 1e)[0]\",\" double = ('s' + 1d)[0]\",\" biginteger = ('s' + BigInteger(5))[0]\",\" number = ('s' + a)[0]\",\" complexfloat = ('s' + 1.i)[0]\",\" complexdouble = ('s' + 1di)[0]\",\" complexdouble = ('s' + 1dj)[0]\",\" complexnumber1 = ('s' + a + 1di + 1dj)[0]\",\" complexnumber2 = (a + b)[0]\",\"\",\" return, 1\",\"end\"]}]}","code.96.ptr-de-ref-ambiguity.spec.ts":"{\"suiteName\":\"Pointer de-ref without pointers\",\"fileName\":\"code.96.ptr-de-ref-ambiguity.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; ambiguous\",\" c = *arg4\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"end\"]}]}","code.97.unknown-kw.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.spec.ts\",\"tests\":[{\"name\":\"and report errors if we dont have \\\"_extra\\\" or \\\"_ref_extra\\\"\",\"code\":[\";+\",\"; :Description:\",\"; Constructor\",\";\",\"; :Returns:\",\"; myclass\",\";\",\";-\",\"function myclass::Init\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::method, kw = kw, _ref_extra = _extra\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::method, kw = kw, _extra = _extra\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; Class definition procedure\",\";\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" struct = {myclass}\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Long\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, Byte\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro mypro, kw = kw\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"mypro, kw = a, /kw2, kw3 = 3\",\"\",\"; functions\",\"!null = myfunc(kw = b, /kw2, kw3 = 3)\",\"\",\"; make class for methods\",\"var = myclass()\",\"\",\"; procedure methods\",\"var.method, kw = c, /kw2, kw3 = 3\",\"\",\"; function methods\",\"!null = var.method(kw = d, /kw2, kw3 = 3)\",\"end\"]}]}","code.97.unknown-kw.exceptions.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions.spec.ts\",\"tests\":[{\"name\":\"and exclude these cases\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"p = plot(/tes)\",\"end\"]},{\"name\":\"unless we have extra or ref extra (only one at a time)\",\"code\":[\";+\",\"; :Keywords:\",\"; _ref_extra: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example2, _ref_extra = ex\",\" compile_opt idl2\",\"\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; _extra: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, _extra = ex\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"\",\"; OK with only extra\",\"auto_doc_example, /anything_i_want\",\"\",\"; OK with only ref extra\",\"auto_doc_example2, /anything_i_want\",\"\",\"end\"]}]}","code.97.unknown-kw.exceptions2.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions2.spec.ts\",\"tests\":[{\"name\":\"but always ignore extra and strict extra\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function auto_doc_example\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"\",\"; no error\",\"a = auto_doc_example(_extra = !null)\",\"\",\"; no error\",\"a = auto_doc_example(_strict_extra = !null)\",\"\",\"end\"]}]}","code.97.unknown-kw.exceptions3.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions3.spec.ts\",\"tests\":[{\"name\":\"but always obj_new\",\"code\":[\"; main\",\"compile_opt idl2\",\"\",\"; no error\",\"outClass = 'something'\",\"!null = OBJ_NEW(outClass, FOLD_CASE=!null))\",\"\",\"end\"]}]}","code.98.incomplete-ternary.spec.ts":"{\"suiteName\":\"Check for incomplete ternary\",\"fileName\":\"code.98.incomplete-ternary.spec.ts\",\"tests\":[{\"name\":\"operators missing the second half\",\"code\":[\"compile_opt idl2\",\"; wrong\",\"a = !true ? 5\",\"\",\"; right\",\"!null = !true ? 5 : 'yeah'\",\"\",\"; right\",\"!null = !true ? (5) : 'yeah'\",\"\",\"end\"]}]}","code.99.undefined-var.spec.ts":"{\"suiteName\":\"Detect undefined variables\",\"fileName\":\"code.99.undefined-var.spec.ts\",\"tests\":[{\"name\":\"in most places\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro undefined_without_common, a, b, c\",\" compile_opt idl2\",\"\",\" ; direct vars\",\" test1 = bad\",\"\",\" ; within child branches\",\" test2 = (ok = 5) + wrong\",\"\",\" ; as keyword\",\" test3 = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\" ; OK\",\" for i = 0, 100 do begin\",\" !null = i\",\" endfor\",\"\",\" ; item is bad\",\" foreach val, item, key do begin\",\" !null = val\",\" !null = key\",\" endforeach\",\"\",\" ; noBueno is bad\",\" noBueno->method\",\"end\"]},{\"name\":\"never define self\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function dataToMemoryRaster\",\" compile_opt idl2\",\"\",\" ; should error\",\" self = 5\",\"\",\" ; should error\",\" a = self\",\"\",\" return, 1\",\"end\"]},{\"name\":\"define self in methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::mymethod\",\" compile_opt idl2\",\"\",\" ; no error\",\" self = 5\",\"\",\" ; no error\",\" a = self\",\"\",\" return, 1\",\"end\"]},{\"name\":\"catc\",\"code\":[\"compile_opt idl2\",\"filename = filepath('qb_boulder_msi', root = nv.root_dir)\",\"end\"]}]}","code.99.undefined-var.edge-cases.spec.ts":"{\"suiteName\":\"Check unknown variables in edge cases\",\"fileName\":\"code.99.undefined-var.edge-cases.spec.ts\",\"tests\":[{\"name\":\"in keywords\",\"code\":[\"compile_opt idl2\",\"filename = filepath('qb_boulder_msi', root = nv.root_dir)\",\"end\"]},{\"name\":\"pointer value assignment\",\"code\":[\"compile_opt idl2\",\"*other = 42\",\"end\"]}]}","code.99.undefined-var.exceptions1.spec.ts":"{\"suiteName\":\"Don't check unknown keywords\",\"fileName\":\"code.99.undefined-var.exceptions1.spec.ts\",\"tests\":[{\"name\":\"in in methods that we dont know\",\"code\":[\" compile_opt idl2\",\"l = luna(/in_package)\",\"(l.expects(routine)).toRunFunction, raster, _output = output\",\"end\"]},{\"name\":\"verify we process parents before children\",\"code\":[\" compile_opt idl2\",\" item = list()\",\" ; item is bad\",\" foreach val, item, key do begin\",\" val = 5\",\" endforeach\",\"end\"]}]}","code.99.undefined-var.exceptions2.spec.ts":"{\"suiteName\":\"Without docs, keywords are least restrictive\",\"fileName\":\"code.99.undefined-var.exceptions2.spec.ts\",\"tests\":[{\"name\":\"and bidirectional\",\"code\":[\"pro unknown_kw_relaxed, kw = kw\",\"compile_opt idl2\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"unknown_kw_relaxed, kw = newVar\",\"end\"]}]}","code.99.undefined-var.exceptions3.spec.ts":"{\"suiteName\":\"Without known global, arguments are least restrictive\",\"fileName\":\"code.99.undefined-var.exceptions3.spec.ts\",\"tests\":[{\"name\":\"and bidirectional\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; data: bidirectional, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function dataToMemoryRaster, data\",\" compile_opt idl2, hidden\",\"\",\" ; make everything\",\" oSvc = obj_new('IDLcfSvcOpenMemoryRaster') ; IDLcfSvcOpenMemoryRaster()\",\" ok = oSvc.Open(memory_data = data, '', oRaster, data_type = data.typecode)\",\" ok = IDLcfGetServiceObject(!null, 'ManageRaster', oManageRaster)\",\" void = oManageRaster.ManageBands(oRaster)\",\"\",\" ; return our raster\",\" return, ENVIWrapComponent(oRaster)\",\"end\"]}]}","code.99.undefined-var.exceptions4.spec.ts":"{\"suiteName\":\"Keyword variables should be defined\",\"fileName\":\"code.99.undefined-var.exceptions4.spec.ts\",\"tests\":[{\"name\":\"and not report errors\",\"code\":[\"function bridge_it::Init, nbridges, init = init, msg = msg, logdir = logdir, nrefresh = nrefresh, prefix = prefix\",\"compile_opt idl2, hidden\",\"\",\"; check to see if different messag eneeds to be used\",\"if ~keyword_set(msg) then self.msg = 'Time to complete bridge process (sec): ' else self.msg = msg\",\"\",\"; check to see if we have a number of processes to complete before refreshing the bridges\",\"; otherwise set the refresh number to an absurbly high result!\",\"if keyword_set(nrefresh) then self.nrefresh = nrefresh else self.nrefresh = 1000000l\",\"\",\"; check if init keyword is set, if so then we want to save the init string\",\"if keyword_set(init) then self.init = strjoin(init, ' & ')\",\"\",\"; check if logdir is specified\",\"if keyword_set(logdir) then begin\",\" if file_test(logdir) then begin\",\" self.logdir = logdir\",\" endif else begin\",\" message, 'Specified LOGDIR does not exist!'\",\" endelse\",\"endif\",\"\",\"return, 1\",\"end\"]}]}","code.99.undefined-var.exceptions5.spec.ts":"{\"suiteName\":\"With lambda functions\",\"fileName\":\"code.99.undefined-var.exceptions5.spec.ts\",\"tests\":[{\"name\":\"do not extract or check variables\",\"code\":[\"; main level\",\"compile_opt idl2\",\"!null = lambda(n:n le 3 || min(n mod [2:fix(sqrt(n))]))\",\"end\"]}]}","code.99.undefined-var.exceptions6.spec.ts":"{\"suiteName\":\"With common blocks\",\"fileName\":\"code.99.undefined-var.exceptions6.spec.ts\",\"tests\":[{\"name\":\"skip the name of the common block\",\"code\":[\"; main level\",\"compile_opt idl2\",\"common theName, a1, bb, cc\",\"end\"]}]}","code.100.potential-undefined-var.spec.ts":"{\"suiteName\":\"Detect undefined variables\",\"fileName\":\"code.100.potential-undefined-var.spec.ts\",\"tests\":[{\"name\":\"when we have a common block present\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro undefined_with_common, a, b, c\",\" compile_opt idl2\",\" common\",\"\",\" ; direct vars\",\" test1 = bad\",\"\",\" ; within child branches\",\" test2 = (ok = 5) + wrong\",\"\",\" ; as keyword\",\" test3 = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\" ; OK\",\" for i = 0, 100 do begin\",\" !null = i\",\" endfor\",\"\",\" ; item is bad\",\" foreach val, item, key do begin\",\" !null = val\",\" !null = key\",\" endforeach\",\"\",\" ; noBueno is bad\",\" noBueno->method\",\"end\"]},{\"name\":\"dont add a var for the first child of a common block\",\"code\":[\"pro color_edit_back\",\"compile_opt idl2\",\"\",\"common color_edit, wxsize, wysize, r0\",\"\",\"for i = wysize - 60, wysize - 30 do tv, ramp, wxsize / 2 - 256, i\",\"\",\"cx = wxsize / 4.\",\"cy = wysize - 90. - r0\",\"\",\"a = color_edit\",\"\",\"return\",\"end\"]}]}","code.101.var-use-before-def.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.101.var-use-before-def.spec.ts\",\"tests\":[{\"name\":\"when we dont have a common-block present\",\"code\":[\"pro before_defined_no_common\",\"compile_opt idl2\",\"\",\"; problemo\",\"a = b\",\"\",\"; define\",\"b = 5\",\"\",\"; complex problem0\",\"c = d + (d = 5)\",\"\",\"; no problemo\",\"f = (g = 6) + g\",\"end\"]}]}","code.101.var-use-before-def.exceptions.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.101.var-use-before-def.exceptions.spec.ts\",\"tests\":[{\"name\":\"does not trigger anywhere\",\"code\":[\"function ReadExif::_GetName, tag, image = img, photo = pht, gps = gps, iop = iop\",\"compile_opt idl2, hidden\",\"\",\"name = ''\",\"img = keyword_set(img)\",\"pht = keyword_set(pht)\",\"gps = keyword_set(gps)\",\"iop = keyword_set(iop)\",\"\",\"; if none are set, default to all\",\"if (array_equal([img, pht, gps, iop], 0)) then begin\",\" img = (pht = (gps = (iop = 1)))\",\"endif\",\"\",\"if (iop) then begin\",\" if (self.ioptags.HasKey(tag)) then begin\",\" name = self.ioptags[tag]\",\" endif\",\"endif\",\"\",\"if (gps) then begin\",\" if (self.gpstags.HasKey(tag)) then begin\",\" name = self.gpstags[tag]\",\" endif\",\"endif\",\"\",\"if (pht) then begin\",\" if (self.phototags.HasKey(tag)) then begin\",\" name = self.phototags[tag]\",\" endif\",\"endif\",\"\",\"if (img) then begin\",\" if (self.imagetags.HasKey(tag)) then begin\",\" name = self.imagetags[tag]\",\" endif\",\"endif\",\"\",\"return, name\",\"end\"]}]}","code.102.potential-var-use-before-def.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.102.potential-var-use-before-def.spec.ts\",\"tests\":[{\"name\":\"when we dont have a common-block present\",\"code\":[\"pro before_defined_common\",\"compile_opt idl2\",\"common\",\"\",\"; problemo\",\"a = b\",\"\",\"; define\",\"b = 5\",\"\",\"; complex problem0\",\"c = d + (d = 5)\",\"\",\"; no problemo\",\"f = (g = 6) + g\",\"end\"]}]}","code.102.potential-var-use-before-def.exception.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.102.potential-var-use-before-def.exception.spec.ts\",\"tests\":[{\"name\":\"does not get triggered here\",\"code\":[\"pro IDLitVisAxis2::OnViewportChange, oDestination\",\" compile_opt idl2, hidden\",\"\",\" if (obj_valid(oDestination)) then $\",\" oDestination.GetProperty, current_zoom = zoomFactor $\",\" else $\",\" zoomFactor = 1.0\",\"\",\"end\"]}]}","code.103.ambiguous-keyword-abbreviation.spec.ts":"{\"suiteName\":\"Keywords that are abbreviated but\",\"fileName\":\"code.103.ambiguous-keyword-abbreviation.spec.ts\",\"tests\":[{\"name\":\"have multiple for auto complete\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::mymethod, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::mymethod, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\"end\",\"\",\";+\",\"; :myclass:\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" !null = {myclass}\",\"\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function auto_doc_example, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main leve program\",\"compile_opt idl2\",\"\",\"; problem 1\",\"auto_doc_example, /kw\",\"\",\"; problem 2\",\"!null = auto_doc_example(kw = 5)\",\"\",\"a = {myclass}\",\"\",\"; problem 3\",\"a.mymethod, kw = 5\",\"\",\"; problem 4\",\"!null = a.mymethod(/kw)\",\"\",\"end\"]}]}","code.103.ambiguous-keyword-abbreviation.exceptions.spec.ts":"{\"suiteName\":\"Keywords that could be abbreviated\",\"fileName\":\"code.103.ambiguous-keyword-abbreviation.exceptions.spec.ts\",\"tests\":[{\"name\":\"but have a direct match\",\"code\":[\"; main leve program\",\"compile_opt idl2\",\"\",\"; problem 1\",\"device, /close\",\"\",\"end\"]}]}","code.104.unused-var.spec.ts":"{\"suiteName\":\"Unused variable\",\"fileName\":\"code.104.unused-var.spec.ts\",\"tests\":[{\"name\":\"problems with args, kws, and vars\",\"code\":[\"function test1, a, b, kw = kw\",\" compile_opt idl2\",\" c = 5\",\" return, 1\",\"end\"]},{\"name\":\"no problems when used\",\"code\":[\"function test1, a, b, kw = kw\",\" compile_opt idl2\",\" c = 5\",\" !null = a + b + c + keyword_set(kw)\",\" return, 1\",\"end\"]}]}","code.104.unused-var.exceptions1.spec.ts":"{\"suiteName\":\"Unused variable\",\"fileName\":\"code.104.unused-var.exceptions1.spec.ts\",\"tests\":[{\"name\":\"exceptions for static references\",\"code\":[\"compile_opt idl2\",\"!null = ENVI.openRaster()\",\"end\"]}]}","code.104.unused-var.exceptions2.spec.ts":"{\"suiteName\":\"Unused var exceptions when parentheses for indexing\",\"fileName\":\"code.104.unused-var.exceptions2.spec.ts\",\"tests\":[{\"name\":\"is var\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}","code.105.illegal-var-index.spec.ts":"{\"suiteName\":\"Indexing with parentheses\",\"fileName\":\"code.105.illegal-var-index.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}","type-validation-reference.spec.ts":"{\"suiteName\":\"All the places we want to make sure we test for\",\"fileName\":\"type-validation-reference.spec.ts\",\"tests\":[{\"name\":\"type validation\",\"code\":[\";+\",\"; :Arguments:\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro validate_problems, arg3, arg4\",\" compile_opt idl3\",\"\",\" ; validation edge cases\",\" ; same variables should always have validation applied, but not always saved\",\" dup1 = arg3[arg4]\",\" dup1 = arg3[arg4]\",\"\",\" ; anything with assignment before should validate\",\" !x.charsize = arg3[arg4]\",\" !null = arg3[arg4]\",\"\",\" ; arguments and keywords\",\" a = polot1(arg3[arg4], $\",\" arg3[arg4], $\",\" thing = arg3[arg4], $\",\" thang = arg3[arg4])\",\"\",\" ; left-side of the equation\",\" arg3[arg4] = 5\",\" (arg3[arg4]) = 5\",\" (myfunc(arg3[arg4])) = 5\",\" !null = (myfunc2(arg3[arg4]))\",\" !null = (myfunc3(arg3[arg4])) + 1\",\"\",\" ; arguments\",\" a = polot2(arg3[arg4], arg3[arg4])\",\"end\"]}]}"},"auto-selected-token-tests":{"basic.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"basic.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"code\":[\"function myfunc\",\" return,1\",\"end\",\"\",\"; main level\",\"something = 42\",\"end\"],\"position\":[{\"line\":0,\"character\":0},{\"line\":3,\"character\":0}]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly identifies keywords from routine calls\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"code\":[\"; main level\",\"r = ENVIRaster(NCOLUMNS = nCols, NROWS = nrows)\",\"end\"],\"position\":[{\"line\":1,\"character\":20},{\"line\":1,\"character\":35}]}]}","proper-parent.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"proper-parent.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens with multiple parent routines\",\"code\":[\"function myfunc2\",\" compile_opt idl2\",\" a = 42\",\" return,1\",\"end\",\"\",\"function myfunc1\",\" compile_opt idl2\",\" a = 17\",\" return,1\",\"end\"],\"position\":[{\"line\":2,\"character\":2},{\"line\":8,\"character\":2}]}]}","relaxed.spec.ts":"{\"suiteName\":\"Correctly use relaxed options for hover help\",\"fileName\":\"relaxed.spec.ts\",\"tests\":[{\"name\":\"at end of assignment\",\"code\":[\"function myfunc1\",\" compile_opt idl2\",\" a = \",\" return,1\",\"end\"],\"position\":[{\"line\":2,\"character\":5},{\"line\":8,\"character\":6}]}]}","within-parent.spec.ts":"{\"suiteName\":\"Find the right token when we do/don't have anything selected\",\"fileName\":\"within-parent.spec.ts\",\"tests\":[{\"name\":\"with a branch token\",\"code\":[\"args.setData, \",\"end\"],\"position\":[{\"line\":0,\"character\":12},{\"line\":0,\"character\":13},{\"line\":0,\"character\":14},{\"line\":0,\"character\":15},{\"line\":0,\"character\":16}]}]}"},"auto-hover-help-tests":{"bracket-paren.1.spec.ts":"{\"suiteName\":\"Correctly provides hover help for\",\"fileName\":\"bracket-paren.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/hover-help/bracket_paren.pro\",\"position\":[{\"line\":14,\"character\":20},{\"line\":17,\"character\":21},{\"line\":17,\"character\":27},{\"line\":20,\"character\":20},{\"line\":23,\"character\":25},{\"line\":24,\"character\":13}]}]}","comment-regression.spec.ts":"{\"suiteName\":\"Correctly get hover help\",\"fileName\":\"comment-regression.spec.ts\",\"tests\":[{\"name\":\"for comment edge case\",\"file\":\"idl/test/hover-help/comment_regression.pro\",\"position\":[{\"line\":3,\"character\":12},{\"line\":5,\"character\":13}]}]}","docs-overrides.spec.ts":"{\"suiteName\":\"Correctly overrides doc hover help\",\"fileName\":\"docs-overrides.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/docs_overrides.pro\",\"position\":[{\"line\":3,\"character\":8},{\"line\":3,\"character\":13},{\"line\":3,\"character\":22}]}]}","docs-overrides.2.spec.ts":"{\"suiteName\":\"Correctly overrides doc hover help\",\"fileName\":\"docs-overrides.2.spec.ts\",\"tests\":[{\"name\":\"for structure properties\",\"file\":\"idl/test/hover-help/docs_overrides2.pro\",\"position\":[{\"line\":6,\"character\":11}]}]}","ex-1.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"ex-1.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/awesomerasterintersection.pro\",\"position\":[{\"line\":87,\"character\":10},{\"line\":90,\"character\":7},{\"line\":91,\"character\":25}]}]}","ex-2.spec.ts":"{\"suiteName\":\"Correctly identifies keywords from routine calls\",\"fileName\":\"ex-2.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/myfunc.pro\",\"position\":[{\"line\":24,\"character\":12},{\"line\":24,\"character\":20},{\"line\":27,\"character\":6},{\"line\":32,\"character\":6},{\"line\":40,\"character\":13}]}]}","ex-3.spec.ts":"{\"suiteName\":\"Correctly finds no information for parameters in docs but not code\",\"fileName\":\"ex-3.spec.ts\",\"tests\":[{\"name\":\"with keywords and arguments\",\"file\":\"idl/test/hover-help/only_code.pro\",\"position\":[{\"line\":26,\"character\":2},{\"line\":27,\"character\":2}]}]}","init-methods.spec.ts":"{\"suiteName\":\"Verify hover-help for\",\"fileName\":\"init-methods.spec.ts\",\"tests\":[{\"name\":\"init methods\",\"file\":\"idl/test/hover-help/init_method.pro\",\"position\":[{\"line\":13,\"character\":14},{\"line\":16,\"character\":19}]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"abbreviated keywords\",\"file\":\"idl/test/hover-help/keywords.pro\",\"position\":[{\"line\":4,\"character\":13}]}]}","literal-types.spec.ts":"{\"suiteName\":\"Correctly display help for literal types\",\"fileName\":\"literal-types.spec.ts\",\"tests\":[{\"name\":\"for numbers and strings\",\"file\":\"idl/test/hover-help/literal_types.pro\",\"position\":[{\"line\":1,\"character\":2},{\"line\":2,\"character\":2},{\"line\":3,\"character\":2},{\"line\":4,\"character\":2},{\"line\":5,\"character\":2}]}]}","no-end.spec.ts":"{\"suiteName\":\"Correctly does not provide hover help\",\"fileName\":\"no-end.spec.ts\",\"tests\":[{\"name\":\"for end tokens but does for the beginning\",\"file\":\"idl/test/hover-help/middle_functions.pro\",\"position\":[{\"line\":3,\"character\":6},{\"line\":3,\"character\":10}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly find find definition from obj new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"case 1\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":53,\"character\":12}]},{\"name\":\"case 2\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":56,\"character\":12}]},{\"name\":\"keywords\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":56,\"character\":35}]}]}","structures.spec.ts":"{\"suiteName\":\"Provide hover help for\",\"fileName\":\"structures.spec.ts\",\"tests\":[{\"name\":\"anonymous structures\",\"file\":\"idl/test/hover-help/structures.pro\",\"position\":[{\"line\":8,\"character\":10},{\"line\":9,\"character\":12},{\"line\":10,\"character\":14},{\"line\":11,\"character\":12}]}]}","structures-properties.spec.ts":"{\"suiteName\":\"Provide hover help for\",\"fileName\":\"structures-properties.spec.ts\",\"tests\":[{\"name\":\"named structure properties\",\"file\":\"idl/test/hover-help/structures2.pro\",\"position\":[{\"line\":13,\"character\":24},{\"line\":13,\"character\":34}]},{\"name\":\"anonymous structure properties\",\"file\":\"idl/test/hover-help/structures2.pro\",\"position\":[{\"line\":15,\"character\":9},{\"line\":15,\"character\":25}]}]}","syntax-errors.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"syntax-errors.spec.ts\",\"tests\":[{\"name\":\"incorrect function call\",\"file\":\"idl/test/hover-help/syntax_error.pro\",\"position\":[{\"line\":1,\"character\":8}]},{\"name\":\"the end of the function call start (regression test for crash)\",\"file\":\"idl/test/hover-help/syntax_error.pro\",\"position\":[{\"line\":1,\"character\":11}]}]}","tasks.spec.ts":"{\"suiteName\":\"Task type hover help\",\"fileName\":\"tasks.spec.ts\",\"tests\":[{\"name\":\"as regression for task type parsing and serialization\",\"file\":\"idl/test/hover-help/tasks.pro\",\"position\":[{\"line\":13,\"character\":14},{\"line\":14,\"character\":14},{\"line\":15,\"character\":14}]}]}","variables.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"variables.spec.ts\",\"tests\":[{\"name\":\"system variables\",\"file\":\"idl/test/hover-help/variables.pro\",\"position\":[{\"line\":5,\"character\":2}]}]}","type-detection.methods.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.methods.spec.ts\",\"tests\":[{\"name\":\"function method\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":10,\"character\":13}]},{\"name\":\"procedure methods\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":13,\"character\":6}]}]}","type-detection.properties.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.properties.spec.ts\",\"tests\":[{\"name\":\"first level properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":16,\"character\":16}]},{\"name\":\"secondary properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":16,\"character\":23}]},{\"name\":\"first level properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":19,\"character\":16}]},{\"name\":\"secondary properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":22,\"character\":25}]},{\"name\":\"static properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":25,\"character\":16}]},{\"name\":\"static properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":28,\"character\":22}]}]}","type-detection.methods-inheritance.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.methods-inheritance.spec.ts\",\"tests\":[{\"name\":\"function method\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":10,\"character\":13}]},{\"name\":\"procedure methods\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":13,\"character\":6}]}]}","type-detection.properties-inheritance.spec.ts":"{\"suiteName\":\"Correctly provide hover help for inheritance of\",\"fileName\":\"type-detection.properties-inheritance.spec.ts\",\"tests\":[{\"name\":\"first level properties that exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":16,\"character\":16}]},{\"name\":\"secondary properties that exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":16,\"character\":23}]},{\"name\":\"first level properties that dont exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":19,\"character\":16}]},{\"name\":\"secondary properties that dont exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":22,\"character\":25}]}]}","type-detection.sysvar.spec.ts":"{\"suiteName\":\"Correctly provide hover help for system variable\",\"fileName\":\"type-detection.sysvar.spec.ts\",\"tests\":[{\"name\":\"properties that exist\",\"file\":\"idl/test/hover-help/types_sysvar.pro\",\"position\":[{\"line\":3,\"character\":15}]},{\"name\":\"properties that don't exist\",\"file\":\"idl/test/hover-help/types_sysvar.pro\",\"position\":[{\"line\":4,\"character\":14}]}]}","type-detection.keywords.spec.ts":"{\"suiteName\":\"Correctly provide hover help for keywords\",\"fileName\":\"type-detection.keywords.spec.ts\",\"tests\":[{\"name\":\"in method calls\",\"file\":\"idl/test/hover-help/types_keywords.pro\",\"position\":[{\"line\":10,\"character\":27},{\"line\":12,\"character\":19},{\"line\":12,\"character\":27}]}]}"},"auto-token-definition-tests":{"functions.spec.ts":"{\"suiteName\":\"Correctly find function definitions\",\"fileName\":\"functions.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":11}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":61,\"character\":11}]}]}","function-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for function methods\",\"fileName\":\"function-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":17},{\"line\":85,\"character\":14}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":88,\"character\":19}]}]}","include.spec.ts":"{\"suiteName\":\"Correctly find find include\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/include_test.pro\"],\"position\":[{\"line\":4,\"character\":7}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/include_test.pro\"],\"position\":[{\"line\":7,\"character\":8}]}]}","keywords.procedures.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.procedures.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":7}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":16},{\"line\":55,\"character\":8}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":30}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":37}]}]}","keywords.procedure-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.procedure-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":16},{\"line\":76,\"character\":16}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":25},{\"line\":76,\"character\":25},{\"line\":79,\"character\":17}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":38},{\"line\":76,\"character\":38}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":45},{\"line\":76,\"character\":45}]}]}","keywords.functions.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.functions.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":15}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":24},{\"line\":61,\"character\":16}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":37}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":44}]}]}","keywords.function-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.function-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":24},{\"line\":85,\"character\":24}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":33},{\"line\":85,\"character\":33},{\"line\":88,\"character\":25}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":46},{\"line\":85,\"character\":46}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":53},{\"line\":85,\"character\":53}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly find find definition from obj new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/obj_new.pro\"],\"position\":[{\"line\":53,\"character\":12}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/obj_new.pro\"],\"position\":[{\"line\":56,\"character\":12}]}]}","procedures.spec.ts":"{\"suiteName\":\"Correctly find procedure definitions\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":6}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":55,\"character\":2}]}]}","procedure-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for procedure methods\",\"fileName\":\"procedure-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":8},{\"line\":76,\"character\":8}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":79,\"character\":6}]}]}","properties.spec.ts":"{\"suiteName\":\"Correctly find definitions for properties\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":64,\"character\":14},{\"line\":67,\"character\":14}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":70,\"character\":14}]}]}","structures.spec.ts":"{\"suiteName\":\"Correctly find definitions in structures\",\"fileName\":\"structures.spec.ts\",\"tests\":[{\"name\":\"using structure names\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":40,\"character\":9}]},{\"name\":\"using properties (inherited, ours, fake)\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":43,\"character\":19},{\"line\":43,\"character\":31},{\"line\":43,\"character\":42}]},{\"name\":\"anonymous properties\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":94,\"character\":22}]}]}","tasks.spec.ts":"{\"suiteName\":\"Correctly find definitions for task files\",\"fileName\":\"tasks.spec.ts\",\"tests\":[{\"name\":\"from ENVITask function\",\"files\":[\"idl/test/token-def/tasks.pro\",\"idl/test/token-def/atanomalydetection.task\"],\"position\":[{\"line\":2,\"character\":12}]}]}","variables.spec.ts":"{\"suiteName\":\"Correctly find definitions in structures\",\"fileName\":\"variables.spec.ts\",\"tests\":[{\"name\":\"real variables\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":46,\"character\":9}]},{\"name\":\"fake variables\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":49,\"character\":9}]}]}"},"auto-auto-complete-tests":{"bracket-paren.1.spec.ts":"{\"suiteName\":\"Correctly provides auto complete for\",\"fileName\":\"bracket-paren.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/auto-complete/bracket_paren.pro\",\"position\":[{\"line\":14,\"character\":18},{\"line\":17,\"character\":24},{\"line\":20,\"character\":17},{\"line\":23,\"character\":19},{\"line\":24,\"character\":11}]}]}","dont-complete.spec.ts":"{\"suiteName\":\"Don't do auto-complete\",\"fileName\":\"dont-complete.spec.ts\",\"tests\":[{\"name\":\"for any of these\",\"file\":\"idl/test/auto-complete/dont_complete.pro\",\"position\":[{\"line\":1,\"character\":18},{\"line\":1,\"character\":19},{\"line\":1,\"character\":34},{\"line\":6,\"character\":9},{\"line\":6,\"character\":10},{\"line\":6,\"character\":25},{\"line\":13,\"character\":13},{\"line\":16,\"character\":2},{\"line\":17,\"character\":2},{\"line\":20,\"character\":9},{\"line\":21,\"character\":9},{\"line\":22,\"character\":9},{\"line\":25,\"character\":10},{\"line\":28,\"character\":10}]}]}","executive-commands.1.spec.ts":"{\"suiteName\":\"Correctly send only executive commands\",\"fileName\":\"executive-commands.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":36,\"character\":2}]}]}","include-properties.spec.ts":"{\"suiteName\":\"Include properties\",\"fileName\":\"include-properties.spec.ts\",\"tests\":[{\"name\":\"for procedure methods with only dots\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":22,\"character\":4}]},{\"name\":\"for static properties\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":26,\"character\":15}]}]}","in-structures.1.spec.ts":"{\"suiteName\":\"Verify auto-complete in structures\",\"fileName\":\"in-structures.1.spec.ts\",\"tests\":[{\"name\":\"for properties, property completion, and normal property completion\",\"file\":\"idl/test/auto-complete/in_structures.pro\",\"position\":[{\"line\":17,\"character\":15},{\"line\":19,\"character\":22},{\"line\":21,\"character\":47}]}]}","include.spec.ts":"{\"suiteName\":\"Verify auto-complete for\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"include statements\",\"file\":\"idl/test/auto-complete/include.pro\",\"position\":[{\"line\":2,\"character\":1}]}]}","init-methods.spec.ts":"{\"suiteName\":\"Verify auto-complete for\",\"fileName\":\"init-methods.spec.ts\",\"tests\":[{\"name\":\"init methods\",\"file\":\"idl/test/auto-complete/init_method.pro\",\"position\":[{\"line\":13,\"character\":10},{\"line\":16,\"character\":18}]}]}","keywords.1.spec.ts":"{\"suiteName\":\"Correctly provides auto complete for keywords\",\"fileName\":\"keywords.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/auto-complete/keywords.pro\",\"position\":[{\"line\":4,\"character\":10},{\"line\":7,\"character\":11},{\"line\":10,\"character\":15},{\"line\":13,\"character\":13},{\"line\":16,\"character\":14}]}]}","keywords.2.spec.ts":"{\"suiteName\":\"Correctly exclude keywords\",\"fileName\":\"keywords.2.spec.ts\",\"tests\":[{\"name\":\"for these cases\",\"file\":\"idl/test/auto-complete/keywords.pro\",\"position\":[{\"line\":22,\"character\":12},{\"line\":23,\"character\":11},{\"line\":24,\"character\":9}]}]}","methods.1.spec.ts":"{\"suiteName\":\"Verify types being used for\",\"fileName\":\"methods.1.spec.ts\",\"tests\":[{\"name\":\"methods\",\"file\":\"idl/test/auto-complete/types.pro\",\"position\":[{\"line\":10,\"character\":8},{\"line\":13,\"character\":4},{\"line\":26,\"character\":12}]}]}","no-init.spec.ts":"{\"suiteName\":\"Exclude init method\",\"fileName\":\"no-init.spec.ts\",\"tests\":[{\"name\":\"for function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":7,\"character\":12}]}]}","no-paren.spec.ts":"{\"suiteName\":\"Exclude parentheses\",\"fileName\":\"no-paren.spec.ts\",\"tests\":[{\"name\":\"for functions and function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":10,\"character\":9},{\"line\":11,\"character\":12},{\"line\":12,\"character\":14}]}]}","no-properties.spec.ts":"{\"suiteName\":\"Exclude properties\",\"fileName\":\"no-properties.spec.ts\",\"tests\":[{\"name\":\"for function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":18,\"character\":12},{\"line\":19,\"character\":14}]},{\"name\":\"for procedure method\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":23,\"character\":7}]}]}","no-variables.spec.ts":"{\"suiteName\":\"Exclude variables\",\"fileName\":\"no-variables.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":15,\"character\":9}]}]}","procedures.1.spec.ts":"{\"suiteName\":\"When in procedure, send procedure tokens\",\"fileName\":\"procedures.1.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"file\":\"idl/test/auto-complete/procedures.pro\",\"position\":[{\"line\":4,\"character\":2}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly return auto-complete from obj-new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"real\",\"file\":\"idl/test/auto-complete/obj_new.pro\",\"position\":[{\"line\":53,\"character\":26}]},{\"name\":\"fake\",\"file\":\"idl/test/auto-complete/obj_new.pro\",\"position\":[{\"line\":56,\"character\":29}]}]}","procedures.spec.ts":"{\"suiteName\":\"Procedures\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"including user and variables\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":2,\"character\":0}]}]}","properties.1.spec.ts":"{\"suiteName\":\"Verify types being used for\",\"fileName\":\"properties.1.spec.ts\",\"tests\":[{\"name\":\"properties\",\"file\":\"idl/test/auto-complete/types.pro\",\"position\":[{\"line\":16,\"character\":15},{\"line\":19,\"character\":21},{\"line\":19,\"character\":21}]}]}","regression.1.spec.ts":"{\"suiteName\":\"Regression tests\",\"fileName\":\"regression.1.spec.ts\",\"tests\":[{\"name\":\"for problems\",\"file\":\"idl/test/auto-complete/regression1.pro\",\"position\":[{\"line\":2,\"character\":28}]}]}","structures-anonymous.spec.ts":"{\"suiteName\":\"Structures\",\"fileName\":\"structures-anonymous.spec.ts\",\"tests\":[{\"name\":\"without a name\",\"file\":\"idl/test/auto-complete/structures.pro\",\"position\":[{\"line\":8,\"character\":12},{\"line\":9,\"character\":14},{\"line\":10,\"character\":21}]},{\"name\":\"auto-complete for structure names\",\"file\":\"idl/test/auto-complete/structures.pro\",\"position\":[{\"line\":13,\"character\":11},{\"line\":14,\"character\":14}]}]}","tasks.functions.spec.ts":"{\"suiteName\":\"Task auto complete\",\"fileName\":\"tasks.functions.spec.ts\",\"tests\":[{\"name\":\"to make sure they look nice\",\"file\":\"idl/test/auto-complete/task_functions.pro\",\"position\":[{\"line\":3,\"character\":8}],\"startsWith\":\"ENVITask\"}]}","tasks.properties.spec.ts":"{\"suiteName\":\"Task auto complete\",\"fileName\":\"tasks.properties.spec.ts\",\"tests\":[{\"name\":\"as regression for task type parsing\",\"file\":\"idl/test/auto-complete/tasks.pro\",\"position\":[{\"line\":13,\"character\":4},{\"line\":14,\"character\":4},{\"line\":15,\"character\":4}]}]}","method-regression.spec.ts":"{\"suiteName\":\"Methods\",\"fileName\":\"method-regression.spec.ts\",\"tests\":[{\"name\":\"inside the paren showing variables\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":10,\"character\":10},{\"line\":11,\"character\":13},{\"line\":12,\"character\":15}]}]}","system-variables.1.spec.ts":"{\"suiteName\":\"Correctly send only system variables\",\"fileName\":\"system-variables.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":29,\"character\":3},{\"line\":30,\"character\":9}]}]}","variables.1.spec.ts":"{\"suiteName\":\"Correctly finds the right variables\",\"fileName\":\"variables.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/variables.pro\",\"position\":[{\"line\":6,\"character\":10},{\"line\":9,\"character\":2}]}]}"},"auto-local-global-scope-compile-types-tests":{"all-docs-work-right.spec.ts":"{\"suiteName\":\"Correctly gets docs and variables\",\"fileName\":\"all-docs-work-right.spec.ts\",\"tests\":[{\"name\":\"for a routine\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\" ;+ awesome variable with docs\",\" a = 42\",\" ;+\",\" ; Big comment block here\",\" ; like a great code writer\",\" ;-\",\" b = 42\",\"end\",\"\"]}]}","common.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"common.spec.ts\",\"tests\":[{\"name\":\"common, excluding the first of the common block\",\"code\":[\"pro color_edit_back\",\"compile_opt idl2\",\"\",\"common color_edit, wxsize, wysize, r0\",\"end\"]}]}","complex-docs-example1.spec.ts":"{\"suiteName\":\"Complex real world test\",\"fileName\":\"complex-docs-example1.spec.ts\",\"tests\":[{\"name\":\"with past failure in complex docs\",\"code\":[\";h+\",\"; Copyright (c) 2018 Harris Geospatial Solutions, Inc.\",\"; \",\"; Licensed under MIT. See LICENSE.txt for additional details and information.\",\";h-\",\"\",\"\",\"\",\";+\",\"; :Description:\",\"; Tool for determining the intersection between two rasters based on their\",\"; spatial reference and spatial extent. Both rasters will also contain only\",\"; the valid pixels from each scene for analysis. In other words, if a pixel\",\"; is `off` in the first image and not the second, it will be turned `off` in\",\"; each of the output rasters for consistency. If one of the rasters does not\",\"; have a data ignore value, then a pixel state mask is automatically generated\",\"; so that you can mask the output rasters if needed.\",\"; \",\"; The pixel size of the output rasters will be the smallest x and y\",\"; pixel size from each raster.\",\";\",\";\",\";\",\"; :Examples:\",\"; ```idl\",\"; ;start ENVI\",\"; e = envi(/HEADLESS)\",\"; \",\"; ;make sure we have access to our ENVI tasks\",\"; awesomeENVIAlgorithms, /INIT\",\"; \",\"; ;specify two rasters to process\",\"; raster1 = e.openRaster(file1)\",\"; raster2 = e.openRaster(file2)\",\"; \",\"; ;get our task\",\"; task = ENVITask('AwesomeRasterIntersection')\",\"; task.INPUT_RASTER1 = raster1\",\"; task.INPUT_RASTER2 = raster2\",\"; task.execute\",\"; \",\"; ;print our output locations\",\"; print, task.OUTPUT_RASTER1_URI\",\"; print, task.OUTPUT_RASTER2_URI\",\"; ```\",\";\",\"; :Keywords:\",\"; DEBUG: in, optional, type=boolean, private\",\"; If set, errors are stopped on.\",\"; DATA_IGNORE_VALUE: in, optional, type=number\",\"; If one or both of your input rasters do not have\",\"; a data ignore value metadata item, you can specify\",\"; GENERATE_PIXEL_STATE_MASK: in, optional, type=boolean\",\"; If set, then an addititonal output raster is created\",\"; that represents which pixels can be processed or not.\",\"; \",\"; This will automatically be generated if one of the input\",\"; images does not have a data ignore value.\",\"; INPUT_RASTER1: in, required, type=ENVIRaster\",\"; Specify the first raster to use for intersection.\",\"; INPUT_RASTER2: in, required, type=ENVIRaster\",\"; Specify the second raster to use for intersection\",\"; OUTPUT_GRID_DEFINITION: out, optional, type=ENVIGridDefinition\",\"; Optionally return the ENVIGridDefinition object used to get the intersection\",\"; of the two scenes.\",\"; OUTPUT_RASTER1_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the first intersect raster.\",\"; OUTPUT_RASTER2_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the second intersect raster.\",\"; OUTPUT_MASK_RASTER_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the pixel state mask. Only applies\",\"; when `GENERATE_PIXEL_STATE_MASK` is set or one of the \",\"; input rasters does not have a data ignore value.\",\"; RESAMPLING: in, optional, type=string\",\"; Optionally return the ENVIGridDefinition object used to get the intersection\",\"; of the two scenes. Specify one of the following options:\",\"; - Nearest Neighbor\",\"; - Bilinear\",\"; - Cubic Convolution\",\";\",\"; :Tooltip:\",\"; Calculates the intersection of two rasters such that both\",\"; have the same spatial extent and spatial dimensions\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";-\",\"pro awesomeRasterIntersection, $\",\" DEBUG = debug,$\",\" DATA_IGNORE_VALUE = data_ignore_value,$\",\" GENERATE_PIXEL_STATE_MASK = generate_pixel_state_mask,$\",\" INPUT_RASTER1 = input_raster1,$\",\" INPUT_RASTER2 = input_raster2,$\",\" OUTPUT_MASK_RASTER_URI = output_mask_raster_uri,$\",\" OUTPUT_GRID_DEFINITION = output_grid_definition,$\",\" OUTPUT_RASTER1_URI = output_raster1_uri,$\",\" OUTPUT_RASTER2_URI = output_raster2_uri,$\",\" RESAMPLING = resampling\",\" compile_opt idl2, hidden\",\"end\",\"\"]}]}","complex-docs-example2.spec.ts":"{\"suiteName\":\"Complex real world test\",\"fileName\":\"complex-docs-example2.spec.ts\",\"tests\":[{\"name\":\"with past failure in complex docs\",\"code\":[\";+\",\"; :Description:\",\"; Function which will initialize the bdige_it object and start all bridges. When bridges are initialized\",\"; they are done so in parallel, but whe function will not return until every bridge is idle again.\",\";\",\"; :Params:\",\"; nbridges: in, required, type=int\",\"; The number of bridges that you want to create\",\";\",\"; :Keywords:\",\"; INIT : in, optional, type=strarr\",\"; Optional argument which allows you to pass in a string array of extra commands\",\"; to have each IDL_IDLBridge object execute upon creation.\",\"; MSG : in, optional, type=string\",\"; Optional argument to show the message prefix when a bridge process has completed for the TIME\",\"; keyword in bridge_it::run and bridge_it::run().\",\"; LOGDIR : in, optional, type=string\",\"; Specify the directory that the log file will be written to. The log file is just a text file with\",\"; all of the IDL Console output from each child process.\",\"; NREFRESH : in, optional, type=long\",\"; Specify the number of bridge processes to execute before closing and re-starting the\",\"; child process. Necessary for some ENVI routines so that we don't have memory fragmentation\",\"; regarding opening lots of small rasters.\",\"; PREFIX : in, optional, type=string, default='_KW_'\",\"; This optional keyword specifies the prefix which is used to differentiate between arguments and\",\"; keywords when it comes time to parse the arguments and keyword that will be passed into a routine.\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";\",\";-\",\"function bridge_it::Init, nbridges, INIT = init, MSG = msg, LOGDIR = logdir, NREFRESH = nrefresh, PREFIX = prefix\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" return, 1\",\"end\"]}]}","document-vars.spec.ts":"{\"suiteName\":\"Correctly extract docs for\",\"fileName\":\"document-vars.spec.ts\",\"tests\":[{\"name\":\"variables with single-line block\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+ meaning of life\",\" a = 42\",\"end\"]},{\"name\":\"variables with multi-line block\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"end\"]},{\"name\":\"only use docs from first encounter\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"\",\" ;+ second docs are ignored\",\" a = 42\",\"end\"]}]}","functions.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"functions.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":[\"function myfunc, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\"]}]}","function-methods.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"function-methods.spec.ts\",\"tests\":[{\"name\":\"function methods\",\"code\":[\"function myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\"]}]}","function-methods.init.spec.ts":"{\"suiteName\":\"Add function for\",\"fileName\":\"function-methods.init.spec.ts\",\"tests\":[{\"name\":\"class init methods\",\"code\":[\"function MyClass::init, a, b, c, kw2 = kw2\",\" compile_opt idl2\",\"\",\" ; set data type correctly for local variable\",\" z = MyClass()\",\"\",\" return, 1\",\"end\"]}]}","inherit-args-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-args-docs.spec.ts\",\"tests\":[{\"name\":\"arguments\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\";-\",\"pro mypro, var1\",\" compile_opt idl2\",\"end\",\"\"]}]}","inherit-kw-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-kw-docs.spec.ts\",\"tests\":[{\"name\":\"keywords\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, KW1=kw1\",\" compile_opt idl2\",\"end\",\"\"]}]}","inherit-private-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-private-docs.spec.ts\",\"tests\":[{\"name\":\"private\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean, private\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, KW1=kw1\",\" compile_opt idl2\",\"end\",\"\"]}]}","lambda.no-vars.spec.ts":"{\"suiteName\":\"With lambda functions\",\"fileName\":\"lambda.no-vars.spec.ts\",\"tests\":[{\"name\":\"do not extract variables\",\"code\":[\"; main level\",\"compile_opt idl2\",\"!null = lambda(n:n le 3 || min(n mod [2:fix(sqrt(n))]))\",\"end\"]}]}","main.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"main.spec.ts\",\"tests\":[{\"name\":\"main level\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"mypro, a, b, c, d\",\"end\"]}]}","notebook-parse.compile-opt.1.spec.ts":"{\"suiteName\":\"Verify notebook parsing\",\"fileName\":\"notebook-parse.compile-opt.1.spec.ts\",\"tests\":[{\"name\":\"adds compile-opt idl2 for main and gets right default type\",\"code\":[\"a = 42\",\"\",\"end\"],\"config\":{\"isNotebook\":true}}]}","notebook-parse.compile-opt.exceptions.spec.ts":"{\"suiteName\":\"Verify notebook parsing\",\"fileName\":\"notebook-parse.compile-opt.exceptions.spec.ts\",\"tests\":[{\"name\":\"ignores compile opt idl2 for procedures\",\"code\":[\"pro myPro\",\" print, 'Hello world'\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ignores compile opt idl2 for functions\",\"code\":[\"function myPro\",\" print, 'Hello world'\",\" return 42\",\"end\"],\"config\":{\"isNotebook\":true}}]}","only-from-code.spec.ts":"{\"suiteName\":\"Only use code for docs\",\"fileName\":\"only-from-code.spec.ts\",\"tests\":[{\"name\":\"and exclude incorrectly documented parameters\",\"code\":[\";+\",\"; Header\",\";\",\"; :Args:\",\"; a: in, required, int\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; b: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; :Keywords:\",\"; kw1: in, required, int\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; kw2: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\";\",\"; :Author: Meeeeeeeeeeeeeeeeeee\",\"\",\"\",\"\",\"\",\"pro myPro, a, kw1 = kw1\",\"\",\"\",\" print, 'Hello world'\",\"\",\"\",\"end\"]}]}","parse-fast.ignore-docs.1.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.1.spec.ts\",\"tests\":[{\"name\":\"for structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: Long\",\"; Placeholder docs for argument or keyword\",\"; prop2: ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"full\":false}}]}","parse-fast.ignore-docs.2.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.2.spec.ts\",\"tests\":[{\"name\":\"for procedures\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5, KW1 = kw1\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"full\":false}}]}","parse-fast.ignore-docs.3.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.3.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, arg1, arg2, arg3, arg4, arg5, KW1 = kw1\",\" compile_opt idl3\",\" return, 42\",\"end\"],\"config\":{\"full\":false}}]}","populate-structures.1.spec.ts":"{\"suiteName\":\"Correctly populate structures\",\"fileName\":\"populate-structures.1.spec.ts\",\"tests\":[{\"name\":\"in class definitions\",\"code\":[\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"end\"]},{\"name\":\"with no properties\",\"code\":[\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct}\",\"end\"]}]}","populate-structures.2.spec.ts":"{\"suiteName\":\"Use docs for property types\",\"fileName\":\"populate-structures.2.spec.ts\",\"tests\":[{\"name\":\"in structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: Long\",\"; Placeholder docs for argument or keyword\",\"; prop2: ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","populate-structures.3.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.3.spec.ts\",\"tests\":[{\"name\":\"normal procedures\",\"code\":[\"pro define_these_structures\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"end\"]}]}","populate-structures.4.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.4.spec.ts\",\"tests\":[{\"name\":\"normal functions\",\"code\":[\"function define_these_structures\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"return, 1\",\"end\"]}]}","populate-structures.5.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.5.spec.ts\",\"tests\":[{\"name\":\"procedure methods\",\"code\":[\"pro define_these_structures::method\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"end\"]}]}","populate-structures.6.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.6.spec.ts\",\"tests\":[{\"name\":\"function methods\",\"code\":[\"function define_these_structures::method\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"return, 1\",\"end\"]}]}","populate-structures.7.spec.ts":"{\"suiteName\":\"Ignore them in\",\"fileName\":\"populate-structures.7.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"if ~_exists then defsysv, '!notebook_magic', {IDLNotebookMagic}\",\"\",\"end\"]},{\"name\":\"as nested properties\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"!null = {OtherStruct, prop:{SecondOtherStruct}}\",\"\",\"end\"]}]}","populate-structures.8.spec.ts":"{\"suiteName\":\"Take first instance we encounter\",\"fileName\":\"populate-structures.8.spec.ts\",\"tests\":[{\"name\":\"with non-full parse\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"if ~_exists then defsysv, '!notebook_magic', {WAVFILEHEADER}\",\"\",\"end\"],\"config\":{\"full\":false}}]}","procedures.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","procedure-methods.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"procedure-methods.spec.ts\",\"tests\":[{\"name\":\"procedure methods\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","tasks.from-docs.spec.ts":"{\"suiteName\":\"Verify type parsing for\",\"fileName\":\"tasks.from-docs.spec.ts\",\"tests\":[{\"name\":\"ENVI and IDL Tasks in docs\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\"end\"]}]}","tasks.guessing-from-code.spec.ts":"{\"suiteName\":\"Verify behaviors for task types\",\"fileName\":\"tasks.guessing-from-code.spec.ts\",\"tests\":[{\"name\":\"where we determine types from code\",\"code\":[\"compile_opt idl2\",\"\",\"mosaic1 = ENVITask('BuildMosaicRaster')\",\"mosaic2 = ENVITask(routine_dir() + 'buildmosaicraster.task')\",\"\",\"uri = 'buildmosaicraster.task'\",\"mosaic3 = ENVITask(uri)\",\"\",\"envitaskany1 = ENVITask(uri + uri)\",\"\",\"idlmosaic1 = IDLTask('BuildMosaicRaster')\",\"idlmosaic2 = IDLTask(routine_dir() + 'buildmosaicraster.task')\",\"\",\"idlmosaic3 = IDLTask(uri)\",\"\",\"idltaskany1 = IDLTask(uri + uri)\",\"end\"]}]}","types.from-args.spec.ts":"{\"suiteName\":\"Types from output arguments\",\"fileName\":\"types.from-args.spec.ts\",\"tests\":[{\"name\":\"and exclude incorrectly documented parameters\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, a, b, c\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"auto_doc_example, arg1, arg2, arg3\",\"end\"]}]}","types.from-assignment-weird.spec.ts":"{\"suiteName\":\"Types from assignment\",\"fileName\":\"types.from-assignment-weird.spec.ts\",\"tests\":[{\"name\":\"where we define vars in-line\",\"code\":[\"; main level\",\"compile_opt idl2\",\"\",\"; any because using var before defined\",\"c = d + (d = 5)\",\"\",\"; number\",\"f = (g = 6) + g\",\"end\"]}]}","types.arrays.brackets.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.arrays.brackets.spec.ts\",\"tests\":[{\"name\":\"array creation using brackets\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\"\",\" ; long\",\" a = [1, 2, 3, 4]\",\"\",\" ; float\",\" b = [1, 2, 3, 4.]\",\"\",\" ; double\",\" c = [1, 2, 3, 4d]\",\"\",\" ; complex double\",\" d = [1, 2, 3, 4di]\",\"\",\" ; invalid\",\" e = [1, 2, 3, plot()]\",\"\",\" ; ignore if element has Null\",\" f = [1, 2, 3, !null, 4, 5]\",\"\",\" ; no nested arrays, just promoted\",\" g = [1, 2, 3, [1, 2, 3, 4d], 4, 5]\",\"\",\" ; array of lists\",\" h = [list(), list()]\",\"\",\" ; array of ENVIRasters\",\" i = [ENVIRaster(), ENVIRaster()]\",\"\",\" ; array of any\",\" j = [ENVIRaster(), plot()]\",\"end\"]}]}","types.arrays.edge-cases.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.arrays.edge-cases.spec.ts\",\"tests\":[{\"name\":\"array creation using edge cases that failed\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\"\",\" ; array of number\",\" a = [where(x)]\",\"end\"]},{\"name\":\"scalars or arrays can be used interchangeably\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\" e = envi()\",\" r = e.openRaster() ; scalar or array ENVIRaster\",\" ; array of ENVIRaster\",\" arr = [r]\",\"end\"]},{\"name\":\"allow all objects as long as no structures or all structures\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\" arr1 = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster()]\",\" arr2 = [{}, {}]\",\"\",\" bad = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster(), {}, 1]\",\"end\"]}]}","types.array-promotion.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.array-promotion.spec.ts\",\"tests\":[{\"name\":\"array promotion\",\"code\":[\";+\",\"; :Returns: ArrayPromotion\",\";\",\"; :Arguments:\",\"; a: bidirectional, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function test, a\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; scalars\",\"scalar1 = test(1)\",\"\",\"; arrays\",\"array1 = test([1])\",\"array2 = test(bytarr(5))\",\"\",\"; either scalar or array\",\"c = made_up()\",\"either = test(c)\",\"\",\"end\"]}]}","types.from-foreach.spec.ts":"{\"suiteName\":\"Types from foreach loop\",\"fileName\":\"types.from-foreach.spec.ts\",\"tests\":[{\"name\":\"with type args 1\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with type args 2\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with non-index types returning original 1\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, String\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with non-index types returning original 2\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]}]}","types.from-foreach.regression1.spec.ts":"{\"suiteName\":\"Types from foreach loop regression tests\",\"fileName\":\"types.from-foreach.regression1.spec.ts\",\"tests\":[{\"name\":\"with bad syntax\",\"code\":[\"pro \",\";+\",\"; :Arguments:\",\"; item: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]}]}","types.from-functions.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-functions.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVISubsetRaster()\",\"\",\" b = ENVITask('subsetraster')\",\"\",\" c = obj_new('envitask')\",\"\",\" d = keyword_set(5)\",\"\",\" e = dictionary()\",\"\",\" f = ENVITensorFlowModel()\",\"\",\" g = IDLTask('MyTask')\",\"\",\"end\"]},{\"name\":\"functions with other strings\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVITask(\\\"subsetraster\\\")\",\"\",\" b = ENVITask(`subsetraster`)\",\"\",\" c = obj_new(\\\"envitask\\\")\",\"\",\" d = obj_new(`envitask`)\",\"\",\" e = IDLTask(\\\"MyTask\\\")\",\"\",\" f = IDLTask(`MyTask`)\",\"\",\"end\"]}]}","types.from-numbers.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers.spec.ts\",\"tests\":[{\"name\":\"numbers\",\"code\":[\"pro pro4\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0b\",\"byte2 = 0ub\",\"\",\"; integer\",\"int1 = 0s\",\"\",\"; compile option\",\"compOptLong = 0\",\"\",\"; uint\",\"uint1 = 0u\",\"uint2 = 0us\",\"\",\"; long\",\"long1 = 0l\",\"\",\"; ulong\",\"ulong1 = 0ul\",\"\",\"; long64\",\"long641 = 0ll\",\"\",\"; ulong64\",\"ulong641 = 0ull\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"\",\"; double\",\"double0 = 1d\",\"double1 = 1.d\",\"double2 = .1d\",\"double3 = 1.1d\",\"double4 = 10d\",\"double5 = 10d5\",\"double6 = 10.d-3\",\"double7 = .1d+12\",\"double8 = 2.3d12\",\"\",\"; binary\",\"binary1 = '10101'b\",\"binary2 = \\\"10101\\\"b\",\"\",\"; hex\",\"hex1 = '10101'x\",\"hex2 = '7FFF'XS\",\"hex3 = '8FFF'XS\",\"hex4 = \\\"10101\\\"x\",\"hex5 = 0x\",\"hex6 = 0x7FFF\",\"\",\"; octal\",\"octal1 = \\\"36\",\"octal2 = \\\"36b\",\"octal3 = \\\"345ull\",\"octal4 = '10101'o\",\"octal5 = \\\"10101\\\"o\",\"octal6 = 0o\",\"octal7 = 0o7FFF\",\"end\"]},{\"name\":\"numbers with no compile opt\",\"code\":[\"pro pro1\",\"compile_opt\",\"; compile option\",\"compOptInt = 0\",\"end\"]},{\"name\":\"numbers with float64 compile opt\",\"code\":[\"pro pro2\",\"compile_opt float64\",\"; compile option\",\"compOptDouble = 0\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"end\"]},{\"name\":\"numbers with idl3 compile opt\",\"code\":[\"pro pro3\",\"compile_opt idl3\",\"; compile option\",\"compOptDouble = 0\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"end\"]}]}","types.from-numbers-complex1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers-complex1.spec.ts\",\"tests\":[{\"name\":\"complex numbers using \\\"i\\\"\",\"code\":[\"pro pro5\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0bi\",\"byte2 = 0ubi\",\"\",\"; integer\",\"int1 = 0si\",\"\",\"; compile option\",\"compOptLong = 0i\",\"\",\"; uint\",\"uint1 = 0ui\",\"uint2 = 0usi\",\"\",\"; long\",\"long1 = 0li\",\"\",\"; ulong\",\"ulong1 = 0uli\",\"\",\"; long64\",\"long641 = 0lli\",\"\",\"; ulong64\",\"ulong641 = 0ulli\",\"\",\"; float\",\"float1 = 1.i\",\"float2 = .1i\",\"float3 = 1.1i\",\"float4 = 10ei\",\"float5 = 10e5i\",\"float6 = 10.e-3i\",\"float7 = .1e+12i\",\"float8 = 2.3e12i\",\"\",\"; double\",\"double0 = 1di\",\"double1 = 1.di\",\"double2 = .1di\",\"double3 = 1.1di\",\"double4 = 10di\",\"double5 = 10d5i\",\"double6 = 10.d-3i\",\"double7 = .1d+12i\",\"double8 = 2.3d12i\",\"end\"]}]}","types.from-numbers-complex2.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers-complex2.spec.ts\",\"tests\":[{\"name\":\"complex numbers using \\\"j\\\"\",\"code\":[\"pro pro6\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0bj\",\"byte2 = 0ubj\",\"\",\"; jnteger\",\"jnt1 = 0sj\",\"\",\"; compjle optjon\",\"compOptLong = 0j\",\"\",\"; ujnt\",\"ujnt1 = 0uj\",\"ujnt2 = 0usj\",\"\",\"; long\",\"long1 = 0lj\",\"\",\"; ulong\",\"ulong1 = 0ulj\",\"\",\"; long64\",\"long641 = 0llj\",\"\",\"; ulong64\",\"ulong641 = 0ullj\",\"\",\"; float\",\"float1 = 1.j\",\"float2 = .1j\",\"float3 = 1.1j\",\"float4 = 10ej\",\"float5 = 10e5j\",\"float6 = 10.e-3j\",\"float7 = .1e+12j\",\"float8 = 2.3e12j\",\"\",\"; double\",\"double0 = 1dj\",\"double1 = 1.dj\",\"double2 = .1dj\",\"double3 = 1.1dj\",\"double4 = 10dj\",\"double5 = 10d5j\",\"double6 = 10.d-3j\",\"double7 = .1d+12j\",\"double8 = 2.3d12j\",\"end\"]}]}","types.from-properties.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-properties.spec.ts\",\"tests\":[{\"name\":\"properties\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4, a\",\" compile_opt idl2\",\"\",\" ; properties\",\" p1 = a.metadata\",\" p2 = p1.count\",\" p3 = (a.metadata)\",\" p4 = a.metadata.count\",\"end\"]}]}","types.from-properties2.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-properties2.spec.ts\",\"tests\":[{\"name\":\"properties of anonymous structures\",\"code\":[\"pro pro4\",\" compile_opt idl2\",\" a = {a: 'string', $\",\" b: `string`}\",\"\",\" ; properties\",\" p1 = a.a\",\" p2 = p1.length\",\" p3 = (a.b)\",\" p4 = a.b\",\"end\"]}]}","types.from-type-of-arg.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-type-of-arg.spec.ts\",\"tests\":[{\"name\":\"type-of-arg case without args (default to first)\",\"code\":[\";+\",\"; :Returns: TypeOfArg\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case specifying arg\",\"code\":[\";+\",\"; :Returns: TypeOfArg<0>\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case invalid arg uses any\",\"code\":[\";+\",\"; :Returns: TypeOfArg<2>\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case non-number index\",\"code\":[\";+\",\"; :Returns: TypeOfArg\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]}]}","types.from-type-args.edge-cases1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-type-args.edge-cases1.spec.ts\",\"tests\":[{\"name\":\"type without type args\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, List<>\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\"end\"]}]}","types.indexing.arrays.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.arrays.spec.ts\",\"tests\":[{\"name\":\"indexing arrays\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro arrays, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.dictionaries.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.dictionaries.spec.ts\",\"tests\":[{\"name\":\"dictionaries\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro dictionaries, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.hashes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.hashes.spec.ts\",\"tests\":[{\"name\":\"hashes\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro34, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.lists.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.lists.spec.ts\",\"tests\":[{\"name\":\"lists\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro lists, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.ordered-hashes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.ordered-hashes.spec.ts\",\"tests\":[{\"name\":\"ordered hashes\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro ordered_hashes, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.properties.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.properties.spec.ts\",\"tests\":[{\"name\":\"property indexing\",\"code\":[\"pro mypro1\",\" compile_opt idl2\",\" ; number or array of numbers\",\" index = where('5' eq fn)\",\" ; any\",\" x = (!null).(1)[index]\",\"end\",\"\"]}]}","types.indexing.edge-cases.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.edge-cases.spec.ts\",\"tests\":[{\"name\":\"indexing compound types\",\"code\":[\"compile_opt idl2\",\"; should be number\",\"rb_match = (where(5 eq [1, 2, 3, 4, 5]))[0]\",\"end\",\"\"]},{\"name\":\"scalar with array\",\"code\":[\"compile_opt idl2\",\"polyColors = 5l\",\"array1 = polyColors[idx : nMax]\",\"array2 = polyColors[[5 : 15: 1]]\",\"end\",\"\"]}]}","types.keywords.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.keywords.spec.ts\",\"tests\":[{\"name\":\"output or bidirectional keywords\",\"code\":[\";+\",\"; :Description:\",\"; Constructor\",\";\",\"; :Returns:\",\"; myclass\",\";\",\";-\",\"function myclass::Init\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::method, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::method, kw = kw\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; Class definition procedure\",\";\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" struct = {myclass}\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Long\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, Byte\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro mypro, kw = kw\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"mypro, kw = a\",\"\",\"; functions\",\"!null = myfunc(kw = b)\",\"\",\"; make class for methods\",\"var = myclass()\",\"\",\"; procedure methods\",\"var.method, kw = c\",\"\",\"; function methods\",\"!null = var.method(kw = d)\",\"end\"]}]}","types.operations.structures.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.structures.spec.ts\",\"tests\":[{\"name\":\"structure operations\",\"code\":[\"pro struct_checks\",\"compile_opt idl2\",\"\",\"str = {a: 42}\",\"\",\"a = 1 + str\",\"\",\"b = str + {a: 42}\",\"\",\"c = str + list()\",\"\",\"d = str + hash()\",\"\",\"e = str + orderedhash()\",\"\",\"f = str + dictionary()\",\"end\"]}]}","types.operations.list.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.list.spec.ts\",\"tests\":[{\"name\":\"list operations\",\"code\":[\"pro list_checks\",\"compile_opt idl2\",\"\",\"a = 1 + list()\",\"\",\"b = list() + list()\",\"\",\"c = list() + hash()\",\"\",\"d = list() + orderedhash()\",\"\",\"e = list() + dictionary()\",\"end\"]}]}","types.operations.hash.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.hash.spec.ts\",\"tests\":[{\"name\":\"hash operations\",\"code\":[\"pro hash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + hash()\",\"\",\"b = hash() + list()\",\"\",\"c = hash() + hash()\",\"\",\"d = hash() + orderedhash()\",\"\",\"e = hash() + dictionary()\",\"end\"]}]}","types.operations.ordered-hash.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.ordered-hash.spec.ts\",\"tests\":[{\"name\":\"ordered hash operations\",\"code\":[\"pro orderedhash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + orderedhash()\",\"\",\"b = orderedhash() + list()\",\"\",\"c = orderedhash() + hash()\",\"\",\"d = orderedhash() + orderedhash()\",\"\",\"e = orderedhash() + dictionary()\",\"end\"]}]}","types.operations.dictionary.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.dictionary.spec.ts\",\"tests\":[{\"name\":\"dictionary operations\",\"code\":[\"pro dictionary_checks\",\"compile_opt idl2\",\"\",\"a = 1 + dictionary()\",\"\",\"b = dictionary() + list()\",\"\",\"c = dictionary() + hash()\",\"\",\"d = dictionary() + orderedhash()\",\"\",\"e = dictionary() + dictionary()\",\"end\"]}]}","types.parsing-checks.1.spec.ts":"{\"suiteName\":\"Cases to make sure we always parse our types correctly\",\"fileName\":\"types.parsing-checks.1.spec.ts\",\"tests\":[{\"name\":\"for normal cases\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Pointer>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Number | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Hash | List>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg7: in, required, Hash | List | List>\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro type_parsing_test, arg1, arg2, arg3, arg4, arg5, arg6, arg7\",\" compile_opt idl3\",\"\",\"end\"]}]}","types.pointer-de-ref.1.spec.ts":"{\"suiteName\":\"Get types correctly from pointer de-reference\",\"fileName\":\"types.pointer-de-ref.1.spec.ts\",\"tests\":[{\"name\":\"for normal cases\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg7: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6, arg7\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; and, unable to index\",\" c = arg1[0]\",\"\",\" ; any, unable to de-reference\",\" d = *5\",\"\",\" ; any, ambiguous de-reference\",\" e = *arg4\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"\",\" ; union of type args, dont show arg7 more string more than once\",\" g = *arg7\",\"end\"]}]}","types.promotion1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.promotion1.spec.ts\",\"tests\":[{\"name\":\"type promotion\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; a: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\"; b: in, required, ComplexNumber\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function most_cases, a, b\",\" compile_opt idl2\",\"\",\" byte = 's' + 1b\",\"\",\" int = 's' + 1s\",\"\",\" uint = 's' + 1us\",\"\",\" long = 's' + 1l\",\"\",\" ulong = 's' + 1ul\",\"\",\" long64 = 's' + 1ll\",\"\",\" ulong64 = 's' + 1ull\",\"\",\" float1 = 's' + 1.\",\" float2 = 's' + 1e\",\"\",\" double = 's' + 1d\",\"\",\" biginteger = 's' + BigInteger(5)\",\"\",\" number = 's' + a\",\"\",\" complexfloat = 's' + 1.i\",\"\",\" complexdouble = 's' + 1di\",\" complexdouble = 's' + 1dj\",\"\",\" complexnumber1 = 's' + a + 1di + 1dj\",\" complexnumber2 = a + b\",\"\",\" return, 1\",\"end\"]}]}","types.strings.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.strings.spec.ts\",\"tests\":[{\"name\":\"strings\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = 'single quote'\",\"\",\" b = \\\"double quote\\\"\",\"\",\" c = `literal string`\",\"\",\"end\"]}]}","types.ternary.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.ternary.spec.ts\",\"tests\":[{\"name\":\"ternary\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" ; long or envi\",\" a = !true ? 5 + 15 : envi()\",\"\",\" ; long or string\",\" b = !true ? 5 + 15 : 'string'\",\"\",\" ; string\",\" c = !true ? 'string' : 'false'\",\"\",\" ; number\",\" d = !true ? 5 : 6\",\"\",\" ; any\",\" e = !true ? 5 \",\"\",\" ; any\",\" f = !true ? 5 :\",\"\",\"end\"]}]}","types.variables.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.variables.spec.ts\",\"tests\":[{\"name\":\"variables\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVISubsetRaster()\",\"\",\" b = a\",\"end\"]}]}","types.static-classes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.static-classes.spec.ts\",\"tests\":[{\"name\":\"named static classes methods/properties\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = IDL_Number.ndim\",\" b = envi.openRaster()\",\" any1 = image ; nothing\",\"end\"]}]}","types.structure-names.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.structure-names.spec.ts\",\"tests\":[{\"name\":\"named structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = {ENVIRaster}\",\"\",\" b = {!map}\",\"end\"]}]}","types.structure-anonymous.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.structure-anonymous.spec.ts\",\"tests\":[{\"name\":\"anonymous structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = {a: 'string', $\",\" b: `string`}\",\"\",\"end\"]}]}","types.system-variables.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.system-variables.spec.ts\",\"tests\":[{\"name\":\"the !null system variable\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = !null\",\"end\"]},{\"name\":\"system variables that are structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = !x\",\"end\"]}]}"},"auto-outline-tests":{"ex-1.spec.ts":"{\"suiteName\":\"Extracts outline\",\"fileName\":\"ex-1.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/awesomerasterintersection.pro\"}]}","ex-2.spec.ts":"{\"suiteName\":\"Extracts outline with main\",\"fileName\":\"ex-2.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/myfunc.pro\"}]}","ex-3.spec.ts":"{\"suiteName\":\"Extracts outline\",\"fileName\":\"ex-3.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens with multiple parent routines\",\"file\":\"idl/test/hover-help/mypro.pro\"}]}"},"auto-semantic-token-tests":{"basic.spec.ts":"{\"suiteName\":\"Extracts semantic tokens\",\"fileName\":\"basic.spec.ts\",\"tests\":[{\"name\":\"for basic case\",\"code\":[\"compile_opt idl2\",\"a = envi.api_version\",\"!null = envi.openRaster('somefile.dat')\",\"end\"]}]}","complex.spec.ts":"{\"suiteName\":\"Extracts semantic tokens\",\"fileName\":\"complex.spec.ts\",\"tests\":[{\"name\":\"for complex case with out-of order and same ref\",\"code\":[\"compile_opt idl2\",\"IDLgrVolume.AddToNotebookMap\",\"!null = ENVI.displayinnotebookmap + ENVI.api_version\",\"\",\"IDLgrVolume.AddToNotebookMap\",\"ENVI.displayInNotebookMap\",\"end\"]}]}"},"auto-task-parsing-tests":{"envi1.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi1.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/BuildMosaicRaster.task\"}]}","envi2.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi2.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/ExportRasterToCADRG.task\"}]}","envi3.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi3.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/PointCloudFeatureExtraction.task\"}]}","envi4.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi4.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/SetRasterMetadata.task\"}]}","idl1.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl1.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/Download_S3_URL.task\"}]}","idl2.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl2.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/QueryAllTasks.task\"}]}","idl3.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl3.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/QueryTask.task\"}]}"},"auto-assembler-tests":{"auto-doc.args.spec.ts":"{\"suiteName\":\"Verify arg formatting\",\"fileName\":\"auto-doc.args.spec.ts\",\"tests\":[{\"name\":\"matches arg definitions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, ARG3\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.basic.spec.ts":"{\"suiteName\":\"Verify doc formatting\",\"fileName\":\"auto-doc.basic.spec.ts\",\"tests\":[{\"name\":\"close and auto populate existing docs block\",\"code\":[\";+\",\";\",\"function myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"capture default content and re-work\",\"code\":[\";+\",\"; Header\",\";-\",\"pro myPro\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for procedures automatically\",\"code\":[\"pro myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for functions automatically\",\"code\":[\"function myPro2, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for multiple routines at once\",\"code\":[\"pro myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\"end\",\"\",\"function myPro2, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"handle, and format correctly, multi-line headers\",\"code\":[\";+\",\"; :Something fancy:\",\"; Really cool information \",\"; sdf\",\";-\",\"pro test_things\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" uses proper external name for keyword in auto-docs\",\"code\":[\"pro test_things2, a, b, kw2 = kw222\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" for only arguments\",\"code\":[\"pro test_things2, a, b\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" for only keywords\",\"code\":[\"pro test_things2, kw222=kw2, kw3 = kw3\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.example-code.spec.ts":"{\"suiteName\":\"Verify formatting\",\"fileName\":\"auto-doc.example-code.spec.ts\",\"tests\":[{\"name\":\"for example blocks moves\",\"code\":[\"; TODO: something\",\"pro test_things, a, b, c\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; My favorite procedure\",\"; \",\"; \",\"; \",\"; :Examples:\",\"; \",\"; Open an image in ENVI and display in a notebook:\",\"; \",\"; ```idl\",\"; ; Start the application\",\"; e = envi(/headless)\",\"; \",\"; ; Open an input file\",\"; file = filepath('qb_boulder_msi', subdir = ['data'], $\",\"; root_dir = e.root_dir)\",\"; raster = e.openRaster(File)\",\"; \",\"; ; display in the current notebook cell\",\"; e.displayInNotebook, raster\",\"; ```\",\";-\",\"pro test_things2\",\" compile_opt idl2\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex2.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex2.spec.ts\",\"tests\":[{\"name\":\"moves things correctly\",\"code\":[\"; TODO: something\",\"pro test_things, a, b, c\",\" compile_opt idl2\",\"end\",\"\",\";+\",\";-\",\"pro test_things2\",\" compile_opt idl2\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex3.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex3.spec.ts\",\"tests\":[{\"name\":\"moves main level correctly\",\"code\":[\"; TODO: something\",\"pro test_things\",\"end\",\"\",\"compile_opt idl2\",\"\",\"test_things\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex4.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex4.spec.ts\",\"tests\":[{\"name\":\"moves main level correctly\",\"code\":[\";+\",\"; :Description:\",\"; Function which will initialize the bdige_it object and start all bridges. When bridges are initialized\",\"; they are done so in parallel, but whe function will not return until every bridge is idle again.\",\";\",\"; :Params:\",\"; nbridges: in, required, type=int\",\"; The number of bridges that you want to create\",\";\",\"; :Keywords:\",\"; INIT : in, optional, type=strarr\",\"; Optional argument which allows you to pass in a string array of extra commands\",\"; to have each IDL_IDLBridge object execute upon creation.\",\"; MSG : in, optional, type=string\",\"; Optional argument to show the message prefix when a bridge process has completed for the TIME\",\"; keyword in bridge_it::run and bridge_it::run().\",\"; LOGDIR : in, optional, type=string\",\"; Specify the directory that the log file will be written to. The log file is just a text file with\",\"; all of the IDL Console output from each child process.\",\"; NREFRESH : in, optional, type=long\",\"; Specify the number of bridge processes to execute before closing and re-starting the\",\"; child process. Necessary for some ENVI routines so that we don't have memory fragmentation\",\"; regarding opening lots of small rasters.\",\"; PREFIX : in, optional, type=string, default='_KW_'\",\"; This optional keyword specifies the prefix which is used to differentiate between arguments and\",\"; keywords when it comes time to parse the arguments and keyword that will be passed into a routine.\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";\",\";-\",\"function bridge_it::Init, nbridges, INIT = init, MSG = msg, LOGDIR = logdir, NREFRESH = nrefresh, PREFIX = prefix\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" return, 1\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.non-idl-display-names.spec.ts":"{\"suiteName\":\"Verify type formatting uses display names\",\"fileName\":\"auto-doc.non-idl-display-names.spec.ts\",\"tests\":[{\"name\":\"matches arg definitions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, enviraster\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idl_variable\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, plot\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.only.spec.ts":"{\"suiteName\":\"Only use AutoDoc\",\"fileName\":\"auto-doc.only.spec.ts\",\"tests\":[{\"name\":\"and leave everything else the same\",\"code\":[\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\";distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\"y = sqrt(x + i^2.) ;Euclidian distance\",\"a[0,i] = y ;Insert the row\",\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"],\"config\":{\"autoDoc\":true,\"styleAndFormat\":false}}]}","auto-doc.only2.spec.ts":"{\"suiteName\":\"Only use AutoDoc\",\"fileName\":\"auto-doc.only2.spec.ts\",\"tests\":[{\"name\":\"and dont fix problems\",\"code\":[\"pro test, a, b, c\",\"end\",\"\",\"test\",\"end\"],\"config\":{\"autoDoc\":true,\"styleAndFormat\":false,\"autoFix\":false}}]}","auto-doc.parameters.spec.ts":"{\"suiteName\":\"Verify parameter formatting\",\"fileName\":\"auto-doc.parameters.spec.ts\",\"tests\":[{\"name\":\"sort arguments by appearance and add bad at the end\",\"code\":[\";+\",\"; :Args:\",\"; a: in, required, int, private\",\"; Some cool statement\",\"; b: in, required, string\",\"; Some cool statement\",\"; c: in, required, int, private\",\"; Some cool statement\",\";\",\";-\",\"pro myPro, a, c\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"sort keywords alphabetically and add bad at the end\",\"code\":[\";+\",\"; :Keywords:\",\"; kw2: in, required, int\",\"; Some cool statement\",\"; kw: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; kw1: in, required, string\",\"; Some cool statement across\",\";\",\";-\",\"pro myPro, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.order-args.spec.ts":"{\"suiteName\":\"Verify arg ordering\",\"fileName\":\"auto-doc.order-args.spec.ts\",\"tests\":[{\"name\":\"matches the argument definition\",\"code\":[\";+\",\"; :Arguments:\",\"; a01: in, required, any\",\"; Placeholder docs for argument or keyword\",\"; a02: in, required, array\",\"; Placeholder docs for argument or keyword\",\"; a03: in, required, bigint\",\"; Placeholder docs for argument or keyword\",\"; a04: in, required, biginteger\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro my_thing, $\",\" a03, a04, a01, a02\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.task-types.spec.ts":"{\"suiteName\":\"Verify type formatting for\",\"fileName\":\"auto-doc.task-types.spec.ts\",\"tests\":[{\"name\":\"ENVI and IDL Tasks\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.types.spec.ts":"{\"suiteName\":\"Verify type formatting\",\"fileName\":\"auto-doc.types.spec.ts\",\"tests\":[{\"name\":\"parses and gives normalized appearance for all IDL types\",\"code\":[\";+\",\"; :Arguments:\",\"; a01: in, required, any\",\"; Placeholder docs for argument or keyword\",\"; a02: in, required, array\",\"; Placeholder docs for argument or keyword\",\"; a03: in, required, bigint\",\"; Placeholder docs for argument or keyword\",\"; a04: in, required, biginteger\",\"; Placeholder docs for argument or keyword\",\"; a05: in, required, binary\",\"; Placeholder docs for argument or keyword\",\"; a06: in, required, bool\",\"; Placeholder docs for argument or keyword\",\"; a07: in, required, boolean\",\"; Placeholder docs for argument or keyword\",\"; a08: in, required, byte\",\"; Placeholder docs for argument or keyword\",\"; a09: in, required, complex\",\"; Placeholder docs for argument or keyword\",\"; a10: in, required, dcomplex\",\"; Placeholder docs for argument or keyword\",\"; a11: in, required, doublecomplex\",\"; Placeholder docs for argument or keyword\",\"; a12: in, required, dict\",\"; Placeholder docs for argument or keyword\",\"; a13: in, required, dictionary\",\"; Placeholder docs for argument or keyword\",\"; a14: in, required, float64\",\"; Placeholder docs for argument or keyword\",\"; a15: in, required, double\",\"; Placeholder docs for argument or keyword\",\"; a16: in, required, float32\",\"; Placeholder docs for argument or keyword\",\"; a17: in, required, float\",\"; Placeholder docs for argument or keyword\",\"; a18: in, required, hash\",\"; Placeholder docs for argument or keyword\",\"; a19: in, required, hex\",\"; Placeholder docs for argument or keyword\",\"; a20: in, required, int\",\"; Placeholder docs for argument or keyword\",\"; a21: in, required, integer\",\"; Placeholder docs for argument or keyword\",\"; a22: in, required, list\",\"; Placeholder docs for argument or keyword\",\"; a23: in, required, long\",\"; Placeholder docs for argument or keyword\",\"; a24: in, required, long64\",\"; Placeholder docs for argument or keyword\",\"; a25: in, required, null\",\"; Placeholder docs for argument or keyword\",\"; a26: in, required, number\",\"; Placeholder docs for argument or keyword\",\"; a27: in, required, class\",\"; Placeholder docs for argument or keyword\",\"; a28: in, required, object\",\"; Placeholder docs for argument or keyword\",\"; a29: in, required, octal\",\"; Placeholder docs for argument or keyword\",\"; a30: in, required, orderedhash\",\"; Placeholder docs for argument or keyword\",\"; a31: in, required, pointer\",\"; Placeholder docs for argument or keyword\",\"; a32: in, required, string\",\"; Placeholder docs for argument or keyword\",\"; a33: in, required, structure\",\"; Placeholder docs for argument or keyword\",\"; a34: in, required, uint\",\"; Placeholder docs for argument or keyword\",\"; a35: in, required, unsignedint\",\"; Placeholder docs for argument or keyword\",\"; a36: in, required, unsignedinteger\",\"; Placeholder docs for argument or keyword\",\"; a37: in, required, ulong\",\"; Placeholder docs for argument or keyword\",\"; a38: in, required, unsignedlong\",\"; Placeholder docs for argument or keyword\",\"; a39: in, required, ulong64\",\"; Placeholder docs for argument or keyword\",\"; a40: in, required, unsignedlong64\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro my_thing, $\",\" a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, $\",\" a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, $\",\" a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, $\",\" a31, a32, a33, a34, a35, a36, a37, a38, a39, a40\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.non-idl-doc.spec.ts":"{\"suiteName\":\"Verify doc formatting\",\"fileName\":\"auto-doc.non-idl-doc.spec.ts\",\"tests\":[{\"name\":\"for non IDL Doc styled docs\",\"code\":[\";+\",\"; NAME:\",\"; DIST\",\";\",\"; PURPOSE:\",\"; Create a rectangular array in which each element is proportional\",\"; to its frequency. This array may be used for a variety\",\"; of purposes, including frequency-domain filtering and\",\"; making pretty pictures.\",\";\",\"; CATEGORY:\",\"; Signal Processing.\",\";\",\"; CALLING SEQUENCE:\",\"; Result = DIST(N [, M])\",\";\",\"; INPUTS:\",\"; N = number of columns in result.\",\"; M = number of rows in result. If omitted, N is used to return\",\"; a square array.\",\";\",\"; OUTPUTS:\",\"; Returns an (N,M) floating array in which:\",\";\",\"; R(i,j) = SQRT(F(i)^2 + G(j)^2) where:\",\"; F(i) = i IF 0 <= i <= n/2\",\"; = n-i IF i > n/2\",\"; G(i) = i IF 0 <= i <= m/2\",\"; = m-i IF i > m/2\",\";\",\"; SIDE EFFECTS:\",\"; None.\",\";\",\"; RESTRICTIONS:\",\"; None.\",\";\",\"; PROCEDURE:\",\"; Straightforward. The computation is done a row at a time.\",\";\",\"; MODIFICATION HISTORY:\",\"; Very Old.\",\"; SMR, March 27, 1991 - Added the NOZERO keyword to increase efficiency.\",\"; (Recomended by Wayne Landsman)\",\"; DMS, July, 1992. - Added M parameter to make non-square arrays.\",\"; CT, RSI, March 2000: Changed i^2 to i^2. to avoid overflow.\",\";-\",\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\" ;distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\" y = sqrt(x + i^2.) ;Euclidian distance\",\" a[0,i] = y ;Insert the row\",\" if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.format-keywords.spec.ts":"{\"suiteName\":\"Apply keyword formatting\",\"fileName\":\"auto-doc.format-keywords.spec.ts\",\"tests\":[{\"name\":\"so docs match code style\",\"code\":[\";+\",\"; :Description:\",\"; My sample procedure with default \\\"modern\\\" formatting\",\";\",\"; :Arguments:\",\"; arg1: in, required, Boolean\",\"; My favorite argument\",\"; arg2: in, optional, Boolean\",\"; My second favorite argument\",\";\",\"; :Keywords:\",\"; KW1: in, required, Boolean\",\"; My favorite keyword\",\"; KW2: in, optional, Boolean\",\"; My second favorite keyword\",\";\",\";-\",\"pro mypro_modern, arg1, arg2, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2, hidden\",\"\",\" ;+ reference to our super cool and awesome plot\",\" a = plot(/test)\",\"\",\" ; sample if statement\",\" if !true then begin\",\" print, 42\",\" endif else begin\",\" print, 84\",\" endelse\",\"\",\" ; sample for loop\",\" foreach val, var, key do begin\",\"\",\" endforeach\",\"\",\" ; sample ENVI routine\",\" e = envi()\",\" r = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\"end\"],\"config\":{\"autoDoc\":true,\"style\":{\"keywords\":\"lower\"}}}]}","auto-doc.structures.spec.ts":"{\"suiteName\":\"Generate structure docs\",\"fileName\":\"auto-doc.structures.spec.ts\",\"tests\":[{\"name\":\"to automatically add them\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"to do nothing without a class/structure definition routine\",\"code\":[\"pro pro4\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add missing properties and sort alphabetically with bad at the end\",\"code\":[\";+\",\"; :MyStruct:\",\"; propFake: any\",\"; Placeholder docs for argument or keyword\",\"; prop2: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"with no properties\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.structures.2.spec.ts":"{\"suiteName\":\"Generate structure docs\",\"fileName\":\"auto-doc.structures.2.spec.ts\",\"tests\":[{\"name\":\"and verify spacing for empty structures\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {struct1}\",\"\",\" !null = {struct2}\",\"\",\" !null = {struct3, prop: 'socool'}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","format.after-main.spec.ts":"{\"suiteName\":\"Keep tokens after main level programs\",\"fileName\":\"format.after-main.spec.ts\",\"tests\":[{\"name\":\"example 1\",\"code\":[\"compile_opt idl2\",\"\",\"a = 5\",\"end\",\"; comment\",\"b = 17\"]}]}","format.after-line-continuation.spec.ts":"{\"suiteName\":\"Keep tokens after line continuations\",\"fileName\":\"format.after-line-continuation.spec.ts\",\"tests\":[{\"name\":\"example 1\",\"code\":[\"\",\"compile_opt idl2\",\"; thing\",\"a = $ something bad ;\",\" 5\",\"end\"]}]}","format.arrays.1.spec.ts":"{\"suiteName\":\"Verify array formatting\",\"fileName\":\"format.arrays.1.spec.ts\",\"tests\":[{\"name\":\"basic formatting\",\"code\":[\"compile_opt idl2\",\"\",\"a = [1,2,3,4,5]\",\"end\"]},{\"name\":\"line continuation 1\",\"code\":[\"compile_opt idl2\",\"\",\"a = [ $\",\" 1, $\",\" 2,$\",\" 3, $\",\" 4, $\",\" 5 $\",\"]\",\"end\"]},{\"name\":\"indexing and properties\",\"code\":[\"compile_opt idl2\",\"\",\"for xx = 0, numRows-1 do begin\",\"xRows[xx].Index = xCobs[xx].Index\",\"xRows[xx].Name = xCobs[xx].Name\",\"xRows[xx].Label = xCobs[xx].Label\",\"xRows[xx].SRS_Name = xCobs[xx].SRS_Name\",\"xRows[xx].Pos1 = xCobs[xx].Pos1\",\"xRows[xx].Dims1 = xCobs[xx].Dims1\",\"xRows[xx].Pos2 = xCobs[xx].Pos2\",\"xRows[xx].Dims2 = xCobs[xx].Dims2\",\"xRows[xx].Tm_Pos1 = xCobs[xx].Tm_Pos1\",\"xRows[xx].Tm_Pos2 = xCobs[xx].Tm_Pos2\",\"endfor\",\"\",\"end\"]},{\"name\":\"array indexing spacing\",\"code\":[\"overlaps.LOWER[sIdx] = ptr_new(segs[tSub[0] : tSub[2], tSub[3]])\"]},{\"name\":\"brackets for access (via overload)\",\"code\":[\"meta['band names'] = 'Awesome Label Regions'\"]},{\"name\":\"array after comma as argument\",\"code\":[\"compile_opt idl2\",\"\",\" inputValidator, hash( $\",\"'buffer', ['number', 'required'])\",\"\",\"end\"]}]}","format.assignment.1.spec.ts":"{\"suiteName\":\"Verify assignment formatting\",\"fileName\":\"format.assignment.1.spec.ts\",\"tests\":[{\"name\":\"multi-multi line assignment with operators looking correct\",\"code\":[\"compile_opt idl2\",\"\",\"a = 1 + $\",\" 2+ $\",\" 3 + $\",\" 4+ $\",\" 5\",\"end\"]}]}","format.comments.1.spec.ts":"{\"suiteName\":\"Verify comment\",\"fileName\":\"format.comments.1.spec.ts\",\"tests\":[{\"name\":\"all flavors of comments\",\"code\":[\"a = 42 ; comment OK\",\" ;; comment bad, now fixed \",\"; TODO: something super crazy \",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"limit formatting for routine comments\",\"code\":[\";+\",\"; My procedure\",\";\",\";; Preserve spacing in routine docs\",\" ; fix left alignment though\",\"; And trim the right side of the comment blocks \",\"; :Args:\",\"; var1: in, required, unknown\",\"; My favorite thing\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, var2, KW1=kw1, KW2=kw2\",\" compile_opt idl2\",\" if !true then begin\",\" print, 'yes'\",\" endif\",\"end\"]},{\"name\":\"add placeholder case for variable docs\",\"code\":[\" compile_opt idl2\",\"\",\" ;+ comment for variable\",\" ; leave indent formatting alone for now\",\" ;- stopped here\",\" a = 'something'\",\"end\"]},{\"name\":\" do not trim string before comment after line continuation\",\"code\":[\"compile_opt idl2\",\" ; left align\",\" a = 5 ; trim\",\"MESSAGE, $ ; keep my space!\",\"'baaaad'\",\"end\",\"\"]}]}","format.executive-commands.1.spec.ts":"{\"suiteName\":\"Executive command formatting\",\"fileName\":\"format.executive-commands.1.spec.ts\",\"tests\":[{\"name\":\"works without main end\",\"code\":[\"compile_opt idl2\",\"\",\".run something\",\" .compile myfile.pro \",\" .reset \",\"\"]}]}","format.line-separators.1.spec.ts":"{\"suiteName\":\"Line separator formatting\",\"fileName\":\"format.line-separators.1.spec.ts\",\"tests\":[{\"name\":\"always remove line separators, never allow them\",\"code\":[\"\",\"\",\"compile_opt idl2\",\"\",\"if !true then begin & a = b & b = c & c = d & endif\",\"\",\"end\",\"\"]}]}","format.line-separators.2.spec.ts":"{\"suiteName\":\"Line separators (&)\",\"fileName\":\"format.line-separators.2.spec.ts\",\"tests\":[{\"name\":\"Another example from docs\",\"code\":[\"compile_opt idl2\",\"\",\"if rtol lt ftol then begin ;Done?\",\"t = y[0] & y[0] = y[ilo] & y[ilo] = t ;Sort so fcn min is 0th elem\",\"t = p[*,ilo] & p[*,ilo] = p[*,0] & p[*,0] = t\",\"return, t ;params for fcn min\",\"endif\",\"\",\"end\"]}]}","format.new-lines.1.spec.ts":"{\"suiteName\":\"Verify new lines\",\"fileName\":\"format.new-lines.1.spec.ts\",\"tests\":[{\"name\":\"cannot have more than one empty line\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"\",\"\",\"return\",\"\",\"\",\"end\"]}]}","format.python.1.spec.ts":"{\"suiteName\":\"Format python code\",\"fileName\":\"format.python.1.spec.ts\",\"tests\":[{\"name\":\"for consistent spacing\",\"code\":[\"compile_opt idl2\",\"\",\">>>from idlpy import *\",\">>> arr = IDL.randomu(None, 10000)\",\">>> spec = IDL.fft_powerspectrum(arr, 0.1)\",\"end\",\"\"]}]}","format.respect-errors.1.spec.ts":"{\"suiteName\":\"Verify we do not format when we have bad syntax errors\",\"fileName\":\"format.respect-errors.1.spec.ts\",\"tests\":[{\"name\":\"unclosed tokens are ignored\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3 \",\" compile_opt idl2 \",\" \",\" a = myfunc(\",\"end \"]},{\"name\":\"unclosed main level is ignored\",\"code\":[\" compile_opt idl2 \",\" \",\"a = 5 \"]}]}","format.routines.1.spec.ts":"{\"suiteName\":\"Verify we format routines\",\"fileName\":\"format.routines.1.spec.ts\",\"tests\":[{\"name\":\"formats basic routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"formats basic method\",\"code\":[\"function myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"return, 1\",\"\",\"end\"]}]}","format.snap.1.spec.ts":"{\"suiteName\":\"Verify snapping branches to remove leading and trailing spaces\",\"fileName\":\"format.snap.1.spec.ts\",\"tests\":[{\"name\":\"all snap cases\",\"code\":[\"function test, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" return, 1\",\"end\",\"\",\"function test::class, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" return, 1\",\"end\",\"\",\"pro test::class, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\"end\",\"\",\"pro test, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" if !true then begin\",\"\",\" print, 5\",\"\",\" print, 6\",\" \",\" endif\",\"\",\" switch (!true) of\",\"\",\" (42 eq 42): begin\",\"\",\" end\",\"\",\" else: begin\",\"\",\" ; do nothing\",\"\",\" end\",\"\",\" endswitch\",\"\",\"end\",\"\",\"\",\"compile_opt idl2\",\"\",\"print, 5\",\"\",\"wait, 2\",\"\",\"test\",\"\",\"print, 'Finished'\",\"\",\"end\"]}]}","format.trimming.1.spec.ts":"{\"suiteName\":\"Verify trimming lines\",\"fileName\":\"format.trimming.1.spec.ts\",\"tests\":[{\"name\":\"all lines should be trimmed from the right\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3 \",\" compile_opt idl2 \",\" \",\"end \"]}]}","style.control.spec.ts":"{\"suiteName\":\"Control statement styling\",\"fileName\":\"style.control.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"none\"}}}]}","style.internal-routines.spec.ts":"{\"suiteName\":\"Style internal routines\",\"fileName\":\"style.internal-routines.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"match\"}}},{\"name\":\"using no format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"none\"}}}]}","style.user-routines.spec.ts":"{\"suiteName\":\"Style user routines\",\"fileName\":\"style.user-routines.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"match\"}}},{\"name\":\"using no format\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"none\"}}}]}","style.keywords.1.spec.ts":"{\"suiteName\":\"Verify keywords\",\"fileName\":\"style.keywords.1.spec.ts\",\"tests\":[{\"name\":\"basic formatting\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(KW1=kw2, /KW3)\",\"end\"]},{\"name\":\"with line continuation\",\"code\":[\"compile_opt idl2\",\"\",\"Graphic, name, arg1, arg2, $\",\"/AUTO_CROSSHAIR, COLOR=color, LINESTYLE=linestyle, $\",\"SYMBOL=SYMBOL, THICK=thick, LAYOUT=layout, TEST=test, _EXTRA=ex, $\",\"GRAPHIC=graphic\",\"\",\"end\"]},{\"name\":\"solo keyword\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(KW1=kw2)\",\"end\"]},{\"name\":\"solo binary keyword\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(/KW2)\",\"end\"]},{\"name\":\"preserve other children after keyword when we format\",\"code\":[\"compile_opt idl2\",\"tvcrs,x,y,/dev $ ;Restore cursor\",\" kw=2\",\"\",\"end\"]}]}","style.methods.spec.ts":"{\"suiteName\":\"Method styling\",\"fileName\":\"style.methods.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"dot\"}}},{\"name\":\"using dated format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"arrow\"}}},{\"name\":\"using no format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"none\"}}}]}","style.methods-call.spec.ts":"{\"suiteName\":\"Method styling\",\"fileName\":\"style.methods-call.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"match\"}}},{\"name\":\"none\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"none\"}}}]}","style.prompts.spec.ts":"{\"suiteName\":\"Prompt styling\",\"fileName\":\"style.prompts.spec.ts\",\"tests\":[{\"name\":\"format ENVI and IDL\",\"code\":[\"\",\"\",\"compile_opt idl2\",\"\",\"idl> print, 17\",\"\",\" envi>a = 5 + 6\",\"\",\"end\",\"\"]}]}","style.numbers.spec.ts":"{\"suiteName\":\"Number styling\",\"fileName\":\"style.numbers.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"none\"}}}]}","style.hex.spec.ts":"{\"suiteName\":\"Hex number styling\",\"fileName\":\"style.hex.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"none\"}}}]}","style.octal.spec.ts":"{\"suiteName\":\"Octal number styling\",\"fileName\":\"style.octal.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"none\"}}}]}","style.binary.spec.ts":"{\"suiteName\":\"Binary number styling\",\"fileName\":\"style.binary.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"none\"}}}]}","style.properties.spec.ts":"{\"suiteName\":\"Property styling\",\"fileName\":\"style.properties.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"match\"}}},{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"none\"}}}]}","style.variables.1.spec.ts":"{\"suiteName\":\"Verify variable styling\",\"fileName\":\"style.variables.1.spec.ts\",\"tests\":[{\"name\":\"in procedures with modern formatting\",\"code\":[\"pro test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in procedures with no formatting\",\"code\":[\"pro test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}},{\"name\":\"in functions with modern formatting\",\"code\":[\"function test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\" return, task\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in functions with no formatting\",\"code\":[\"function test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\" return, task\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}},{\"name\":\"in main level with modern formatting\",\"code\":[\"compile_opt idl2\",\"A = something + C + keyword_set(KW11)\",\"taSK = ENVITask('Something')\",\"TASK = !null\",\"!null = enVi.openRaster()\",\"!null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in main level with no formatting\",\"code\":[\"compile_opt idl2\",\"A = something + C + keyword_set(KW11)\",\"taSK = ENVITask('Something')\",\"TASK = !null\",\"!null = enVi.openRaster()\",\"!null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}}]}","style.system-variables.spec.ts":"{\"suiteName\":\"System variable styling\",\"fileName\":\"style.system-variables.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"none\"}}}]}","format.indent.1.spec.ts":"{\"suiteName\":\"Verify adjusting indent adjusts spacing\",\"fileName\":\"format.indent.1.spec.ts\",\"tests\":[{\"name\":\"set indent to 3\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"tabWidth\":3,\"style\":{\"quotes\":\"single\"}}}]}","lib-examples.1.spec.ts":"{\"suiteName\":\"Verify code snippets from the lib folder\",\"fileName\":\"lib-examples.1.spec.ts\",\"tests\":[{\"name\":\"cw_ogc_wcs_cap.pro 1\",\"code\":[\"compile_opt idl2\",\"subsel = make_array(2, numRows, /byte) ; an array to hold the unique values\",\"subsel[0,0] = sel[*,1]\",\"lastRow = sel[1,0]\",\"ri = 1\",\"\",\";filter out all the rows that repeat\",\"for i=1, cnt-1 do begin\",\" if (lastRow ne sel[1,i]) then begin\",\" sel[0,i] = 1\",\" subsel[*,ri] = sel[*,i]\",\" lastRow = sel[1,i]\",\" ri++\",\" endif\",\"endfor\",\"\",\"end\"]},{\"name\":\"cw_ogc_wcs_cap.pro 2\",\"code\":[\"\",\"if ((*pstate).mouseState eq 1) then begin\",\"\",\" if (totCOBs gt rows) then begin\",\" if ((*pstate).scrollUp eq 0) then begin ; scroll down\",\" if ((*pstate).cobIndex lt totCOBs) then begin\",\"\",\"\",\" (*pstate).cobIndex = (*pstate).cobIndex + (*pstate).pageScrlInc\",\"\",\" idx = (*pstate).cobIndex\",\" skip = idx-rows\",\" if (skip gt (totCOBs - rows)) then begin\",\" skip = totCOBs - rows\",\" ;(*pstate).cobIndex = totCOBs-rows\",\" (*pstate).cobIndex = totCOBs\",\" endif\",\"\",\" res = (*pstate).owcs->GetCoverageOfferingBriefs(index=skip, number=rows)\",\" cw_ogc_wcs_cap_display_cap_table, ev, res\",\"\",\" endif\",\" endif else begin ; scroll up\",\" if ((*pstate).cobIndex gt rows) then begin\",\"\",\"\",\" (*pstate).cobIndex = (*pstate).cobIndex - (*pstate).pageScrlInc\",\"\",\" idx = (*pstate).cobIndex\",\" skip = idx-rows\",\"\",\" if (skip lt 0) then begin\",\" skip = 0\",\" (*pstate).cobIndex = rows\",\" endif\",\"\",\" res = (*pstate).owcs->GetCoverageOfferingBriefs(index=skip, number=rows)\",\" cw_ogc_wcs_cap_display_cap_table, ev, res\",\"\",\" endif\",\" endelse\",\" endif\",\"endif\",\"\",\"end\"]}]}","lib-examples.2.spec.ts":"{\"suiteName\":\"Lib examples 2\",\"fileName\":\"lib-examples.2.spec.ts\",\"tests\":[{\"name\":\"dist.pro\",\"code\":[\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\" ;distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\" y = sqrt(x + i^2.) ;Euclidian distance\",\" a[0,i] = y ;Insert the row\",\" if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"]}]}","style.logic-case.1.spec.ts":"{\"suiteName\":\"Verify we style case\",\"fileName\":\"style.logic-case.1.spec.ts\",\"tests\":[{\"name\":\"formats messy case\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\" 2 $\",\" : $\",\" PRINT, 'one' + func()\",\" ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\",\"end\"]},{\"name\":\"formats nested case\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\",\"end\"]},{\"name\":\"Properly format indents for case without line continuation\",\"code\":[\"compile_opt idl2\",\" ; determine how to proceed\",\" case !true of\",\" ; only have positive values\",\" negative eq !null: begin\",\" ranges[*, i] = [0, positive]\",\" end\",\"\",\" ; only have negative values\",\" positive eq !null: begin\",\" ranges[*, i] = [-negative, 0]\",\" end\",\"\",\" ; have positive and negative values\",\" else: begin\",\" ; get our bounds\",\" maxVal = negative > positive\",\"\",\" ; populate range\",\" ranges[*, i] = [-maxVal, maxVal]\",\" end\",\" endcase\",\"end\"]},{\"name\":\"removes spaces in logical default\",\"code\":[\"compile_opt idl2\",\"case N_PARAMS() of\",\"else : ; remove my space to the left after \\\"else\\\"\",\"endcase\",\"end\"]},{\"name\":\"properly formats this case/switch style\",\"code\":[\"compile_opt idl2\",\"\",\"; Just determine what to do and register.\",\"case 1 of\",\"\",\" keyword_set(visualization): $\",\" oSystem->RegisterVisualization, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(annotation): $\",\" oSystem->RegisterAnnotation, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(user_interface): $\",\"oSystem->RegisterUserInterface, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(ui_panel): $\",\"oSystem->RegisterUIPanel, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(ui_service): $\",\"oSystem->RegisterUIService, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(file_reader): $\",\"oSystem->RegisterFileReader, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(file_writer): $\",\"oSystem->RegisterFileWriter, strName, strClassName, _EXTRA = _extra\",\"\",\"else: $\",\"oSystem->RegisterTool, strName, strClassName, _EXTRA = _extra\",\"\",\"endcase\",\"end\"]}]}","style.logic-if-then.1.spec.ts":"{\"suiteName\":\"Verify we style if-then\",\"fileName\":\"style.logic-if-then.1.spec.ts\",\"tests\":[{\"name\":\"complex scenarios for if-then-else\",\"code\":[\" COMPILE_OPT idl2\",\"\",\" IF (n_elements(useDicomexIn) EQ 1) THEN $\",\" useDicomex = keyword_set(useDicomexIn) $\",\" ELSE $\",\" useDicomex = 1\",\"\",\" if !true then print, 'true' else print, 'false'\",\"\",\" IF (n_elements(useDicomexIn) EQ 1) $\",\"THEN $\",\" useDicomex = keyword_set(useDicomexIn) $\",\" ELSE $\",\" useDicomex = 1\",\"\",\" if !true then begin\",\"print, 'no'\",\" endif else begin\",\" b = 42\",\" endelse\",\"\",\"end\"]},{\"name\":\"keep on indenting with line continuations\",\"code\":[\"compile_opt idl2\",\"; when in paren, not as pretty\",\"if (!true $\",\" ) then $\",\"imageFFT = FFT(image, -1)\",\"\",\";;outside of paren, looks much nicer as long as enclosed\",\"if (!true)$\",\" then $\",\"imageFFT = FFT(image, -1)\",\"\",\"a = 5\",\"end\"]},{\"name\":\"complex indentation for if statement\",\"code\":[\"compile_opt idl2\",\"if ((imageSz.N_DIMENSIONS ne 2) || $\",\"((imageSz.TYPE ne 6) && (imageSz.TYPE ne 9)) || $\",\" MAX(imageSz.DIMENSIONS[0 : 1] ne imageDims[0] * 2)) then begin\",\" ; Double the image size and pad with zeros\",\" bigImage = dblarr(imageDims[0] * 2, imageDims[1] * 2)\",\" bigImage[0 : imageDims[0] - 1, 0 : imageDims[1] - 1] = image\",\" imageFFT = FFT(bigImage, -1)\",\" imageNElts = N_ELEMENTS(bigImage)\",\" endif\",\"end\"]},{\"name\":\"very complex if statement for regression test\",\"code\":[\"compile_opt idl2\",\"\",\" ;; Check to see if texture map was passed in as 3 or 4 separate 2D\",\" ;; arrays. textureRed, textureGreen, and textureBlue must all\",\" ;; be 2D arrays of the same size and type and textureImage must\",\" ;; not be set.\",\" IF keyword_set(textureRed) && keyword_set(textureGreen) && $\",\" keyword_set(textureBlue) && ~keyword_set(textureImage) && $\",\" (size(reform(textureRed),/n_dimensions) EQ 2) && $\",\" (size(reform(textureGreen),/n_dimensions) EQ 2) && $\",\" (size(reform(textureBlue),/n_dimensions) EQ 2) && $\",\" ( ((textmap_x=(size(reform(textureRed),/dimensions))[0])) EQ $\",\" (size(reform(textureGreen),/dimensions))[0] ) && $\",\" ( textmap_x EQ (size(reform(textureBlue),/dimensions))[0] ) && $\",\" ( ((textmap_y=(size(reform(textureRed),/dimensions))[1])) EQ $\",\" (size(reform(textureGreen),/dimensions))[1] ) && $\",\" ( textmap_y EQ (size(reform(textureBlue),/dimensions))[1] ) && $\",\" ( ((textmap_type=(size(reform(textureRed),/type))[0])) EQ $\",\" (size(reform(textureGreen),/type))[0] ) && $\",\" ( textmap_type EQ (size(reform(textureBlue),/type))[0] ) && $\",\" ( where(textmap_type EQ [0l,6,7,8,9,10,11]) EQ -1 ) THEN BEGIN\",\" ;; textureAlpha, if set, must match TEXTURE_* in size and type\",\" IF keyword_set(textureAlpha) && $\",\" (size(reform(textureAlpha),/n_dimensions) EQ 2) && $\",\" ( textmap_x EQ (size(reform(textureAlpha),/dimensions))[0]) && $\",\" ( textmap_y EQ (size(reform(textureAlpha),/dimensions))[1]) && $\",\" ( textmap_type EQ (size(reform(textureAlpha),/type))[0]) $\",\" THEN BEGIN\",\" textData = make_array(4,textmap_x,textmap_y,type=textmap_type)\",\" textData[0,*,*] = textureRed\",\" textData[1,*,*] = textureGreen\",\" textData[2,*,*] = textureBlue\",\" textData[3,*,*] = textureAlpha\",\" ENDIF ELSE BEGIN\",\" textData = make_array(3,textmap_x,textmap_y,type=textmap_type)\",\" textData[0,*,*] = textureRed\",\" textData[1,*,*] = textureGreen\",\" textData[2,*,*] = textureBlue\",\" ENDELSE\",\" oTextMap = obj_new('idlitDataIDLArray3d', textData, $\",\" NAME='TEXTURE')\",\" oParmSet->add, oTextMap, PARAMETER_NAME= \\\"TEXTURE\\\"\",\" ENDIF\",\"\",\"end\"]}]}","style.logic-switch.1.spec.ts":"{\"suiteName\":\"Verify we style switch\",\"fileName\":\"style.logic-switch.1.spec.ts\",\"tests\":[{\"name\":\"formats messy switch\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\" 2 $\",\" : $\",\" PRINT, 'one' + func()\",\" ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\",\"end\"]},{\"name\":\"formats nested switch\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" switch x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\",\"end\"]}]}","style.logic-ternary.1.spec.ts":"{\"suiteName\":\"Verify we style ternary operators well\",\"fileName\":\"style.logic-ternary.1.spec.ts\",\"tests\":[{\"name\":\"simple case with spacing\",\"code\":[\"nPrint = (nTiles lt 100) ? 1:ceil(nTiles / 100.0)\"]},{\"name\":\"Case to preserve spacing before else\",\"code\":[\"oWorld = OBJ_VALID(oLayer) ? oLayer->GetWorld(): OBJ_NEW()\"]}]}","style.methods.1.spec.ts":"{\"suiteName\":\"Verify style for methods\",\"fileName\":\"style.methods.1.spec.ts\",\"tests\":[{\"name\":\"remove excess spaces\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"]}]}","style.operators.1.spec.ts":"{\"suiteName\":\"Verify operators\",\"fileName\":\"style.operators.1.spec.ts\",\"tests\":[{\"name\":\"pointers\",\"code\":[\"compile_opt idl2\",\"\",\"; complex pointers\",\"(*pstate).coDesCovIdArr[(*pstate).coDesCovIdArrIdx++] = ogc_wcs_descov(ev.top, (*pstate).owcs, covNames, '')\",\"\",\"end\"]},{\"name\":\"pointers\",\"code\":[\"compile_opt idl2\",\"\",\"*ptr = 42\",\"end\"]},{\"name\":\"operators that should not have spaces\",\"code\":[\"compile_opt idl2\",\"\",\"a++\",\"b--\",\"++c\",\"--d\",\"a += 6\",\"y -= 42\",\"m = --6\",\"n = ++4\",\"end\"]},{\"name\":\"handle tilde\",\"code\":[\"if ~keyword_set(difference_raster_uri) then difference_raster_uri = e.GetTemporaryFilename()\"]},{\"name\":\"pointer dereference and multiplication\",\"code\":[\"compile_opt idl2\",\"a = 5*10\",\"(*ptr).prop = 5\",\"b = *ptr\",\"segsUpper.Add, * overlaps.LOWER[mapXY[0], mapXY[1] - 1], /EXTRACT\",\"end\"]},{\"name\":\"remove spaces before operators where we do not need then\",\"code\":[\" compile_opt idl2\",\"\",\" a = - 1\",\" mypro, - 1\",\"\",\" ; create a struture to store information about our tile overlaps\",\" overlaps = { $\",\" IDX_X: - 0l $\",\" }\",\"deltas = ranges[1, *]-ranges[0, *]\",\"idxMin = [0 : - 2]\",\"end\"]},{\"name\":\"preserve spacing here\",\"code\":[\"a = ['Anomaly Detection: ' + task.MEAN_CALCULATION_METHOD]\"]},{\"name\":\"preserve spacing here too\",\"code\":[\"cs = !dpi *[0d : num_period - 1]\"]},{\"name\":\"operators by paren get properly ignored for trimming\",\"code\":[\"compile_opt idl2\",\" if (and filtMask and igMask) then filters = 'Image Files'\",\" if (eq filtMask and igMask) then filters = 'Image Files'\",\" if (ge filtMask and igMask) then filters = 'Image Files'\",\" if (gt filtMask and igMask) then filters = 'Image Files'\",\" if (le filtMask and igMask) then filters = 'Image Files'\",\" if (lt filtMask and igMask) then filters = 'Image Files'\",\" if (mod filtMask and igMask) then filters = 'Image Files'\",\" if (ne filtMask and igMask) then filters = 'Image Files'\",\" if (not filtMask and igMask) then filters = 'Image Files'\",\" if (or filtMask and igMask) then filters = 'Image Files'\",\" if (xor filtMask and igMask) then filters = 'Image Files'\",\"end\"]}]}","style.quotes-double.1.spec.ts":"{\"suiteName\":\"Verify double quote styling\",\"fileName\":\"style.quotes-double.1.spec.ts\",\"tests\":[{\"name\":\"convert double to single quote\",\"code\":[\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}},{\"name\":\"keep formatting when double quotes is preference\",\"code\":[\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = '\\\"'\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}}]}","style.quotes-none.1.spec.ts":"{\"suiteName\":\"Verify no formatting of quotes\",\"fileName\":\"style.quotes-none.1.spec.ts\",\"tests\":[{\"name\":\"preserve all quotes\",\"code\":[\"compile_opt idl2\",\"\",\"message, 'Each dimension must be greater than 1.\\\"'\",\"\",\"a = \\\"5\\\"\",\"\",\"a = 'fourty two'\",\"\",\"; for chris and doug\",\"a = '1'\",\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"none\"}}}]}","style.quotes-nested.1.spec.ts":"{\"suiteName\":\"Verify double quote parsing\",\"fileName\":\"style.quotes-nested.1.spec.ts\",\"tests\":[{\"name\":\"preserve nested double quote when we use single\",\"code\":[\"compile_opt idl2\",\"\",\"message, 'Each dimension must be greater than 1.\\\"'\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}},{\"name\":\"preserve nested single quote when we use double\",\"code\":[\"compile_opt idl2\",\"\",\"message, \\\"Each dimension must be greater than 1.'\\\"\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}}]}","style.quotes-single.1.spec.ts":"{\"suiteName\":\"Verify single quote parsing\",\"fileName\":\"style.quotes-single.1.spec.ts\",\"tests\":[{\"name\":\"convert single to double quote\",\"code\":[\" compile_opt idl2\",\"\",\" ; single quote\",\" a = 'something'\",\"\",\" ; double quote with single quote\",\" a = '\\\"'\",\"\",\" ; escaped single quote\",\" a = 'escaped''formatting'\",\"\",\" ; number strings\",\" a = '010101'b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}},{\"name\":\"keep formatting when single quotes is preference\",\"code\":[\" compile_opt idl2\",\"\",\" ; single quote\",\" a = 'something'\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped single quote\",\" a = 'escaped''formatting'\",\"\",\" ; number strings\",\" a = '010101'b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}}]}","style.string-literal.1.spec.ts":"{\"suiteName\":\"Verify string literal styling\",\"fileName\":\"style.string-literal.1.spec.ts\",\"tests\":[{\"name\":\"simple\",\"code\":[\" compile_opt idl2 \",\"a = `my string with${expression}`\",\"b = `something ${5 + 6*12}`\",\" c = ` preserve as string`\",\";preserve interior spacing\",\"a = `with ${expression()} else`\",\" \",\"end \"]},{\"name\":\"multi-line\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"`\",\"end\"]}]}","style.structures.1.spec.ts":"{\"suiteName\":\"Verify structures\",\"fileName\":\"style.structures.1.spec.ts\",\"tests\":[{\"name\":\"simple\",\"code\":[\" compile_opt idl2 \",\"fourty2 = { mystruct }\",\" \",\"end \"]},{\"name\":\"structure\",\"code\":[\"pro folderwatch__define\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" void = { $\",\" FOLDERWATCH, $\",\" inherits idl_object, $\",\" _folder: '', $\",\" _callback: '', $\",\" _userdata: ptr_new(), $\",\" _added: 0b, $\",\" _modified: 0b, $\",\" _removed: 0b, $\",\" _frequency: 0d, $\",\" _timerid: 0l, $\",\" _fileinfo: ptr_new(), $\",\" _recursive: 0b, $\",\" _active: 0b, $\",\" _incallback: 0b $\",\" }\",\"\",\"end\"]},{\"name\":\"structure with arrays\",\"code\":[\"pro folderwatch__define\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" void = { $\",\" IDX_XY: [0l, 0l], $\",\" RIGHT_MEANS: ptrarr(mapDims) $\",\" }\",\"\",\"end\"]},{\"name\":\"structure with line continuations regression\",\"code\":[\" compile_opt idl2, hidden\",\"!null = {IDLNotebook, $\",\" _foo: 5}\",\"\",\" !null = $\",\" {IDLNotebook, $\",\" _foo: 5}\",\"\",\" !null = { $\",\" _foo: 5}\",\"\",\" !null = $\",\" { $\",\" _foo: 5}\",\"end\"]}]}","style.template-escape.spec.ts":"{\"suiteName\":\"Verify auto-fix/format of template escape characters\",\"fileName\":\"style.template-escape.spec.ts\",\"tests\":[{\"name\":\" only changes the last line with modern\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"lower\"}}},{\"name\":\" only changes the last line with dated\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"upper\"}}},{\"name\":\" only changes the last line with none\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"none\"}}}]}"},"auto-task-assembler-tests":{"envitask.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for ENVITasks\",\"fileName\":\"envitask.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_raster\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_raster_uri\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_raster\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_RASTER_uri\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","envitask.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for ENVI Tasks\",\"fileName\":\"envitask.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster \\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" output_raster_uri \\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_RASTER \\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","envitask.direction1.spec.ts":"{\"suiteName\":\"Verify direction formatting for ENVI Tasks\",\"fileName\":\"envitask.direction1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\" ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection \\\",\",\" \\\"description\\\": \\\" Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster \\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" output_raster_uri \\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_RASTER \\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}","envitask-legacy.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_raster\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"name\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_roi\\\",\",\" \\\"name\\\": \\\"output_roi\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_RASTER\\\",\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","envitask-legacy.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_roi\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\" mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\" ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\" This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\" ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_roi \\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","envitask-legacy.direction-and-req1.spec.ts":"{\"suiteName\":\"Verify direction formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.direction-and-req1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\" ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\" ,\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}","idltask.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for IDL Tasks\",\"fileName\":\"idltask.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"s3_url\\\",\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"local_file\\\",\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"S3_URL\\\",\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"LOCAL_FILE\\\",\",\" \\\"name\\\": \\\"LOCAL_FILE\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"S3_url\\\",\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"local_FILE\\\",\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","idltask.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for IDL Tasks\",\"fileName\":\"idltask.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"LOCAL_FILE\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","idltask.direction1.spec.ts":"{\"suiteName\":\"Verify direction formatting for IDL Tasks\",\"fileName\":\"idltask.direction1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}"},"auto-problem-fixing-tests":{"code.3.after-main.spec.ts":"{\"suiteName\":\"Verify tokens after main get removed on formatting\",\"fileName\":\"code.3.after-main.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = $ ; comment\",\" 5\",\"end\",\"\",\"; bad\",\" worse = not 42\"]}]}","code.14.colon-in-func.spec.ts":"{\"suiteName\":\"Verify function to array for\",\"fileName\":\"code.14.colon-in-func.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"coefs = coefs_spc(*, 0 : junk - 1)\",\"end\"]}]}","code.15.colon-in-func-method.spec.ts":"{\"suiteName\":\"Verify function method to array for\",\"fileName\":\"code.15.colon-in-func-method.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = objOrStruct.var(0 : -1)\",\"end\"]}]}","code.20.return-vals-pro.spec.ts":"{\"suiteName\":\"Verify we remove excess args\",\"fileName\":\"code.20.return-vals-pro.spec.ts\",\"tests\":[{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro myname\",\" compile_opt idl2\",\"\",\" ; comment\",\" return, 42\",\"\",\"end\"]},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\" return, 42\",\"end\"]},{\"name\":\"for main level programs\",\"code\":[\"; main\",\"compile_opt idl2\",\"\",\"return, 42\",\"\",\"end\"]}]}","code.21.return-vals-func.spec.ts":"{\"suiteName\":\"Verify we remove excess args\",\"fileName\":\"code.21.return-vals-func.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myname\",\" compile_opt idl2\",\"\",\" ;comment\",\" ; comment\",\" return, !null, $\",\" 2, myfunc()\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\" return, !null, 2\",\"end\"]}]}","code.31.return-missing.spec.ts":"{\"suiteName\":\"Verify we add missing return statement\",\"fileName\":\"code.31.return-missing.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myname\",\" compile_opt idl2\",\"\",\" ;comment\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\"end\"]}]}","code.35.after-continuation.spec.ts":"{\"suiteName\":\"Verify tokens after line continuation get removed on formatting\",\"fileName\":\"code.35.after-continuation.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = $ 5 * bad ; comment\",\" 5\",\"end\"]}]}","code.38.no-comp-opt.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myfunc\",\"\",\" return, 1\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myfunc\",\"\",\" return, 1\",\"end\"]},{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro mypro\",\"\",\"end\"]},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::mypro\",\"\",\"end\"]},{\"name\":\"for main case 1\",\"code\":[\"; comment\",\"\",\"end\"]},{\"name\":\"for main case 2\",\"code\":[\"a = 5\",\"\",\"end\"]},{\"name\":\"for main case 3\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"]},{\"name\":\"for main case 4\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"]},{\"name\":\"with args and keywords\",\"code\":[\"function myfunc,$\",\"a, b, $\",\"kw2 = kw2\",\"\",\" return, 1\",\"end\"]}]}","code.38.no-comp-opt.edge-cases.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for functions without names\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function\",\"\",\"end\"]},{\"name\":\"for procedures without names\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"pro\",\"\",\"end\"]}]}","code.38.no-comp-opt.notebooks.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.notebooks.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myfunc\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myfunc\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro mypro\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::mypro\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 1\",\"code\":[\"; comment\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 2\",\"code\":[\"a = 5\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 3\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 4\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"with args and keywords\",\"code\":[\"function myfunc,$\",\"a, b, $\",\"kw2 = kw2\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}}]}","code.76.init-method-pro.spec.ts":"{\"suiteName\":\"Verify we change procedure init methods to function methods\",\"fileName\":\"code.76.init-method-pro.spec.ts\",\"tests\":[{\"name\":\"without return statements\",\"code\":[\"PRO myclass2::init\",\" compile_opt idl2\",\"\",\"end\",\"\",\"\",\"pro myclass::init\",\" compile_opt idl2\",\"\",\" ; comment\",\"end\"]},{\"name\":\"with return statements\",\"code\":[\"pro myclass::init\",\" compile_opt idl2\",\"\",\" ; comment\",\" return, !null\",\"end\",\"\",\"PRO myclass2::init\",\" compile_opt idl2\",\" return\",\"end\",\"\",\"\",\"pro myclass::init\",\" compile_opt idl2\",\" return\",\"end\"]}]}","code.105.illegal-var-index.spec.ts":"{\"suiteName\":\"Verify we correctly fix brackets for indexing\",\"fileName\":\"code.105.illegal-var-index.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}"},"auto-global-problem-tests":{"duplicates.spec.ts":"{\"suiteName\":\"Correctly identify duplicate problems\",\"fileName\":\"duplicates.spec.ts\",\"tests\":[{\"name\":\"while adding and removing files\",\"workspace\":\"idl/test/global-problems\",\"actions\":[{\"action\":\"add\",\"file\":\"file1.pro\"},{\"action\":\"add\",\"file\":\"file2.pro\"},{\"action\":\"add\",\"file\":\"file3.pro\"},{\"action\":\"remove\",\"file\":\"file1.pro\"},{\"action\":\"remove\",\"file\":\"file2.pro\"}]}]}","no-duplicate-main.spec.ts":"{\"suiteName\":\"Correctly ignore main level programs as duplicates\",\"fileName\":\"no-duplicate-main.spec.ts\",\"tests\":[{\"name\":\"with multiple files in the same workspace\",\"workspace\":\"idl/test/global-main-problems\",\"actions\":[{\"action\":\"add\",\"file\":\"file1.pro\"},{\"action\":\"add\",\"file\":\"file2.pro\"}]}]}"},"auto-config-resolution-tests":{"resolution.spec.ts":"{\"suiteName\":\"Correctly identify parses and returns config files\",\"fileName\":\"resolution.spec.ts\",\"tests\":[{\"name\":\"based on their folders\",\"workspace\":\"idl/test/configs\",\"actions\":[{\"action\":\"add\",\"file\":\"subdir1/idl.json\"},{\"action\":\"add\",\"file\":\"subdir2/idl.json\"},{\"action\":\"add\",\"file\":\"subdir3/idl.json\"},{\"action\":\"get\",\"file\":\"subdir1/idl.pro\"},{\"action\":\"get\",\"file\":\"subdir2/idl.pro\"},{\"action\":\"get\",\"file\":\"subdir3/idl.pro\"}]}]}","bad-file.spec.ts":"{\"suiteName\":\"Parse invalid config files\",\"fileName\":\"bad-file.spec.ts\",\"tests\":[{\"name\":\"and load default config for bad file\",\"workspace\":\"idl/test/configs\",\"actions\":[{\"action\":\"add\",\"file\":\"subdir4/idl.json\"},{\"action\":\"get\",\"file\":\"subdir4/idl.pro\"}]}]}"},"auto-task-generation-tests":{"envi.basic.spec.ts":"{\"suiteName\":\"Make basic ENVI task\",\"fileName\":\"envi.basic.spec.ts\",\"tests\":[{\"name\":\"from PRO\",\"file\":\"idl/test/task-generation/envitasktest.pro\",\"type\":\"envi\"}]}","envi.failure1.spec.ts":"{\"suiteName\":\"Don't make ENVI Task\",\"fileName\":\"envi.failure1.spec.ts\",\"tests\":[{\"name\":\"because of missing PRO definition\",\"file\":\"idl/test/task-generation/empty_envi.pro\",\"type\":\"envi\"}]}","idl.basic.spec.ts":"{\"suiteName\":\"Make basic IDL task\",\"fileName\":\"idl.basic.spec.ts\",\"tests\":[{\"name\":\"from PRO\",\"file\":\"idl/test/task-generation/idltasktest.pro\",\"type\":\"idl\"}]}","idl.failure1.spec.ts":"{\"suiteName\":\"Don't make IDL Task\",\"fileName\":\"idl.failure1.spec.ts\",\"tests\":[{\"name\":\"because of missing PRO definition\",\"file\":\"idl/test/task-generation/empty_idl.pro\",\"type\":\"idl\"}]}"}} \ No newline at end of file +{"auto-token-tests":{"assignment.spec.ts":"{\"suiteName\":\"Validates assignment parsing\",\"fileName\":\"assignment.spec.ts\",\"tests\":[{\"name\":\"parses variable assignment\",\"code\":\"a = 5\"},{\"name\":\"parses system variable assignment\",\"code\":\"!null = 5\"},{\"name\":\"brackets with assignment\",\"code\":\"a[i] = b\"},{\"name\":\"parses variable assignment with line continuation\",\"code\":[\"z = $\",\" 5\"]},{\"name\":\"assignment with parentheses\",\"code\":\"(b) = 15\"},{\"name\":\"procedure after assignment in loop and keyword\",\"code\":\"for i=0, myFunc(a=42) do print, i\"}]}","blocks.spec.ts":"{\"suiteName\":\"Validates block parsing auto-closes\",\"fileName\":\"blocks.spec.ts\",\"tests\":[{\"name\":\"lib example from kruskal_wallis.pro\",\"code\":[\"\",\"if !true then $\",\"\",\"while !true DO BEGIN\",\" a = 42 \",\"ENDWHILE $\",\"\",\"ELSE stop = stop+1\",\"end\"]}]}","brackets.spec.ts":"{\"suiteName\":\"Validates bracket parsing\",\"fileName\":\"brackets.spec.ts\",\"tests\":[{\"name\":\"parses standalone brackets\",\"code\":\"[1 + 2]\"},{\"name\":\"parses standalone brackets with line continuations\",\"code\":[\"[1 + $\",\" 2]\"]},{\"name\":\"indexing and compound expression\",\"code\":\"array1[1 + 2] * (1 + 2)\"},{\"name\":\"brackets with assignment\",\"code\":\"_a[i] = 5 * b\"},{\"name\":\"brackets with compound assignment\",\"code\":\"_aA$[i] *= b\"}]}","colon.spec.ts":"{\"suiteName\":\"Validates colon parsing\",\"fileName\":\"colon.spec.ts\",\"tests\":[{\"name\":\"simple colon test\",\"code\":\"[:]\"},{\"name\":\"array indexing\",\"code\":\"a[0:I] = 42\"}]}","commas.spec.ts":"{\"suiteName\":\"Validates comma parsing (mostly covered elsewhere)\",\"fileName\":\"commas.spec.ts\",\"tests\":[{\"name\":\"don't find commas on their own\",\"code\":\",\"},{\"name\":\"find commas in function\",\"code\":\"f(,)\"},{\"name\":\"find commas in pro\",\"code\":\"p,\"}]}","comments.spec.ts":"{\"suiteName\":\"Validates comment parsing\",\"fileName\":\"comments.spec.ts\",\"tests\":[{\"name\":\"parses simple comments\",\"code\":\" ; something()\"},{\"name\":\"parses code with comments at the end\",\"code\":\"a = b() ; something()\"},{\"name\":\"parses simple comments with TODO\",\"code\":\" ; TODO: something()\"},{\"name\":\"parses code with comments at the end with TODO\",\"code\":\"a = b() ; TODO: something()\"},{\"name\":\"parses code with comments and line continuations\",\"code\":[\"a = $ ; TODO: something()\",\" b()\"]}]}","control.1.spec.ts":"{\"suiteName\":\"Validates control statement parsing\",\"fileName\":\"control.1.spec.ts\",\"tests\":[{\"name\":\"parses basic control statements\",\"code\":[\"break\",\"continue\",\"jump: a = func()\",\"jump: mypro, $\",\" 5\",\"jumpy17$: ;comment\"]},{\"name\":\"parses break in if statements\",\"code\":\"if !true then break\"},{\"name\":\"parses continue in if statements\",\"code\":\"if !true then continue\"},{\"name\":\"parses continue and break in loops\",\"code\":[\"for i=0,99 do begin\",\" continue\",\" break\",\"endfor\"]},{\"name\":\"parses jump in blocks\",\"code\":[\"for i=0,99 do begin\",\" jump:\",\"endfor\"]},{\"name\":\"parses compound control statements\",\"code\":[\"common, group, var1, var2, var3 ; comment\",\"compile_opt, idl2, $ ; line continuation\",\" hidden\",\"compile_opt\",\"forward_function, idl2, hidden\",\"goto, label\"]},{\"name\":\"goto in in statement\",\"code\":\"if not wild then goto, done else printf, outunit\"},{\"name\":\"statements end at line separator\",\"code\":\"GOTO, do_six & END\"}]}","executive-command.spec.ts":"{\"suiteName\":\"Validates executive command parsing\",\"fileName\":\"executive-command.spec.ts\",\"tests\":[{\"name\":\"simple 1\",\"code\":\".compile\"},{\"name\":\"simple 2\",\"code\":\".run myfile.pro\"},{\"name\":\"simple 3 start with spaces\",\"code\":\" .run myfile.pro\"},{\"name\":\"ignore methods\",\"code\":\"obj.method\"},{\"name\":\"ignore properties\",\"code\":\"!null = obj.method\"}]}","include.spec.ts":"{\"suiteName\":\"Validates include statements, but not correct location\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"basic test\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"find in loops\",\"code\":\"for i=0,99 do @very_wrong\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"},{\"name\":\"don't capture afterwards\",\"code\":\"@include.pro ; comment\"}]}","lambda.spec.ts":"{\"suiteName\":\"Validates lambda functions parsed as special token\",\"fileName\":\"lambda.spec.ts\",\"tests\":[{\"name\":\"correctly parse lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","line-modifiers.spec.ts":"{\"suiteName\":\"Validates line modifier (separators)\",\"fileName\":\"line-modifiers.spec.ts\",\"tests\":[{\"name\":\"parses multi-line as single-line\",\"code\":[\"a = a + b() & proc & a.procMethod,1 & $\",\"a={struct}\"]},{\"name\":\"loops properly stop in line modifier\",\"code\":[\"proc & for i=0,99 do print, i & while !true do b = awesome() & foreach val, b, key do print, key, val & endedit\"]},{\"name\":\"line separators in case statement\",\"code\":[\"CASE typ OF\",\" 7: begin val = \\\"\\\" & cnt = 1 & endcase\",\" 8: val = tiff_sint(val, 0, len=cnt)\",\"ENDCASE\"]},{\"name\":\"verifies nested line continuations use basic token\",\"code\":\"scale=scale, $, $\"}]}","logic.if-then-else.1.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [1]\",\"fileName\":\"logic.if-then-else.1.spec.ts\",\"tests\":[{\"name\":\"parses basic if-then loop\",\"code\":\"if !true then print, 'yes'\"},{\"name\":\"parses basic if-then-else loop\",\"code\":\"if ~doIt then print, 'yes' else a = yellow()\"},{\"name\":\"parses basic if-then loop with line continuation 1\",\"code\":[\"if !true $\",\" then print, 'yes'\"]},{\"name\":\"parses basic if-then loop with line continuation 2\",\"code\":[\"if !true $\",\" then print $\",\" , 'yes'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 1\",\"code\":[\"if !true then print, 'yes' $\",\" else print, 'no'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 2\",\"code\":[\"if !true then print, 'yes' $\",\" else $\",\" print, 'no'\"]},{\"name\":\"nested if-then-else\",\"code\":\"if ~(myFunc(_a17$) * 2) then if !false then print, 'yes'\"}]}","logic.if-then-else.2.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [2]\",\"fileName\":\"logic.if-then-else.2.spec.ts\",\"tests\":[{\"name\":\"with blocks [1]\",\"code\":[\"if a++ then begin\",\" super = awesome()\",\"endif else print, 'else'\"]}]}","logic.if-then-else.3.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [3]\",\"fileName\":\"logic.if-then-else.3.spec.ts\",\"tests\":[{\"name\":\"example from IDL code [1]\",\"code\":\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\"},{\"name\":\"example from IDL code [2]\",\"code\":[\"if (ISA(equation)) then begin\",\" graphic.SetProperty, EQUATION=equation\",\" arg1 = equation\",\" if (ISA(style)) then arg2 = style\",\"endif\"]},{\"name\":\"example from IDL code [3]\",\"code\":[\"IF (nms[i-1, j] && ~marked[i-1, j]) THEN $\",\" canny_follow, i-1, j, nms, marked\"]},{\"name\":\"example from IDL code [4]\",\"code\":[\"IF (max(step) && ~n_elements(stepflag)) THEN $\",\" suppMag = nmsupp_mask * mag\"]},{\"name\":\"example from IDL code [5]\",\"code\":[\"if (~Isa(hDefinition, 'Hash') || $\",\" ~hDefinition.HasKey('schema') || $\",\" ~(hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)) then begin\",\" message, 'File does not contain a valid color gradient definition.', /NONAME \",\"endif\"]}]}","logic.case.1.spec.ts":"{\"suiteName\":\"Validates case statement\",\"fileName\":\"logic.case.1.spec.ts\",\"tests\":[{\"name\":\"parses case loop with many syntaxes\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\"]},{\"name\":\"nested case statement\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\"]}]}","logic.switch.1.spec.ts":"{\"suiteName\":\"Validates switch statement\",\"fileName\":\"logic.switch.1.spec.ts\",\"tests\":[{\"name\":\"parses switch loop with many syntaxes\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDSWITCH\"]},{\"name\":\"nested switch statement\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" SWITCH x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDSWITCH\",\"END\",\"ENDSWITCH\"]}]}","logic.ternary.1.spec.ts":"{\"suiteName\":\"Validates for ternary statement parsing\",\"fileName\":\"logic.ternary.1.spec.ts\",\"tests\":[{\"name\":\"simplest ternary statement\",\"code\":\"a = something ? 5 : 6\"},{\"name\":\"nested ternary statement grouped\",\"code\":\"a = !true ? (!false ? 7 : 8) : 6\"},{\"name\":\"nested ternary statement without grouping\",\"code\":\"mypro, something ? ~something ? 7 : 8 : 6, 2\"},{\"name\":\"ternary as argument\",\"code\":\"a = myfunc(something ? otherfunc() : !awesomesauce) + 3\"},{\"name\":\"operators end on ternary statements\",\"code\":\"a = 5*something ? 5- 4 : 6^3\"},{\"name\":\"multi-line ternary 1\",\"code\":[\"a = _myvar $\",\" ? 'jello' : \\\"jelly\\\"\"]},{\"name\":\"multi-line ternary 2\",\"code\":[\"a = myfunc( $\",\" a,b,c) ? b4d $\",\" : $\",\" s1nt4x3x4mple\"]},{\"name\":\"ternary works in braces as expected\",\"code\":[\"_17 = arr[!true ? 0 : -3: -1]\"]}]}","loops.for.spec.ts":"{\"suiteName\":\"Validates for loop parsing\",\"fileName\":\"loops.for.spec.ts\",\"tests\":[{\"name\":\"parses basic for loop\",\"code\":\"for i=0, 99 do print, i\"},{\"name\":\"parses basic for loop with increment\",\"code\":\"for i=0, 99, 2 do !null = myFunc(i)\"},{\"name\":\"parses basic for loop with line continuation\",\"code\":[\"for i=0, jj do $\",\" print, i\"]},{\"name\":\"parses basic for loop with block\",\"code\":[\"for i=0, 99 do begin\",\" !null = myFunc(i)\",\"endfor\"]},{\"name\":\"parses nested for loop\",\"code\":\"for i=0, 99 do for j=0, 99 do print, i + j\"}]}","loops.foreach.spec.ts":"{\"suiteName\":\"Validates foreach loop parsing\",\"fileName\":\"loops.foreach.spec.ts\",\"tests\":[{\"name\":\"parses basic foreach loop\",\"code\":\"foreach val, arr do print, i\"},{\"name\":\"parses basic foreach loop with key\",\"code\":\"foreach val, arr, idx do !null = myFunc(i)\"},{\"name\":\"parses basic foreach loop with line continuation\",\"code\":[\"foreach val, arr do $\",\" print, i\"]},{\"name\":\"parses basic foreach loop with block\",\"code\":[\"foreach val, arr do begin\",\" !null = myFunc(i)\",\"endforeach\"]},{\"name\":\"parses nested foreach loop\",\"code\":\"foreach val, arr do foreach val2, val do print, val2\"}]}","loops.repeat.spec.ts":"{\"suiteName\":\"Validates repeat loop parsing\",\"fileName\":\"loops.repeat.spec.ts\",\"tests\":[{\"name\":\"parses basic repeat loop\",\"code\":\"REPEAT A = A * 2 UNTIL A GT B\"},{\"name\":\"parses procedure in repeat loop\",\"code\":\"REPEAT PRINT, A UNTIL A GT B\"},{\"name\":\"parses basic repeat loop with line continuations\",\"code\":[\"REPEAT A = $\",\" A * 2 UNTIL $\",\" A GT B\"]},{\"name\":\"parses basic repeat loop with block\",\"code\":[\"REPEAT BEGIN\",\" A = A * 2\",\"ENDREP UNTIL A GT B\"]},{\"name\":\"correctly parses loops with if statements inside\",\"code\":[\"repeat if !true then break until !true\"]}]}","loops.while.spec.ts":"{\"suiteName\":\"Validates while loop parsing\",\"fileName\":\"loops.while.spec.ts\",\"tests\":[{\"name\":\"parses basic while loop\",\"code\":\"while !true do print, i\"},{\"name\":\"parses basic nested while loop\",\"code\":\"while !true do while !false do print, i\"},{\"name\":\"parses basic while loop with line continuation\",\"code\":[\"while !true do $\",\" print, $\",\" i\"]},{\"name\":\"parses basic while loop with block\",\"code\":[\"while (a eq 5) do begin\",\" !null = myFunc(i)\",\"endwhile\"]}]}","methods.functions.spec.ts":"{\"suiteName\":\"Validates function method parsing\",\"fileName\":\"methods.functions.spec.ts\",\"tests\":[{\"name\":\"parses function methods with dots\",\"code\":\"!NULL = a.myFunc(1)\"},{\"name\":\"parses function methods with arrows\",\"code\":\"!NULL = a->myFunc(1)\"},{\"name\":\"parses super function methods with dots\",\"code\":\"a.super::myfunc(1)\"},{\"name\":\"parses super function methods with arrows\",\"code\":\"a->super::myfunc(a)\"},{\"name\":\"parses function methods with dots and line continuation\",\"code\":[\"!NULL = a.myFunc( $\",\" 1)\"]},{\"name\":\"single-character function method\",\"code\":\"a.b()\"}]}","methods.procedures.spec.ts":"{\"suiteName\":\"Validates procedure method parsing\",\"fileName\":\"methods.procedures.spec.ts\",\"tests\":[{\"name\":\"parses procedure methods with dots\",\"code\":\"a.myProc, 1\"},{\"name\":\"parses procedure methods with arrows\",\"code\":\"a->myProc, a\"},{\"name\":\"parses super procedure methods with dots\",\"code\":\"a.super::myProc, 1\"},{\"name\":\"parses super procedure methods with arrows\",\"code\":\"a->super::myProc, a\"},{\"name\":\"parses procedure methods with dots and line continuations\",\"code\":[\"a.myProc, $\",\" 1\"]},{\"name\":\"procedure method from IDL lib\",\"code\":[\"((*state).markers).Add, CGRAD_NEW_MARKER(POSITION=marker['position'], $\",\" COLOR=color, $\",\" MIDDLE=marker['middle'])\"]},{\"name\":\"single-character procedure method\",\"code\":\"a.b\"}]}","numbers.spec.ts":"{\"suiteName\":\"Validates special cases for number parsing\",\"fileName\":\"numbers.spec.ts\",\"tests\":[{\"name\":\"correctly parse scientific notations\",\"code\":[\"a = -1e34\",\"a = -1e34i\",\"a = -1e34j\"]},{\"name\":\"correctly parse scientific notations with negatives 1\",\"code\":[\"a = 1e-34\",\"a = 1e-34i\",\"a = 1e-34j\"]},{\"name\":\"correctly parse scientific notations with negatives 2\",\"code\":[\"a = 1e-\",\"a = 1e-i\",\"a = 1e-j\"]},{\"name\":\"correctly parse hex notation\",\"code\":[\"a = 0x8FFF + 0x8Fub + 0x8FulL\",\"a = 0x8FFFI + 0x8FubI + 0x8FulLi\",\"a = 0x8FFFJ + 0x8Fubj + 0x8FulLJ\"]},{\"name\":\"correctly parse octal notation\",\"code\":[\"a = 0o8FFF + 0o8Fub + 0o8FulL\",\"a = 0o8FFFI + 0o8FubI + 0o8FulLi\",\"a = 0o8FFFJ + 0o8Fubj + 0o8FulLJ\"]},{\"name\":\"correctly parse binary notation\",\"code\":[\"a = 0b8FFF + 0b8Fub + 0b8FulL\",\"a = 0b8FFFI + 0b8FubI + 0b8FulLi\",\"a = 0b8FFFJ + 0b8Fubj + 0b8FulLJ\"]},{\"name\":\"correctly parse scientific notations with doubles\",\"code\":[\"a = -1d34\",\"a = -1d34i\",\"a = -1d34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 1\",\"code\":[\"a = 1d-34\",\"a = 1d-34i\",\"a = 1d-34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 2\",\"code\":[\"a = 1d-\",\"a = 1d-i\",\"a = 1d-j\"]},{\"name\":\"correctly parse new syntax for complex\",\"code\":[\"a = 1i\",\"a = 1j\"]},{\"name\":\"catch unfinished dot statement 1\",\"code\":\"a.\"},{\"name\":\"catch unfinished dot statement 2\",\"code\":\"a = b.\"},{\"name\":\"catch standalone dot\",\"code\":\"a = .\"},{\"name\":\"edge case scientific\",\"code\":\"a = .1e+12\"},{\"name\":\"solo dot\",\"code\":\".\"}]}","number-string.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36 + \\\"45\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36b + \\\"45ull\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'b\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'x\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'o\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"b\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"x\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"o\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XS\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XS\"}]}","number-string.complex-i.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-i.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36i + \\\"45i\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bi + \\\"45ulli\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bi\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xi\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oi\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bi\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xi\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oi\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSi\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSi\"}]}","number-string.complex-j.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-j.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36j + \\\"45j\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bj + \\\"45ullj\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bj\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xj\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oj\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bj\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xj\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oj\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSj\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSj\"}]}","operators.compound.spec.ts":"{\"suiteName\":\"Validates compound operator parsing\",\"fileName\":\"operators.compound.spec.ts\",\"tests\":[{\"name\":\"parses with line continuation\",\"code\":[\"z *= $\",\" 5\"]},{\"name\":\"does not recurse with \\\"||\\\" operator\",\"code\":\"a || b || c\"},{\"name\":\"does not recurse with \\\"or\\\" operator\",\"code\":\"a or b or c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a && b && c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a and b and c\"}]}","operators.spec.ts":"{\"suiteName\":\"Validates operator parsing\",\"fileName\":\"operators.spec.ts\",\"tests\":[{\"name\":\"close on braces\",\"code\":\"{1+2}\"},{\"name\":\"close on brackets\",\"code\":\"[1+2]\"},{\"name\":\"close on parentheses\",\"code\":\"(1+2)\"},{\"name\":\"close on commas\",\"code\":\"1+2,3+4\"},{\"name\":\"close on then and else\",\"code\":\"if 1+2 then a = 3+4 else a = 4^3\"},{\"name\":\"close on do in loops\",\"code\":\"for i=0, 99-1 do print, i\"},{\"name\":\"operators with line continuations\",\"code\":[\"zach + $ \",\"awesome\"]},{\"name\":\"operators end on \\\"of\\\"\",\"code\":[\"case n_params()-1 of\",\" 0: call_method, method_name, oObj[i], _extra=e\",\" 1: call_method, method_name, oObj[i], p1, _extra=e\",\"endcase\"]},{\"name\":\"operators end on arrow function\",\"code\":\"*(*pState).pTitle->SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators end on procedure method\",\"code\":\"*pTitle.SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle.SetProperty(color=[255, 255, 255])\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle->SetProperty(color=[255, 255, 255])\"},{\"name\":\"special token for increment\",\"code\":[\"++a\",\"a++\"]},{\"name\":\"special token for decrement\",\"code\":[\"--a\",\"a+--\"]},{\"name\":\"next to each other\",\"code\":\"a = b++ + 5\"}]}","parentheses.spec.ts":"{\"suiteName\":\"Validates parentheses parsing\",\"fileName\":\"parentheses.spec.ts\",\"tests\":[{\"name\":\"parses standalone parentheses\",\"code\":\"(1 + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone parentheses with line continuation\",\"code\":[\"(1 + $ \",\" 2)\"]}]}","prompts.spec.ts":"{\"suiteName\":\"Validates prompt parsing\",\"fileName\":\"prompts.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\"IDL> print, 42\"},{\"name\":\"parses ENVI prompt\",\"code\":\"ENVI> print, 17\"}]}","properties.spec.ts":"{\"suiteName\":\"Validates property parsing\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"parses property assignment\",\"code\":\"a.thing = 5\"},{\"name\":\"parses property access\",\"code\":\"b = a.thing\"},{\"name\":\"parses property access with line continuation\",\"code\":[\"b = $\",\" a.thing\"]},{\"name\":\"parses nested property access\",\"code\":\"b = a.thing1.thing2\"},{\"name\":\"parses property access as arguments\",\"code\":\"myPro, a.thing, b.thing\"},{\"name\":\"property example from IDL lib\",\"code\":\"(*state).bottomSelection = lMarkers.Count()-1\"},{\"name\":\"structure property via indexing\",\"code\":\"a = b.(i)\"}]}","python.spec.ts":"{\"suiteName\":\"Validates Python code parsing\",\"fileName\":\"python.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\">>>import numpy as np\"}]}","quotes.spec.ts":"{\"suiteName\":\"Validates quote parsing\",\"fileName\":\"quotes.spec.ts\",\"tests\":[{\"name\":\"parses standalone single quotes\",\"code\":\"'myFunc(1 + 2)'\"},{\"name\":\"parses standalone double quotes\",\"code\":\"\\\"myFunc(1 + 2)\\\"\"},{\"name\":\"verify single quotes without closing\",\"code\":\"'string\"},{\"name\":\"verify double quotes without closing\",\"code\":\"\\\"string\"},{\"name\":\"confusing single quote\",\"code\":\"hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)\"},{\"name\":\"confusing double quote\",\"code\":\"hDefinition[\\\"schema\\\"]).StartsWith(\\\"IDLColorGradientDefinition\\\", /FOLD_CASE)\"},{\"name\":\"quotes end at important statements 1\",\"code\":[\"if \\\"bad-quote\\\"then \\\"bad-quote\\\"else\"]},{\"name\":\"quotes end at important statements 2\",\"code\":[\"case \\\"bad-quote\\\"of\"]},{\"name\":\"quotes end at important statements 3\",\"code\":[\"for \\\"bad-quote\\\"do\"]},{\"name\":\"quotes end at important statements 4\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"quotes end at important statements 5\",\"code\":[\"if 'bad-quote'then 'bad-quote'else\"]},{\"name\":\"quotes end at important statements 6\",\"code\":[\"case 'bad-quote'of\"]},{\"name\":\"quotes end at important statements 7\",\"code\":[\"for 'bad-quote'do\"]},{\"name\":\"quotes end at important statements 8\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"verifies quote vs number is correctly identified\",\"code\":[\"arr = [\\\"0.00000000\\\"]\"]}]}","quotes.escaped.spec.ts":"{\"suiteName\":\"Validates escaped quote parsing\",\"fileName\":\"quotes.escaped.spec.ts\",\"tests\":[{\"name\":\"simple single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d'\"},{\"name\":\"simple double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\"},{\"name\":\"complex single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d''lots of''other''string'\"},{\"name\":\"complex double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\\\"lots of\\\"\\\"other\\\"\\\"string\\\"\"}]}","quotes.edge-cases.spec.ts":"{\"suiteName\":\"Validates edge case quote parsing\",\"fileName\":\"quotes.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for number-string like strings\",\"code\":\"a = \\\"5\\\"\"}]}","routines.functions.spec.ts":"{\"suiteName\":\"Validates function parsing\",\"fileName\":\"routines.functions.spec.ts\",\"tests\":[{\"name\":\"parses standalone functions\",\"code\":\"myFunc(1 + 2)\"},{\"name\":\"parses nested functions\",\"code\":\"myFunc(myFunc2(_y7$) + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone functions with line continuations\",\"code\":[\"myFunc(1 $\",\" + 2)\"]},{\"name\":\"single-character function\",\"code\":\"a()\"}]}","routines.keywords.spec.ts":"{\"suiteName\":\"Validates keyword parsing\",\"fileName\":\"routines.keywords.spec.ts\",\"tests\":[{\"name\":\"parses keyword assignment\",\"code\":\"myfunc(a = 5)\"},{\"name\":\"parses multiple keywords\",\"code\":\"_otherfunc(a = 5, _b=42)\"},{\"name\":\"parses multiple keywords with line continuation\",\"code\":[\"myfunc(a = 5, $\",\" _b=42)\"]},{\"name\":\"parses keyword assignment with line continuation\",\"code\":[\"myfunc(a $\",\" = 5)\"]},{\"name\":\"parses variable assignment\",\"code\":\"_y = _superFunction(a = 5)\"}]}","routines.procedures.spec.ts":"{\"suiteName\":\"Validates procedure parsing\",\"fileName\":\"routines.procedures.spec.ts\",\"tests\":[{\"name\":\"parses standalone procedures\",\"code\":\"myPro, 1 + 2\"},{\"name\":\"separate pro from variables\",\"code\":\"myPro, arg1, arg2\"},{\"name\":\"pro with line continuations\",\"code\":[\"myPro, $\",\" arg1, arg2\"]},{\"name\":\"pro in loop after arguments and function\",\"code\":\"for i=0, 2*5-jello(1) do print, i\"},{\"name\":\"single-character procedure\",\"code\":\"a\"}]}","routines.spacing.spec.ts":"{\"suiteName\":\"Validates routine spacing\",\"fileName\":\"routines.spacing.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":\"myFunc (1 + 2)\"},{\"name\":\"procedures\",\"code\":\"mypro ,\"},{\"name\":\"function method (dots)\",\"code\":\"a . method ()\"},{\"name\":\"function method (arrow)\",\"code\":\"a -> method ()\"},{\"name\":\"procedure method 1 (dots)\",\"code\":\"a . method \"},{\"name\":\"procedure method 2 (dots)\",\"code\":\"a . method , \"},{\"name\":\"procedure method 1 (arrow)\",\"code\":\"a -> method \"},{\"name\":\"procedure method 2 (arrow)\",\"code\":\"a -> method , \"}]}","routines.definitions.1.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.1.spec.ts\",\"tests\":[{\"name\":\"verifies procedure with arguments and keywords\",\"code\":[\"PRO EndMagic, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies functions with arguments and keywords\",\"code\":[\"function myfunc, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies procedure method with arguments and keywords\",\"code\":[\"PRO myclass::mymethod, arg1, $ ; comment\",\" ; skip empty lines\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies function method with arguments and keywords\",\"code\":[\"function myfuncclass::mymethod, arg1, $ ; comment\",\"\",\" arg2, KW1 = $\",\"\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies more than one routine\",\"code\":[\"Function f1\",\" return, 5\",\"end\",\"\",\"pro p1\",\" print, 42\",\"end\"]}]}","routines.definitions.2.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.2.spec.ts\",\"tests\":[{\"name\":\"verifies we only stop on \\\"end\\\"\",\"code\":[\"PRO EndMagic, Unit, Id\",\" PRINTF, Unit\",\"END\"]},{\"name\":\"verifies we parse names with \\\"!\\\"\",\"code\":[\"pro !sosobad,\",\"END\"]},{\"name\":\"verifies we parse method names with \\\"!\\\"\",\"code\":[\"pro !sosobad::method,\",\"END\"]},{\"name\":\"routines in a very bad single-line\",\"code\":\"FUNCTION VarName, Ptr & RETURN,'' & END\"}]}","string-literal.spec.ts":"{\"suiteName\":\"Verify string literal processing\",\"fileName\":\"string-literal.spec.ts\",\"tests\":[{\"name\":\"simple with substitution\",\"code\":\"a = `my string with ${expression + 5}`\"},{\"name\":\"simple without substitution\",\"code\":\"a = `my string without substitution`\"},{\"name\":\"properly capture nested literals\",\"code\":\"a = `start ${ `nested` } else`\"},{\"name\":\"complex nested case\",\"code\":\"a = `something ${func(a = b, `nested`, /kw) + 6*12} else ${5*5 + `something` + nested} some`\"},{\"name\":\"parse escaped backticks\",\"code\":\"a = `something \\\\` included `\"},{\"name\":\"preserve spacing when extracting tokens\",\"code\":\"a = ` first `\"},{\"name\":\"template literal string with formatting\",\"code\":\"a = `${1.234,\\\"%10.3f\\\"}`\"}]}","string-literal.multiline.spec.ts":"{\"suiteName\":\"Verify string literal processing with multi-line statements\",\"fileName\":\"string-literal.multiline.spec.ts\",\"tests\":[{\"name\":\"preserve spacing and handle multi-line string literals\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"last`\",\"end\"]}]}","string-literal.escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"string-literal.escape.spec.ts\",\"tests\":[{\"name\":\"for syntax highlighting\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"a = `\\\\a `\",\"end\"]}]}","structures.1.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.1.spec.ts\",\"tests\":[{\"name\":\"verifies simplest structure parsing\",\"code\":\"_z5$ = {thing}\"},{\"name\":\"verifies multi-line structure name parsing\",\"code\":[\"_17$ = { $\",\" thing}\"]},{\"name\":\"verifies simplest property parsing without structure name\",\"code\":\"_17$ = {thing:z}\"},{\"name\":\"verifies simplest property parsing without structure name and line continuation\",\"code\":[\"_17$ = { $\",\" thing:z}\"]},{\"name\":\"verifies simplest nested structure parsing\",\"code\":\"_z5$ = {thing1:{thing2:z}}\"},{\"name\":\"verifies structure with inheritance\",\"code\":\"_z5$ = {thing, inherits _jklol}\"},{\"name\":\"verifies all components in single-line\",\"code\":\"a17 = {_th1g, abc:def, b:5, c:f()}\"}]}","structures.2.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.2.spec.ts\",\"tests\":[{\"name\":\"verifies multiple structure names (even though wrong syntax)\",\"code\":\"a = {one,two,three,inherits thing, inherits other, prop:5} ; comment\"},{\"name\":\"verifies nested structures, line continuations, and comments\",\"code\":[\"_17$ = { $ ; something\",\" thing: {name, some:value}}\"]},{\"name\":\"verifies weird syntax for named structures\",\"code\":[\"new_event = {FILESEL_EVENT, parent, ev.top, 0L, $\",\"path+filename, 0L, theFilter}\"]},{\"name\":\"structure names with exclamation points\",\"code\":\"a = {!exciting}\"},{\"name\":\"structure names and then line continuation\",\"code\":\"void = {mlLabelingTool_GraphicOverlay $\"},{\"name\":\"inherits supports spaces\",\"code\":[\" void = {IDLitDataIDLArray2D, $\",\" inherits IDLitData}\"]}]}","unexpected.1.spec.ts":"{\"suiteName\":\"Validates unexpected closer parsing\",\"fileName\":\"unexpected.1.spec.ts\",\"tests\":[{\"name\":\"verifies we catch unexpected closers (other tests cover correctly catching real closers instead of these)\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]}]}","unknown.spec.ts":"{\"suiteName\":\"Validates unknown token parsing\",\"fileName\":\"unknown.spec.ts\",\"tests\":[{\"name\":\"improper arrow function\",\"code\":\"sEvent.component-> $\"},{\"name\":\"text after comment\",\"code\":\"a = $ bad bad\"},{\"name\":\"unknown has right positioning with zero-width matches\",\"code\":\"scale=scale, $, $\"}]}"},"auto-textmate-tests":{"assignment.spec.ts":"{\"suiteName\":\"Validates assignment parsing\",\"fileName\":\"assignment.spec.ts\",\"tests\":[{\"name\":\"parses variable assignment\",\"code\":\"a = 5\"},{\"name\":\"parses system variable assignment\",\"code\":\"!null = 5\"},{\"name\":\"brackets with assignment\",\"code\":\"a[i] = b\"},{\"name\":\"parses variable assignment with line continuation\",\"code\":[\"z = $\",\" 5\"]},{\"name\":\"assignment with parentheses\",\"code\":\"(b) = 15\"},{\"name\":\"procedure after assignment in loop and keyword\",\"code\":\"for i=0, myFunc(a=42) do print, i\"}]}","blocks.spec.ts":"{\"suiteName\":\"Validates block parsing auto-closes\",\"fileName\":\"blocks.spec.ts\",\"tests\":[{\"name\":\"lib example from kruskal_wallis.pro\",\"code\":[\"\",\"if !true then $\",\"\",\"while !true DO BEGIN\",\" a = 42 \",\"ENDWHILE $\",\"\",\"ELSE stop = stop+1\",\"end\"]}]}","brackets.spec.ts":"{\"suiteName\":\"Validates bracket parsing\",\"fileName\":\"brackets.spec.ts\",\"tests\":[{\"name\":\"parses standalone brackets\",\"code\":\"[1 + 2]\"},{\"name\":\"parses standalone brackets with line continuations\",\"code\":[\"[1 + $\",\" 2]\"]},{\"name\":\"indexing and compound expression\",\"code\":\"array1[1 + 2] * (1 + 2)\"},{\"name\":\"brackets with assignment\",\"code\":\"_a[i] = 5 * b\"},{\"name\":\"brackets with compound assignment\",\"code\":\"_aA$[i] *= b\"}]}","colon.spec.ts":"{\"suiteName\":\"Validates colon parsing\",\"fileName\":\"colon.spec.ts\",\"tests\":[{\"name\":\"simple colon test\",\"code\":\"[:]\"},{\"name\":\"array indexing\",\"code\":\"a[0:I] = 42\"}]}","commas.spec.ts":"{\"suiteName\":\"Validates comma parsing (mostly covered elsewhere)\",\"fileName\":\"commas.spec.ts\",\"tests\":[{\"name\":\"don't find commas on their own\",\"code\":\",\"},{\"name\":\"find commas in function\",\"code\":\"f(,)\"},{\"name\":\"find commas in pro\",\"code\":\"p,\"}]}","comments.spec.ts":"{\"suiteName\":\"Validates comment parsing\",\"fileName\":\"comments.spec.ts\",\"tests\":[{\"name\":\"parses simple comments\",\"code\":\" ; something()\"},{\"name\":\"parses code with comments at the end\",\"code\":\"a = b() ; something()\"},{\"name\":\"parses simple comments with TODO\",\"code\":\" ; TODO: something()\"},{\"name\":\"parses code with comments at the end with TODO\",\"code\":\"a = b() ; TODO: something()\"},{\"name\":\"parses code with comments and line continuations\",\"code\":[\"a = $ ; TODO: something()\",\" b()\"]}]}","control.1.spec.ts":"{\"suiteName\":\"Validates control statement parsing\",\"fileName\":\"control.1.spec.ts\",\"tests\":[{\"name\":\"parses basic control statements\",\"code\":[\"break\",\"continue\",\"jump: a = func()\",\"jump: mypro, $\",\" 5\",\"jumpy17$: ;comment\"]},{\"name\":\"parses break in if statements\",\"code\":\"if !true then break\"},{\"name\":\"parses continue in if statements\",\"code\":\"if !true then continue\"},{\"name\":\"parses continue and break in loops\",\"code\":[\"for i=0,99 do begin\",\" continue\",\" break\",\"endfor\"]},{\"name\":\"parses jump in blocks\",\"code\":[\"for i=0,99 do begin\",\" jump:\",\"endfor\"]},{\"name\":\"parses compound control statements\",\"code\":[\"common, group, var1, var2, var3 ; comment\",\"compile_opt, idl2, $ ; line continuation\",\" hidden\",\"compile_opt\",\"forward_function, idl2, hidden\",\"goto, label\"]},{\"name\":\"goto in in statement\",\"code\":\"if not wild then goto, done else printf, outunit\"},{\"name\":\"statements end at line separator\",\"code\":\"GOTO, do_six & END\"}]}","executive-command.spec.ts":"{\"suiteName\":\"Validates executive command parsing\",\"fileName\":\"executive-command.spec.ts\",\"tests\":[{\"name\":\"simple 1\",\"code\":\".compile\"},{\"name\":\"simple 2\",\"code\":\".run myfile.pro\"},{\"name\":\"simple 3 start with spaces\",\"code\":\" .run myfile.pro\"},{\"name\":\"ignore methods\",\"code\":\"obj.method\"},{\"name\":\"ignore properties\",\"code\":\"!null = obj.method\"}]}","include.spec.ts":"{\"suiteName\":\"Validates include statements, but not correct location\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"basic test\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"find in loops\",\"code\":\"for i=0,99 do @very_wrong\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"},{\"name\":\"don't capture afterwards\",\"code\":\"@include.pro ; comment\"}]}","lambda.spec.ts":"{\"suiteName\":\"Validates lambda functions parsed as special token\",\"fileName\":\"lambda.spec.ts\",\"tests\":[{\"name\":\"correctly parse lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","line-modifiers.spec.ts":"{\"suiteName\":\"Validates line modifier (separators)\",\"fileName\":\"line-modifiers.spec.ts\",\"tests\":[{\"name\":\"parses multi-line as single-line\",\"code\":[\"a = a + b() & proc & a.procMethod,1 & $\",\"a={struct}\"]},{\"name\":\"loops properly stop in line modifier\",\"code\":[\"proc & for i=0,99 do print, i & while !true do b = awesome() & foreach val, b, key do print, key, val & endedit\"]},{\"name\":\"line separators in case statement\",\"code\":[\"CASE typ OF\",\" 7: begin val = \\\"\\\" & cnt = 1 & endcase\",\" 8: val = tiff_sint(val, 0, len=cnt)\",\"ENDCASE\"]},{\"name\":\"verifies nested line continuations use basic token\",\"code\":\"scale=scale, $, $\"}]}","logic.if-then-else.1.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [1]\",\"fileName\":\"logic.if-then-else.1.spec.ts\",\"tests\":[{\"name\":\"parses basic if-then loop\",\"code\":\"if !true then print, 'yes'\"},{\"name\":\"parses basic if-then-else loop\",\"code\":\"if ~doIt then print, 'yes' else a = yellow()\"},{\"name\":\"parses basic if-then loop with line continuation 1\",\"code\":[\"if !true $\",\" then print, 'yes'\"]},{\"name\":\"parses basic if-then loop with line continuation 2\",\"code\":[\"if !true $\",\" then print $\",\" , 'yes'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 1\",\"code\":[\"if !true then print, 'yes' $\",\" else print, 'no'\"]},{\"name\":\"parses basic if-then-else loop with line continuation 2\",\"code\":[\"if !true then print, 'yes' $\",\" else $\",\" print, 'no'\"]},{\"name\":\"nested if-then-else\",\"code\":\"if ~(myFunc(_a17$) * 2) then if !false then print, 'yes'\"}]}","logic.if-then-else.2.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [2]\",\"fileName\":\"logic.if-then-else.2.spec.ts\",\"tests\":[{\"name\":\"with blocks [1]\",\"code\":[\"if a++ then begin\",\" super = awesome()\",\"endif else print, 'else'\"]}]}","logic.if-then-else.3.spec.ts":"{\"suiteName\":\"Validates for if-then-else parsing [3]\",\"fileName\":\"logic.if-then-else.3.spec.ts\",\"tests\":[{\"name\":\"example from IDL code [1]\",\"code\":\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\"},{\"name\":\"example from IDL code [2]\",\"code\":[\"if (ISA(equation)) then begin\",\" graphic.SetProperty, EQUATION=equation\",\" arg1 = equation\",\" if (ISA(style)) then arg2 = style\",\"endif\"]},{\"name\":\"example from IDL code [3]\",\"code\":[\"IF (nms[i-1, j] && ~marked[i-1, j]) THEN $\",\" canny_follow, i-1, j, nms, marked\"]},{\"name\":\"example from IDL code [4]\",\"code\":[\"IF (max(step) && ~n_elements(stepflag)) THEN $\",\" suppMag = nmsupp_mask * mag\"]},{\"name\":\"example from IDL code [5]\",\"code\":[\"if (~Isa(hDefinition, 'Hash') || $\",\" ~hDefinition.HasKey('schema') || $\",\" ~(hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)) then begin\",\" message, 'File does not contain a valid color gradient definition.', /NONAME \",\"endif\"]}]}","logic.case.1.spec.ts":"{\"suiteName\":\"Validates case statement\",\"fileName\":\"logic.case.1.spec.ts\",\"tests\":[{\"name\":\"parses case loop with many syntaxes\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\"]},{\"name\":\"nested case statement\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\"]}]}","logic.switch.1.spec.ts":"{\"suiteName\":\"Validates switch statement\",\"fileName\":\"logic.switch.1.spec.ts\",\"tests\":[{\"name\":\"parses switch loop with many syntaxes\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\"ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDSWITCH\"]},{\"name\":\"nested switch statement\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" SWITCH x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDSWITCH\",\"END\",\"ENDSWITCH\"]}]}","logic.ternary.1.spec.ts":"{\"suiteName\":\"Validates for ternary statement parsing\",\"fileName\":\"logic.ternary.1.spec.ts\",\"tests\":[{\"name\":\"simplest ternary statement\",\"code\":\"a = something ? 5 : 6\"},{\"name\":\"nested ternary statement grouped\",\"code\":\"a = !true ? (!false ? 7 : 8) : 6\"},{\"name\":\"nested ternary statement without grouping\",\"code\":\"mypro, something ? ~something ? 7 : 8 : 6, 2\"},{\"name\":\"ternary as argument\",\"code\":\"a = myfunc(something ? otherfunc() : !awesomesauce) + 3\"},{\"name\":\"operators end on ternary statements\",\"code\":\"a = 5*something ? 5- 4 : 6^3\"},{\"name\":\"multi-line ternary 1\",\"code\":[\"a = _myvar $\",\" ? 'jello' : \\\"jelly\\\"\"]},{\"name\":\"multi-line ternary 2\",\"code\":[\"a = myfunc( $\",\" a,b,c) ? b4d $\",\" : $\",\" s1nt4x3x4mple\"]},{\"name\":\"ternary works in braces as expected\",\"code\":[\"_17 = arr[!true ? 0 : -3: -1]\"]}]}","loops.for.spec.ts":"{\"suiteName\":\"Validates for loop parsing\",\"fileName\":\"loops.for.spec.ts\",\"tests\":[{\"name\":\"parses basic for loop\",\"code\":\"for i=0, 99 do print, i\"},{\"name\":\"parses basic for loop with increment\",\"code\":\"for i=0, 99, 2 do !null = myFunc(i)\"},{\"name\":\"parses basic for loop with line continuation\",\"code\":[\"for i=0, jj do $\",\" print, i\"]},{\"name\":\"parses basic for loop with block\",\"code\":[\"for i=0, 99 do begin\",\" !null = myFunc(i)\",\"endfor\"]},{\"name\":\"parses nested for loop\",\"code\":\"for i=0, 99 do for j=0, 99 do print, i + j\"}]}","loops.foreach.spec.ts":"{\"suiteName\":\"Validates foreach loop parsing\",\"fileName\":\"loops.foreach.spec.ts\",\"tests\":[{\"name\":\"parses basic foreach loop\",\"code\":\"foreach val, arr do print, i\"},{\"name\":\"parses basic foreach loop with key\",\"code\":\"foreach val, arr, idx do !null = myFunc(i)\"},{\"name\":\"parses basic foreach loop with line continuation\",\"code\":[\"foreach val, arr do $\",\" print, i\"]},{\"name\":\"parses basic foreach loop with block\",\"code\":[\"foreach val, arr do begin\",\" !null = myFunc(i)\",\"endforeach\"]},{\"name\":\"parses nested foreach loop\",\"code\":\"foreach val, arr do foreach val2, val do print, val2\"}]}","loops.repeat.spec.ts":"{\"suiteName\":\"Validates repeat loop parsing\",\"fileName\":\"loops.repeat.spec.ts\",\"tests\":[{\"name\":\"parses basic repeat loop\",\"code\":\"REPEAT A = A * 2 UNTIL A GT B\"},{\"name\":\"parses procedure in repeat loop\",\"code\":\"REPEAT PRINT, A UNTIL A GT B\"},{\"name\":\"parses basic repeat loop with line continuations\",\"code\":[\"REPEAT A = $\",\" A * 2 UNTIL $\",\" A GT B\"]},{\"name\":\"parses basic repeat loop with block\",\"code\":[\"REPEAT BEGIN\",\" A = A * 2\",\"ENDREP UNTIL A GT B\"]},{\"name\":\"correctly parses loops with if statements inside\",\"code\":[\"repeat if !true then break until !true\"]}]}","loops.while.spec.ts":"{\"suiteName\":\"Validates while loop parsing\",\"fileName\":\"loops.while.spec.ts\",\"tests\":[{\"name\":\"parses basic while loop\",\"code\":\"while !true do print, i\"},{\"name\":\"parses basic nested while loop\",\"code\":\"while !true do while !false do print, i\"},{\"name\":\"parses basic while loop with line continuation\",\"code\":[\"while !true do $\",\" print, $\",\" i\"]},{\"name\":\"parses basic while loop with block\",\"code\":[\"while (a eq 5) do begin\",\" !null = myFunc(i)\",\"endwhile\"]}]}","methods.functions.spec.ts":"{\"suiteName\":\"Validates function method parsing\",\"fileName\":\"methods.functions.spec.ts\",\"tests\":[{\"name\":\"parses function methods with dots\",\"code\":\"!NULL = a.myFunc(1)\"},{\"name\":\"parses function methods with arrows\",\"code\":\"!NULL = a->myFunc(1)\"},{\"name\":\"parses super function methods with dots\",\"code\":\"a.super::myfunc(1)\"},{\"name\":\"parses super function methods with arrows\",\"code\":\"a->super::myfunc(a)\"},{\"name\":\"parses function methods with dots and line continuation\",\"code\":[\"!NULL = a.myFunc( $\",\" 1)\"]},{\"name\":\"single-character function method\",\"code\":\"a.b()\"}]}","methods.procedures.spec.ts":"{\"suiteName\":\"Validates procedure method parsing\",\"fileName\":\"methods.procedures.spec.ts\",\"tests\":[{\"name\":\"parses procedure methods with dots\",\"code\":\"a.myProc, 1\"},{\"name\":\"parses procedure methods with arrows\",\"code\":\"a->myProc, a\"},{\"name\":\"parses super procedure methods with dots\",\"code\":\"a.super::myProc, 1\"},{\"name\":\"parses super procedure methods with arrows\",\"code\":\"a->super::myProc, a\"},{\"name\":\"parses procedure methods with dots and line continuations\",\"code\":[\"a.myProc, $\",\" 1\"]},{\"name\":\"procedure method from IDL lib\",\"code\":[\"((*state).markers).Add, CGRAD_NEW_MARKER(POSITION=marker['position'], $\",\" COLOR=color, $\",\" MIDDLE=marker['middle'])\"]},{\"name\":\"single-character procedure method\",\"code\":\"a.b\"}]}","numbers.spec.ts":"{\"suiteName\":\"Validates special cases for number parsing\",\"fileName\":\"numbers.spec.ts\",\"tests\":[{\"name\":\"correctly parse scientific notations\",\"code\":[\"a = -1e34\",\"a = -1e34i\",\"a = -1e34j\"]},{\"name\":\"correctly parse scientific notations with negatives 1\",\"code\":[\"a = 1e-34\",\"a = 1e-34i\",\"a = 1e-34j\"]},{\"name\":\"correctly parse scientific notations with negatives 2\",\"code\":[\"a = 1e-\",\"a = 1e-i\",\"a = 1e-j\"]},{\"name\":\"correctly parse hex notation\",\"code\":[\"a = 0x8FFF + 0x8Fub + 0x8FulL\",\"a = 0x8FFFI + 0x8FubI + 0x8FulLi\",\"a = 0x8FFFJ + 0x8Fubj + 0x8FulLJ\"]},{\"name\":\"correctly parse octal notation\",\"code\":[\"a = 0o8FFF + 0o8Fub + 0o8FulL\",\"a = 0o8FFFI + 0o8FubI + 0o8FulLi\",\"a = 0o8FFFJ + 0o8Fubj + 0o8FulLJ\"]},{\"name\":\"correctly parse binary notation\",\"code\":[\"a = 0b8FFF + 0b8Fub + 0b8FulL\",\"a = 0b8FFFI + 0b8FubI + 0b8FulLi\",\"a = 0b8FFFJ + 0b8Fubj + 0b8FulLJ\"]},{\"name\":\"correctly parse scientific notations with doubles\",\"code\":[\"a = -1d34\",\"a = -1d34i\",\"a = -1d34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 1\",\"code\":[\"a = 1d-34\",\"a = 1d-34i\",\"a = 1d-34j\"]},{\"name\":\"correctly parse scientific notations with doubles with negatives 2\",\"code\":[\"a = 1d-\",\"a = 1d-i\",\"a = 1d-j\"]},{\"name\":\"correctly parse new syntax for complex\",\"code\":[\"a = 1i\",\"a = 1j\"]},{\"name\":\"catch unfinished dot statement 1\",\"code\":\"a.\"},{\"name\":\"catch unfinished dot statement 2\",\"code\":\"a = b.\"},{\"name\":\"catch standalone dot\",\"code\":\"a = .\"},{\"name\":\"edge case scientific\",\"code\":\"a = .1e+12\"},{\"name\":\"solo dot\",\"code\":\".\"}]}","number-string.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36 + \\\"45\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36b + \\\"45ull\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'b\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'x\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'o\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"b\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"x\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"o\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XS\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XS\"}]}","number-string.complex-i.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-i.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36i + \\\"45i\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bi + \\\"45ulli\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bi\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xi\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oi\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bi\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xi\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oi\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSi\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSi\"}]}","number-string.complex-j.spec.ts":"{\"suiteName\":\"Validates special cases for number string parsing\",\"fileName\":\"number-string.complex-j.spec.ts\",\"tests\":[{\"name\":\"verify octal parsing\",\"code\":\"\\\"36j + \\\"45j\"},{\"name\":\"verify octal parsing\",\"code\":\"\\\"36bj + \\\"45ullj\"},{\"name\":\"verify single quote binary\",\"code\":\"'101010'bj\"},{\"name\":\"verify single quote hex\",\"code\":\"'10101'xj\"},{\"name\":\"verify single quote octal\",\"code\":\"'10101'oj\"},{\"name\":\"verify double quote binary\",\"code\":\"\\\"101010\\\"bj\"},{\"name\":\"verify double quote hex\",\"code\":\"\\\"10101\\\"xj\"},{\"name\":\"verify double quote octal\",\"code\":\"\\\"10101\\\"oj\"},{\"name\":\"verify case as hex\",\"code\":\"'7FFF'XSj\"},{\"name\":\"verify case as hex\",\"code\":\"'8FFF'XSj\"}]}","operators.compound.spec.ts":"{\"suiteName\":\"Validates compound operator parsing\",\"fileName\":\"operators.compound.spec.ts\",\"tests\":[{\"name\":\"parses with line continuation\",\"code\":[\"z *= $\",\" 5\"]},{\"name\":\"does not recurse with \\\"||\\\" operator\",\"code\":\"a || b || c\"},{\"name\":\"does not recurse with \\\"or\\\" operator\",\"code\":\"a or b or c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a && b && c\"},{\"name\":\"captures all statements with \\\"&&\\\" operator\",\"code\":\"a and b and c\"}]}","operators.spec.ts":"{\"suiteName\":\"Validates operator parsing\",\"fileName\":\"operators.spec.ts\",\"tests\":[{\"name\":\"close on braces\",\"code\":\"{1+2}\"},{\"name\":\"close on brackets\",\"code\":\"[1+2]\"},{\"name\":\"close on parentheses\",\"code\":\"(1+2)\"},{\"name\":\"close on commas\",\"code\":\"1+2,3+4\"},{\"name\":\"close on then and else\",\"code\":\"if 1+2 then a = 3+4 else a = 4^3\"},{\"name\":\"close on do in loops\",\"code\":\"for i=0, 99-1 do print, i\"},{\"name\":\"operators with line continuations\",\"code\":[\"zach + $ \",\"awesome\"]},{\"name\":\"operators end on \\\"of\\\"\",\"code\":[\"case n_params()-1 of\",\" 0: call_method, method_name, oObj[i], _extra=e\",\" 1: call_method, method_name, oObj[i], p1, _extra=e\",\"endcase\"]},{\"name\":\"operators end on arrow function\",\"code\":\"*(*pState).pTitle->SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators end on procedure method\",\"code\":\"*pTitle.SetProperty, color=[255, 255, 255]\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle.SetProperty(color=[255, 255, 255])\"},{\"name\":\"operators do not end on function method\",\"code\":\"*pTitle->SetProperty(color=[255, 255, 255])\"},{\"name\":\"special token for increment\",\"code\":[\"++a\",\"a++\"]},{\"name\":\"special token for decrement\",\"code\":[\"--a\",\"a+--\"]},{\"name\":\"next to each other\",\"code\":\"a = b++ + 5\"}]}","parentheses.spec.ts":"{\"suiteName\":\"Validates parentheses parsing\",\"fileName\":\"parentheses.spec.ts\",\"tests\":[{\"name\":\"parses standalone parentheses\",\"code\":\"(1 + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone parentheses with line continuation\",\"code\":[\"(1 + $ \",\" 2)\"]}]}","prompts.spec.ts":"{\"suiteName\":\"Validates prompt parsing\",\"fileName\":\"prompts.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\"IDL> print, 42\"},{\"name\":\"parses ENVI prompt\",\"code\":\"ENVI> print, 17\"}]}","properties.spec.ts":"{\"suiteName\":\"Validates property parsing\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"parses property assignment\",\"code\":\"a.thing = 5\"},{\"name\":\"parses property access\",\"code\":\"b = a.thing\"},{\"name\":\"parses property access with line continuation\",\"code\":[\"b = $\",\" a.thing\"]},{\"name\":\"parses nested property access\",\"code\":\"b = a.thing1.thing2\"},{\"name\":\"parses property access as arguments\",\"code\":\"myPro, a.thing, b.thing\"},{\"name\":\"property example from IDL lib\",\"code\":\"(*state).bottomSelection = lMarkers.Count()-1\"},{\"name\":\"structure property via indexing\",\"code\":\"a = b.(i)\"}]}","python.spec.ts":"{\"suiteName\":\"Validates Python code parsing\",\"fileName\":\"python.spec.ts\",\"tests\":[{\"name\":\"parses IDL prompt\",\"code\":\">>>import numpy as np\"}]}","quotes.spec.ts":"{\"suiteName\":\"Validates quote parsing\",\"fileName\":\"quotes.spec.ts\",\"tests\":[{\"name\":\"parses standalone single quotes\",\"code\":\"'myFunc(1 + 2)'\"},{\"name\":\"parses standalone double quotes\",\"code\":\"\\\"myFunc(1 + 2)\\\"\"},{\"name\":\"verify single quotes without closing\",\"code\":\"'string\"},{\"name\":\"verify double quotes without closing\",\"code\":\"\\\"string\"},{\"name\":\"confusing single quote\",\"code\":\"hDefinition['schema']).StartsWith('IDLColorGradientDefinition', /FOLD_CASE)\"},{\"name\":\"confusing double quote\",\"code\":\"hDefinition[\\\"schema\\\"]).StartsWith(\\\"IDLColorGradientDefinition\\\", /FOLD_CASE)\"},{\"name\":\"quotes end at important statements 1\",\"code\":[\"if \\\"bad-quote\\\"then \\\"bad-quote\\\"else\"]},{\"name\":\"quotes end at important statements 2\",\"code\":[\"case \\\"bad-quote\\\"of\"]},{\"name\":\"quotes end at important statements 3\",\"code\":[\"for \\\"bad-quote\\\"do\"]},{\"name\":\"quotes end at important statements 4\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"quotes end at important statements 5\",\"code\":[\"if 'bad-quote'then 'bad-quote'else\"]},{\"name\":\"quotes end at important statements 6\",\"code\":[\"case 'bad-quote'of\"]},{\"name\":\"quotes end at important statements 7\",\"code\":[\"for 'bad-quote'do\"]},{\"name\":\"quotes end at important statements 8\",\"code\":[\"repeat 'bad-quote'until\"]},{\"name\":\"verifies quote vs number is correctly identified\",\"code\":[\"arr = [\\\"0.00000000\\\"]\"]}]}","quotes.escaped.spec.ts":"{\"suiteName\":\"Validates escaped quote parsing\",\"fileName\":\"quotes.escaped.spec.ts\",\"tests\":[{\"name\":\"simple single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d'\"},{\"name\":\"simple double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\"},{\"name\":\"complex single quote\",\"code\":\"'Resolve_Routine, ''%s'', Is_Function=%d''lots of''other''string'\"},{\"name\":\"complex double quote\",\"code\":\"\\\"Resolve_Routine, \\\"\\\"%s\\\"\\\", Is_Function=%d\\\"\\\"lots of\\\"\\\"other\\\"\\\"string\\\"\"}]}","quotes.edge-cases.spec.ts":"{\"suiteName\":\"Validates edge case quote parsing\",\"fileName\":\"quotes.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for number-string like strings\",\"code\":\"a = \\\"5\\\"\"}]}","routines.functions.spec.ts":"{\"suiteName\":\"Validates function parsing\",\"fileName\":\"routines.functions.spec.ts\",\"tests\":[{\"name\":\"parses standalone functions\",\"code\":\"myFunc(1 + 2)\"},{\"name\":\"parses nested functions\",\"code\":\"myFunc(myFunc2(_y7$) + 2)\"},{\"name\":\"separate function from parentheses\",\"code\":\"myFunc(1 + 2) * (1 + 2)\"},{\"name\":\"parses standalone functions with line continuations\",\"code\":[\"myFunc(1 $\",\" + 2)\"]},{\"name\":\"single-character function\",\"code\":\"a()\"}]}","routines.keywords.spec.ts":"{\"suiteName\":\"Validates keyword parsing\",\"fileName\":\"routines.keywords.spec.ts\",\"tests\":[{\"name\":\"parses keyword assignment\",\"code\":\"myfunc(a = 5)\"},{\"name\":\"parses multiple keywords\",\"code\":\"_otherfunc(a = 5, _b=42)\"},{\"name\":\"parses multiple keywords with line continuation\",\"code\":[\"myfunc(a = 5, $\",\" _b=42)\"]},{\"name\":\"parses keyword assignment with line continuation\",\"code\":[\"myfunc(a $\",\" = 5)\"]},{\"name\":\"parses variable assignment\",\"code\":\"_y = _superFunction(a = 5)\"}]}","routines.procedures.spec.ts":"{\"suiteName\":\"Validates procedure parsing\",\"fileName\":\"routines.procedures.spec.ts\",\"tests\":[{\"name\":\"parses standalone procedures\",\"code\":\"myPro, 1 + 2\"},{\"name\":\"separate pro from variables\",\"code\":\"myPro, arg1, arg2\"},{\"name\":\"pro with line continuations\",\"code\":[\"myPro, $\",\" arg1, arg2\"]},{\"name\":\"pro in loop after arguments and function\",\"code\":\"for i=0, 2*5-jello(1) do print, i\"},{\"name\":\"single-character procedure\",\"code\":\"a\"}]}","routines.spacing.spec.ts":"{\"suiteName\":\"Validates routine spacing\",\"fileName\":\"routines.spacing.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":\"myFunc (1 + 2)\"},{\"name\":\"procedures\",\"code\":\"mypro ,\"},{\"name\":\"function method (dots)\",\"code\":\"a . method ()\"},{\"name\":\"function method (arrow)\",\"code\":\"a -> method ()\"},{\"name\":\"procedure method 1 (dots)\",\"code\":\"a . method \"},{\"name\":\"procedure method 2 (dots)\",\"code\":\"a . method , \"},{\"name\":\"procedure method 1 (arrow)\",\"code\":\"a -> method \"},{\"name\":\"procedure method 2 (arrow)\",\"code\":\"a -> method , \"}]}","routines.definitions.1.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.1.spec.ts\",\"tests\":[{\"name\":\"verifies procedure with arguments and keywords\",\"code\":[\"PRO EndMagic, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies functions with arguments and keywords\",\"code\":[\"function myfunc, arg1, $ ; comment\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies procedure method with arguments and keywords\",\"code\":[\"PRO myclass::mymethod, arg1, $ ; comment\",\" ; skip empty lines\",\" arg2, KW1 = $\",\" kw1, KW2 = kw2\",\"\",\"END\"]},{\"name\":\"verifies function method with arguments and keywords\",\"code\":[\"function myfuncclass::mymethod, arg1, $ ; comment\",\"\",\" arg2, KW1 = $\",\"\",\" kw1, KW2 = kw2\",\"\",\"end\"]},{\"name\":\"verifies more than one routine\",\"code\":[\"Function f1\",\" return, 5\",\"end\",\"\",\"pro p1\",\" print, 42\",\"end\"]}]}","routines.definitions.2.spec.ts":"{\"suiteName\":\"Validates routine parsing\",\"fileName\":\"routines.definitions.2.spec.ts\",\"tests\":[{\"name\":\"verifies we only stop on \\\"end\\\"\",\"code\":[\"PRO EndMagic, Unit, Id\",\" PRINTF, Unit\",\"END\"]},{\"name\":\"verifies we parse names with \\\"!\\\"\",\"code\":[\"pro !sosobad,\",\"END\"]},{\"name\":\"verifies we parse method names with \\\"!\\\"\",\"code\":[\"pro !sosobad::method,\",\"END\"]},{\"name\":\"routines in a very bad single-line\",\"code\":\"FUNCTION VarName, Ptr & RETURN,'' & END\"}]}","string-literal.spec.ts":"{\"suiteName\":\"Verify string literal processing\",\"fileName\":\"string-literal.spec.ts\",\"tests\":[{\"name\":\"simple with substitution\",\"code\":\"a = `my string with ${expression + 5}`\"},{\"name\":\"simple without substitution\",\"code\":\"a = `my string without substitution`\"},{\"name\":\"properly capture nested literals\",\"code\":\"a = `start ${ `nested` } else`\"},{\"name\":\"complex nested case\",\"code\":\"a = `something ${func(a = b, `nested`, /kw) + 6*12} else ${5*5 + `something` + nested} some`\"},{\"name\":\"parse escaped backticks\",\"code\":\"a = `something \\\\` included `\"},{\"name\":\"preserve spacing when extracting tokens\",\"code\":\"a = ` first `\"},{\"name\":\"template literal string with formatting\",\"code\":\"a = `${1.234,\\\"%10.3f\\\"}`\"}]}","string-literal.multiline.spec.ts":"{\"suiteName\":\"Verify string literal processing with multi-line statements\",\"fileName\":\"string-literal.multiline.spec.ts\",\"tests\":[{\"name\":\"preserve spacing and handle multi-line string literals\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"last`\",\"end\"]}]}","string-literal.escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"string-literal.escape.spec.ts\",\"tests\":[{\"name\":\"for syntax highlighting\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"a = `\\\\a `\",\"end\"]}]}","structures.1.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.1.spec.ts\",\"tests\":[{\"name\":\"verifies simplest structure parsing\",\"code\":\"_z5$ = {thing}\"},{\"name\":\"verifies multi-line structure name parsing\",\"code\":[\"_17$ = { $\",\" thing}\"]},{\"name\":\"verifies simplest property parsing without structure name\",\"code\":\"_17$ = {thing:z}\"},{\"name\":\"verifies simplest property parsing without structure name and line continuation\",\"code\":[\"_17$ = { $\",\" thing:z}\"]},{\"name\":\"verifies simplest nested structure parsing\",\"code\":\"_z5$ = {thing1:{thing2:z}}\"},{\"name\":\"verifies structure with inheritance\",\"code\":\"_z5$ = {thing, inherits _jklol}\"},{\"name\":\"verifies all components in single-line\",\"code\":\"a17 = {_th1g, abc:def, b:5, c:f()}\"}]}","structures.2.spec.ts":"{\"suiteName\":\"Validates structure parsing\",\"fileName\":\"structures.2.spec.ts\",\"tests\":[{\"name\":\"verifies multiple structure names (even though wrong syntax)\",\"code\":\"a = {one,two,three,inherits thing, inherits other, prop:5} ; comment\"},{\"name\":\"verifies nested structures, line continuations, and comments\",\"code\":[\"_17$ = { $ ; something\",\" thing: {name, some:value}}\"]},{\"name\":\"verifies weird syntax for named structures\",\"code\":[\"new_event = {FILESEL_EVENT, parent, ev.top, 0L, $\",\"path+filename, 0L, theFilter}\"]},{\"name\":\"structure names with exclamation points\",\"code\":\"a = {!exciting}\"},{\"name\":\"structure names and then line continuation\",\"code\":\"void = {mlLabelingTool_GraphicOverlay $\"},{\"name\":\"inherits supports spaces\",\"code\":[\" void = {IDLitDataIDLArray2D, $\",\" inherits IDLitData}\"]}]}","unexpected.1.spec.ts":"{\"suiteName\":\"Validates unexpected closer parsing\",\"fileName\":\"unexpected.1.spec.ts\",\"tests\":[{\"name\":\"verifies we catch unexpected closers (other tests cover correctly catching real closers instead of these)\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]}]}","unknown.spec.ts":"{\"suiteName\":\"Validates unknown token parsing\",\"fileName\":\"unknown.spec.ts\",\"tests\":[{\"name\":\"improper arrow function\",\"code\":\"sEvent.component-> $\"},{\"name\":\"text after comment\",\"code\":\"a = $ bad bad\"},{\"name\":\"unknown has right positioning with zero-width matches\",\"code\":\"scale=scale, $, $\"}]}"},"auto-post-processor-tests":{"arg-defs.spec.ts":"{\"suiteName\":\"Correctly extract argument definitions from code\",\"fileName\":\"arg-defs.spec.ts\",\"tests\":[{\"name\":\"Convert variables to arguments in standard routine definitions\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"Convert variables to arguments in routine method definition\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","arrows.spec.ts":"{\"suiteName\":\"Correctly map arrows\",\"fileName\":\"arrows.spec.ts\",\"tests\":[{\"name\":\"as procedure-method, but incomplete\",\"code\":[\"compile_opt idl2\",\"a->\",\"end\"]},{\"name\":\"as function method, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b->\",\"end\"]}]}","comment-blocks.1.spec.ts":"{\"suiteName\":\"Correctly map comments to comment blocks\",\"fileName\":\"comment-blocks.1.spec.ts\",\"tests\":[{\"name\":\"ignore normal comments\",\"code\":[\"compile_opt idl2\",\"; i am properly ignored like i should be\",\"a = 5\",\"end\"]},{\"name\":\"single-line blocks\",\"code\":[\"compile_opt idl2\",\";+ i am a basic block on only one line\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks without end\",\"code\":[\"compile_opt idl2\",\";+\",\"; something about docs\",\"; like, really cool information\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks with close\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\";- ended\",\"a = 5\",\"end\"]},{\"name\":\"multi-line blocks with close\",\"code\":[\"compile_opt idl2\",\";+ definition of life\",\"a = 42\",\";+ second definition of life\",\"fortyTwo = 42\",\"end\"]}]}","comment-blocks.2.spec.ts":"{\"suiteName\":\"Advanced comment block cases\",\"fileName\":\"comment-blocks.2.spec.ts\",\"tests\":[{\"name\":\"end on block end and dont include excess comments\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\";-\",\"; not included in block\",\"a = 5\",\"end\"]},{\"name\":\"allow two blocks next to each other\",\"code\":[\"compile_opt idl2\",\";+\",\"; first block\",\";-\",\";+\",\"; second block\",\";-\",\"a = 5\",\"end\"]},{\"name\":\"capture recursive blocks\",\"code\":[\"compile_opt idl2\",\";+\",\"; first block\",\";-\",\"\",\"if !true then begin\",\" ;+\",\" ; second block\",\" ;-\",\" a = 5\",\"endif\",\"\",\"end\"]}]}","comment-blocks.3.spec.ts":"{\"suiteName\":\"Confusing comment blocks \",\"fileName\":\"comment-blocks.3.spec.ts\",\"tests\":[{\"name\":\"ignore markdown lists\",\"code\":[\"compile_opt idl2\",\";+\",\"; worlds greatest documenter\",\"; - some bulleted list\",\"; - some bulleted list\",\";-\",\"a = 5\",\"end\"]}]}","control-options.spec.ts":"{\"suiteName\":\"Correctly map options for compound control statements\",\"fileName\":\"control-options.spec.ts\",\"tests\":[{\"name\":\"Convert variables to control options\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" common blockName ; ignore for now\",\" forward_function myfunc1, myfunc2, myfunc3\",\" goto, stmnt\",\"\",\"end\"]}]}","dot.spec.ts":"{\"suiteName\":\"Correctly map periods to dots\",\"fileName\":\"dot.spec.ts\",\"tests\":[{\"name\":\"as procedure-method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a.\",\"end\"]},{\"name\":\"as function method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b.\",\"end\"]},{\"name\":\"standalone 1\",\"code\":[\"compile_opt idl2\",\"a = .\",\"end\"]},{\"name\":\"standalone 2\",\"code\":[\"compile_opt idl2\",\".\",\"end\"]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly extract keyword names from routine calls\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"Convert variables to keywords when calling procedures\",\"code\":[\"compile_opt idl2\",\"mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling procedure methods\",\"code\":[\"compile_opt idl2\",\"obj.method, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling functions\",\"code\":[\"compile_opt idl2\",\"res = mypro(arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3)\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords when calling function methods\",\"code\":[\"compile_opt idl2\",\"res = obj.method(arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3)\",\"\",\"end\"]}]}","keywords-binary.spec.ts":"{\"suiteName\":\"Correctly detect binary keywords\",\"fileName\":\"keywords-binary.spec.ts\",\"tests\":[{\"name\":\"in procedure\",\"code\":\"mypro, /kw1, /KW2\"},{\"name\":\"in procedure method\",\"code\":[\"myclass.method, $\",\" /KW3, KW=!true\"]},{\"name\":\"in function\",\"code\":\"a = myfunc(/KW1, /KW2)\"},{\"name\":\"in function method\",\"code\":[\"ZACH = AWESOME.SAUCE(/kw3, $\",\"/KW17, KW18 = !false)\"]},{\"name\":\"preserve other children after keyword\",\"code\":[\"compile_opt idl2\",\"tvcrs,x,y,/dev $\\t;Restore cursor\",\" kw=2\",\"\",\"end\"]},{\"name\":\"properly handle comments in function calls\",\"code\":[\"compile_opt idl2\",\"wDatatable = WIDGET_TABLE(id_datarow, $\",\"; FORMAT='(A)', $\",\" /RESIZEABLE_COLUMNS)\",\"\",\"end\"]}]}","keyword-defs.spec.ts":"{\"suiteName\":\"Correctly extract keyword definitions\",\"fileName\":\"keyword-defs.spec.ts\",\"tests\":[{\"name\":\"Convert variables to keywords in standard routine definitions\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"Convert variables to keywords in routine method definition\",\"code\":[\"pro mypro::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"from complex example\",\"code\":[\"function TS_HANTS2, timeseries, $\",\"amplitudes = amp, $\",\"delta = delta, $\",\"dod = dod, $\",\"double = double, $\",\"err_tolerance = err_tolerance, $\",\"; FREQUENCIES=freq, $\",\"HIGH = HIGH, $\",\"low = low, $\",\"num_frequencies = num_frequencies, $\",\"num_period = num_period, $\",\"phases = phases, $\",\"range_maximum = range_maximum, $\",\"range_minimum = range_minimum, $\",\"time_sample = time_sample, $\",\"num_images = num_images\",\"\",\"compile_opt idl2\",\"\",\"a = IDL_Number.total()\",\"\",\"return, name\",\"end\"]}]}","main.spec.ts":"{\"suiteName\":\"Correctly maps main level tokens\",\"fileName\":\"main.spec.ts\",\"tests\":[{\"name\":\"do nothing without main level\",\"code\":[\"function myfunc\",\"compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"process single-line code 1\",\"code\":[\"a = plot(/TEST)\"]},{\"name\":\"process single-line code 2\",\"code\":[\"a = `${42, '42'}${42, '42'}`\"]},{\"name\":\"catch correct\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"catch with no end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"]},{\"name\":\"catch with statements after the end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\",\"; bad comment\",\"something = else\"]},{\"name\":\"ignore only comments 1\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"; main level\",\"; another comment\"]},{\"name\":\"ignore only comments 2\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end ; -----------\",\"\",\"; main level\",\"; another comment\"]},{\"name\":\"edge case\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"!null = myfunc()\"]}]}","operator.pointer-deref.basic.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.basic.spec.ts\",\"tests\":[{\"name\":\"ignore multiplication\",\"code\":[\"a = 6 * 7\"]},{\"name\":\"ignore multiplication\",\"code\":[\"a = (6) * (7)\"]},{\"name\":\"assignment\",\"code\":[\"a = *var\"]},{\"name\":\"after operators\",\"code\":[\"a = 5 + *var\"]},{\"name\":\"after mod operator\",\"code\":[\"a = mod *var\"]},{\"name\":\"after logical operators\",\"code\":[\"a = 5 le *var\"]},{\"name\":\"single line\",\"code\":[\"*ptr = 42\"]}]}","operator.pointer-deref.loops.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.loops.spec.ts\",\"tests\":[{\"name\":\"in for loop statements\",\"code\":[\"for i=*var, *other do *val = 42\"]},{\"name\":\"in foreach loop statements\",\"code\":[\"foreach val, *thing, key do *val = 42\"]},{\"name\":\"in while loop statements\",\"code\":[\"while *var do *val = 42\"]},{\"name\":\"in repeat loop statements\",\"code\":[\"repeat *val = 42 until *var\"]}]}","operator.pointer-deref.if.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.if.spec.ts\",\"tests\":[{\"name\":\"in if-then-else\",\"code\":[\"if *val then *var = 42 else *var = 84\"]}]}","operator.pointer-deref.case.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.case.spec.ts\",\"tests\":[{\"name\":\"all parts of case statement\",\"code\":[\"compile_opt idl2\",\"case *val of\",\" *thing: *other = 42\",\" else: *value = 84\",\"endcase\",\"end\"]}]}","operator.pointer-deref.routines.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.routines.spec.ts\",\"tests\":[{\"name\":\"in functions\",\"code\":[\"a = func(*val, *other, kw=*last)\"]},{\"name\":\"in function methods\",\"code\":[\"a = var.func(*val, *other, kw=*last)\"]},{\"name\":\"in procedure definitions\",\"code\":[\"function mypro\",\" compile_opt idl2\",\" *val = 5\",\" *val2 = 5\",\" return, !null\",\"end\"]},{\"name\":\"in procedures\",\"code\":[\"mypro, *val, *other, kw=*last\"]},{\"name\":\"in procedure methods\",\"code\":[\"var.mypro, *val, *other, kw=*last\"]},{\"name\":\"in multi-line procedures\",\"code\":[\"mypro,$\",\" *val\",\"end\"]},{\"name\":\"in procedure definitions\",\"code\":[\"pro mypro\",\"compile_opt idl2\",\" *val = 5\",\" *val2 = 5\",\" return\",\"end\"]}]}","operator.pointer-deref.paren.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.paren.spec.ts\",\"tests\":[{\"name\":\"as first statement in paren\",\"code\":[\"a = (*var)\"]}]}","operator.pointer-deref.struct.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.struct.spec.ts\",\"tests\":[{\"name\":\"after structure properties\",\"code\":[\"a = {prop: *ptr}\"]},{\"name\":\"after indexed structure properties\",\"code\":[\"a = var.(*thing)\"]}]}","operator.pointer-deref.switch.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.switch.spec.ts\",\"tests\":[{\"name\":\"all parts of switch statement\",\"code\":[\"\",\"compile_opt idl2\",\"switch *val of\",\" *thing: *other = 42\",\" *thing2: *other = 42\",\" else: *value = 84\",\"endcase\",\"end\"]}]}","operator.pointer-deref.ternary.spec.ts":"{\"suiteName\":\"Correctly identify pointer dereferencing\",\"fileName\":\"operator.pointer-deref.ternary.spec.ts\",\"tests\":[{\"name\":\"all parts of ternary operators\",\"code\":[\"a = *val ? *truthy : *falsy\"]}]}","operator.indexing.array.spec.ts":"{\"suiteName\":\"Correctly identify array indexing\",\"fileName\":\"operator.indexing.array.spec.ts\",\"tests\":[{\"name\":\"all parts of ternary operators\",\"code\":[\"compile_opt idl2\",\"subsel = sel[*, 1:*val]\",\"end\"]}]}","operator.pointer-deref.regression.spec.ts":"{\"suiteName\":\"Correctly identify array indexing\",\"fileName\":\"operator.pointer-deref.regression.spec.ts\",\"tests\":[{\"name\":\"instead of de-referencing\",\"code\":[\"compile_opt idl2\",\"temp = reform(mask[i*8 : min([s[1] - 1, i*8 + 7]), j])\",\"end\"]}]}","strings.spec.ts":"{\"suiteName\":\"Correctly merge strings together\",\"fileName\":\"strings.spec.ts\",\"tests\":[{\"name\":\"merge single quotes\",\"code\":[\"a = 'string''escaped'\"]},{\"name\":\"merge double quotes\",\"code\":[\"a = \\\"string\\\"\\\"escaped\\\"\"]},{\"name\":\"ignore single quotes that cannot be merged\",\"code\":[\"a = 'string' 'escaped'\"]},{\"name\":\"ignore double quotes that cannot be merged\",\"code\":[\"a = \\\"string\\\" \\\"escaped\\\"\"]}]}","var-not-function.spec.ts":"{\"suiteName\":\"Correctly identify variables instead of function calls\",\"fileName\":\"var-not-function.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}"},"auto-syntax-validator-tests":{"bad-routine-def.spec.ts":"{\"suiteName\":\"Verify that we can parse and report problems\",\"fileName\":\"bad-routine-def.spec.ts\",\"tests\":[{\"name\":\"for bad function\",\"code\":[\"function \",\"\",\"; pro test_myurl\",\"\",\"a = curl_easy_init()\",\"curlopt_header = 42\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_header, 1)\",\"curlopt_url = 10002\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_url, 'http://www.google.com')\",\"print, 'curl_easy_perform', curl_easy_perform(a)\",\"curl_easy_cleanup, a\",\"end\"]},{\"name\":\"for bad pro\",\"code\":[\"pro \",\"\",\"; pro test_myurl\",\"\",\"a = curl_easy_init()\",\"curlopt_header = 42\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_header, 1)\",\"curlopt_url = 10002\",\"print, 'curl_easy_setopt', curl_easy_setopt(a, curlopt_url, 'http://www.google.com')\",\"print, 'curl_easy_perform', curl_easy_perform(a)\",\"curl_easy_cleanup, a\",\"end\"]}]}","code.0.not-closed.spec.ts":"{\"suiteName\":\"Detects problems with statements not being closed\",\"fileName\":\"code.0.not-closed.spec.ts\",\"tests\":[{\"name\":\"parentheses\",\"code\":\"(\"},{\"name\":\"brackets\",\"code\":\"[\"},{\"name\":\"structures\",\"code\":\"{\"},{\"name\":\"functions\",\"code\":\"myfunc(\"},{\"name\":\"blocks\",\"code\":\"begin\"},{\"name\":\"switch\",\"code\":\"switch\"},{\"name\":\"case\",\"code\":\"case\"},{\"name\":\"procedures\",\"code\":\"pro mypro\"},{\"name\":\"functions\",\"code\":\"function myfunc\"},{\"name\":\"across line boundaries\",\"code\":[\"( $\",\" ;something\"]},{\"name\":\"only report last instance of unclosed in main\",\"code\":[\"compile_opt idl2\",\"p = plot(var var, $\",\" plot(var var\",\"end\"]},{\"name\":\"only report last instance of unclosed in routine\",\"code\":[\"pro myAwesomePro\",\"compile_opt idl2\",\"p = plot(var var, $\",\" plot(var var\",\"end\"]}]}","code.1.unexpected-closer.spec.ts":"{\"suiteName\":\"Detects unexpected closers\",\"fileName\":\"code.1.unexpected-closer.spec.ts\",\"tests\":[{\"name\":\"finds all unexpected closers\",\"code\":[\")\",\"]\",\"}\",\"endif\",\"endelse\",\"endfor\",\"endforeach\",\"endrep\",\"endwhile\",\"endswitch\",\"endcase\",\"end\"]},{\"name\":\"correctly processes routines and expects no errors\",\"code\":[\"Function f1\",\" if keyword_set(fclip) then begin\",\" return, 1\",\" endif\",\"end\"]}]}","code.3.after-main.spec.ts":"{\"suiteName\":\"Detects problems after main level\",\"fileName\":\"code.3.after-main.spec.ts\",\"tests\":[{\"name\":\"statements after main level\",\"code\":[\"compile_opt idl2\",\"end\",\"a = 5\"]},{\"name\":\"allow comments after main\",\"code\":[\"compile_opt idl2\",\"end\",\"; ok\"]}]}","code.6.todo.spec.ts":"{\"suiteName\":\"Detects TODO statements\",\"fileName\":\"code.6.todo.spec.ts\",\"tests\":[{\"name\":\"with basic lower-case comment\",\"code\":\"; todo: something\"},{\"name\":\"with basic upper-case comment\",\"code\":\"; todo: something\"}]}","code.7.unknown-token.spec.ts":"{\"suiteName\":\"Detects unknown tokens\",\"fileName\":\"code.7.unknown-token.spec.ts\",\"tests\":[{\"name\":\"with example in structure\",\"code\":\"a = {1+2}\"},{\"name\":\"after line continuation\",\"code\":[\"compile_opt idl2\",\"a = $ , $ ; ok\",\"42\",\"end\"]},{\"name\":\"ternary without assignment\",\"code\":\"!true ? a : b\"},{\"name\":\"comma in assignment\",\"code\":\"a = ,\"},{\"name\":\"quotes in structures 1\",\"code\":\"a = {'bad'}\"},{\"name\":\"quotes in structures 2\",\"code\":\"a = {\\\"bad\\\"}\"}]}","code.8.illegal-arrow.spec.ts":"{\"suiteName\":\"Detects illegal arrows\",\"fileName\":\"code.8.illegal-arrow.spec.ts\",\"tests\":[{\"name\":\"missing super/method\",\"code\":[\"compile_opt idl2\",\"a = b-> $\",\"method\",\"end\"]},{\"name\":\"missing method with super before\",\"code\":[\"compile_opt idl2\",\"oContainer = self->IDLitContainer:: $\",\"method\",\"end\"]}]}","code.9.illegal-comma.spec.ts":"{\"suiteName\":\"Detects illegal commas\",\"fileName\":\"code.9.illegal-comma.spec.ts\",\"tests\":[{\"name\":\"after assignment\",\"code\":\"a = ,\"},{\"name\":\"standalone\",\"code\":\",\"},{\"name\":\"in right place\",\"code\":[\"a = something()\",\",\"]},{\"name\":\"in parentheses\",\"code\":[\"a = (,)\"]},{\"name\":\"in switch\",\"code\":[\"compile_opt idl2\",\"switch a, of\",\" , !true: , \",\"endswitch\",\"end\"]},{\"name\":\"in case\",\"code\":[\"compile_opt idl2\",\"case a, of\",\" , !true: , \",\"endcase\",\"end\"]},{\"name\":\"in ternary\",\"code\":[\"a = !true ? ,'bad' : ,'still bad'\"]}]}","code.10.illegal-colon.spec.ts":"{\"suiteName\":\"Detects illegal colon\",\"fileName\":\"code.10.illegal-colon.spec.ts\",\"tests\":[{\"name\":\"standalone\",\"code\":\":\"},{\"name\":\"with reserved word in jump statement\",\"code\":\"break:\"},{\"name\":\"function call\",\"code\":\"myfunc(a:b)\"},{\"name\":\"bad array syntax\",\"code\":\"myarr(a:b)\"},{\"name\":\"ignore lambda functions\",\"code\":\"a = lambda(x:x+2)\"}]}","code.11.illegal-include.spec.ts":"{\"suiteName\":\"Detects illegal include statements\",\"fileName\":\"code.11.illegal-include.spec.ts\",\"tests\":[{\"name\":\"correctly find no problems\",\"code\":\"@includeme\"},{\"name\":\"don't find in functions\",\"code\":\"a = myfunc(@bad)\"},{\"name\":\"don't find in expressions\",\"code\":\"a = @include_wrong + @way_bad\"}]}","code.12.reserved-var.spec.ts":"{\"suiteName\":\"Detects reserved variable names. Not all are detected as you might think and require other syntax rules to verify\",\"fileName\":\"code.12.reserved-var.spec.ts\",\"tests\":[{\"name\":\"correctly detects \\\"for\\\"\",\"code\":\"a = for\"},{\"name\":\"correctly detects \\\"foreach\\\"\",\"code\":\"a = foreach\"},{\"name\":\"correctly detects \\\"while\\\"\",\"code\":\"a = while\"},{\"name\":\"correctly detects \\\"do\\\"\",\"code\":\"a = do\"},{\"name\":\"correctly detects \\\"repeat\\\"\",\"code\":\"a = repeat\"},{\"name\":\"correctly detects \\\"until\\\"\",\"code\":\"a = until\"},{\"name\":\"correctly detects \\\"if\\\"\",\"code\":\"a = if\"},{\"name\":\"correctly detects \\\"then\\\"\",\"code\":\"a = then\"},{\"name\":\"correctly detects \\\"else\\\"\",\"code\":\"a = else\"},{\"name\":\"correctly detects \\\"switch\\\"\",\"code\":\"a = switch\"},{\"name\":\"correctly detects \\\"case\\\"\",\"code\":\"a = case\"},{\"name\":\"correctly detects \\\"of\\\"\",\"code\":\"a = of\"},{\"name\":\"correctly detects \\\"begin\\\"\",\"code\":\"a = begin\"},{\"name\":\"correctly detects \\\"end\\\"\",\"code\":\"a = end\"},{\"name\":\"correctly detects \\\"endif\\\"\",\"code\":\"a = endif\"},{\"name\":\"correctly detects \\\"endelse\\\"\",\"code\":\"a = endelse\"},{\"name\":\"correctly detects \\\"endfor\\\"\",\"code\":\"a = endfor\"},{\"name\":\"correctly detects \\\"endforeach\\\"\",\"code\":\"a = endforeach\"},{\"name\":\"correctly detects \\\"endrep\\\"\",\"code\":\"a = endrep\"},{\"name\":\"correctly detects \\\"endwhile\\\"\",\"code\":\"a = endwhile\"},{\"name\":\"correctly detects \\\"endswitch\\\"\",\"code\":\"a = endswitch\"},{\"name\":\"correctly detects \\\"endcase\\\"\",\"code\":\"a = endcase\"},{\"name\":\"correctly detects \\\"pro\\\"\",\"code\":\"a = pro\"},{\"name\":\"correctly detects \\\"function\\\"\",\"code\":\"a = function\"},{\"name\":\"correctly detects \\\"break\\\"\",\"code\":\"a = break\"},{\"name\":\"correctly detects \\\"continue\\\"\",\"code\":\"a = continue\"},{\"name\":\"correctly detects \\\"common\\\"\",\"code\":\"a = common\"},{\"name\":\"correctly detects \\\"compile_opt\\\"\",\"code\":\"a = compile_opt\"},{\"name\":\"correctly detects \\\"forward_function\\\"\",\"code\":\"a = forward_function\"},{\"name\":\"correctly detects \\\"goto\\\"\",\"code\":\"a = goto\"},{\"name\":\"correctly detects \\\"mod\\\"\",\"code\":\"a = mod\"},{\"name\":\"correctly detects \\\"not\\\"\",\"code\":\"a = not\"},{\"name\":\"correctly detects \\\"eq\\\"\",\"code\":\"a = eq\"},{\"name\":\"correctly detects \\\"ne\\\"\",\"code\":\"a = ne\"},{\"name\":\"correctly detects \\\"le\\\"\",\"code\":\"a = le\"},{\"name\":\"correctly detects \\\"lt\\\"\",\"code\":\"a = lt\"},{\"name\":\"correctly detects \\\"ge\\\"\",\"code\":\"a = ge\"},{\"name\":\"correctly detects \\\"gt\\\"\",\"code\":\"a = gt\"},{\"name\":\"correctly detects \\\"and\\\"\",\"code\":\"a = and\"},{\"name\":\"correctly detects \\\"or\\\"\",\"code\":\"a = or\"},{\"name\":\"correctly detects \\\"xor\\\"\",\"code\":\"a = xor\"},{\"name\":\"correctly detects \\\"inherits\\\"\",\"code\":\"a = inherits\"}]}","code.13.illegal-ternary.spec.ts":"{\"suiteName\":\"Detects illegal ternary operators\",\"fileName\":\"code.13.illegal-ternary.spec.ts\",\"tests\":[{\"name\":\"correctly find no problems\",\"code\":\"a = !true ? 'yes' : 'no'\"},{\"name\":\"find problem\",\"code\":\"!true ? 'yes' : 'no'\"}]}","code.14.colon-in-func.spec.ts":"{\"suiteName\":\"Detects illegal colons in functions\",\"fileName\":\"code.14.colon-in-func.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = var(0:-1)\"}]}","code.15.colon-in-func-method.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.15.colon-in-func-method.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = objOrStruct.var(0:-1)\"}]}","code.16.double-token.spec.ts":"{\"suiteName\":\"Detects two tokens next to each other\",\"fileName\":\"code.16.double-token.spec.ts\",\"tests\":[{\"name\":\"variables\",\"code\":\"procedure, var1 var2\"},{\"name\":\"functions\",\"code\":\"func1() func2()\"},{\"name\":\"operators\",\"code\":\"a + + b\"},{\"name\":\"commas\",\"code\":\"mypro,,\"},{\"name\":\"valid structures\",\"code\":\"a = {mystruct, {known:val}}\"},{\"name\":\"bad structures\",\"code\":\"a = {{known:val}}\"},{\"name\":\"ignore comments\",\"code\":[\"; first\",\";second\"]},{\"name\":\"OK separate lines\",\"code\":[\"pro1\",\"pro2\"]},{\"name\":\"All of these operators can be next to each other\",\"code\":[\"compile_opt idl2\",\"a = b && ~c && d\",\"a = b || ~c || d\",\"a = b not ~c not d\",\"a = b eq ~c eq d\",\"a = b ne ~c ne d\",\"a = b le ~c le d\",\"a = b lt ~c lt d\",\"a = b ge ~c gt d\",\"a = b gt ~c gt d\",\"a = b and ~c and d\",\"a = b or ~c or d\",\"a = b xor ~c xor d\",\"a = b.prop.prop.prop\",\"a = 42 & b = 42 & c = 42\",\"tol = (N_ELEMENTS(tolIn) eq 1) ? tolIn[0] : use_double ? 2d-12 : 1e-5\",\"end\"]},{\"name\":\"ignore template escape characters\",\"code\":[\"a = `\\\\r\\\\r\\\\n\\\\n`\"]},{\"name\":\"ignore nested function methods (caught elsewhere)\",\"code\":[\"a = var.myfunc().ohNotOk()\"]}]}","code.16.double-token.exclusions1.spec.ts":"{\"suiteName\":\"Allows these tokens next to each other\",\"fileName\":\"code.16.double-token.exclusions1.spec.ts\",\"tests\":[{\"name\":\"string literal expressions\",\"code\":\"a = `${42}${42}`\"}]}","code.17.illegal-struct.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.17.illegal-struct.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a ={{}}\"}]}","code.18.illegal-paren.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.18.illegal-paren.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = {()}\"}]}","code.19.illegal-bracket.spec.ts":"{\"suiteName\":\"Detects illegal colons in function methods\",\"fileName\":\"code.19.illegal-bracket.spec.ts\",\"tests\":[{\"name\":\"find problem\",\"code\":\"a = {[]}\"}]}","code.20.return-vals-pro.spec.ts":"{\"suiteName\":\"Detects invalid return statements in procedures\",\"fileName\":\"code.20.return-vals-pro.spec.ts\",\"tests\":[{\"name\":\"ok in procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"ok in main\",\"code\":[\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"pro mypro::method\",\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"bad in main\",\"code\":[\" compile_opt idl2\",\" return,\",\"end\"]},{\"name\":\"ok with comment after return\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return ; done\",\"end\"]}]}","code.21.return-vals-func.spec.ts":"{\"suiteName\":\"Detects invalid return statements in functions (too many vals)\",\"fileName\":\"code.21.return-vals-func.spec.ts\",\"tests\":[{\"name\":\"ok\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1,2\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return,1,2\",\"end\"]},{\"name\":\"return value from function OK\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,weirdCall(1,2,3)\",\"end\"]},{\"name\":\"ok with comment after return\",\"code\":[\"function mypro\",\" compile_opt idl2\",\" return, 1 ; done\",\"end\"]}]}","code.22.return-vals-missing-func.spec.ts":"{\"suiteName\":\"Detects invalid return statements in functions (no val)\",\"fileName\":\"code.22.return-vals-missing-func.spec.ts\",\"tests\":[{\"name\":\"ok\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad in objects\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return\",\"end\"]}]}","code.29.reserved-pro.spec.ts":"{\"suiteName\":\"Detects reserved procedures\",\"fileName\":\"code.29.reserved-pro.spec.ts\",\"tests\":[{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro WRITEU\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.30.reserved-func.spec.ts":"{\"suiteName\":\"Detects reserved functions\",\"fileName\":\"code.30.reserved-func.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function label_region\",\" compile_opt idl2\",\" return,1\",\"end\"]}]}","code.31.return-missing.spec.ts":"{\"suiteName\":\"Detects missing return procedure in functions\",\"fileName\":\"code.31.return-missing.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok in methods\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad in methods\",\"code\":[\"function myfunc::method\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.32.routines-first.spec.ts":"{\"suiteName\":\"Detects invalid tokens before routine definition\",\"fileName\":\"code.32.routines-first.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"@include\",\"\",\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"; this is OK\",\"this = wrong * 5\",\"\",\"; this is OK too\",\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"; main level\",\"something = 42\",\"end\"]}]}","code.33.unclosed-main.spec.ts":"{\"suiteName\":\"Detects missing end to main level program\",\"fileName\":\"code.33.unclosed-main.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"]},{\"name\":\"problems after end\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\",\"a = 17\"]},{\"name\":\"not problem\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end ; -----------\",\"\",\"; main level\",\"; another comment\"]}]}","code.33.unclosed-main.notebooks.spec.ts":"{\"suiteName\":\"Detects missing end to main level program\",\"fileName\":\"code.33.unclosed-main.notebooks.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"compile_opt idl2\",\"; main level\",\"something = 42\"],\"config\":{\"isNotebook\":true}},{\"name\":\"no problems\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\",\"\",\"a = myfunc()\"],\"config\":{\"isNotebook\":true}}]}","code.34.empty-main.spec.ts":"{\"suiteName\":\"Detects empty main level programs\",\"fileName\":\"code.34.empty-main.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\"; main level\",\"compile_opt idl2\",\"something = 42\",\"end\"]},{\"name\":\"all the problems\",\"code\":[\"; main level\",\"end\"]},{\"name\":\"also problems\",\"code\":[\"\",\"end\"]},{\"name\":\"not problem\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end ; -----------\",\"\",\"; main level\",\"; another comment\"]}]}","code.35.after-continuation.spec.ts":"{\"suiteName\":\"Detects invalid text after line continuations\",\"fileName\":\"code.35.after-continuation.spec.ts\",\"tests\":[{\"name\":\"no problems with nothing after continuation\",\"code\":[\"compile_opt idl2\",\"something = $\",\" 5\",\"end\"]},{\"name\":\"no problems with comment\",\"code\":[\"compile_opt idl2\",\"something = $ ; ok\",\" 5\",\"end\"]},{\"name\":\"problems\",\"code\":[\"compile_opt idl2\",\"something = $ bad\",\" 5\",\"end\"]},{\"name\":\"problems, same location as previous test\",\"code\":[\"compile_opt idl2\",\"something = $ bad ; ok\",\" 5\",\"end\"]}]}","code.36.reserved-pro-method.spec.ts":"{\"suiteName\":\"Detects reserved procedure methods\",\"fileName\":\"code.36.reserved-pro-method.spec.ts\",\"tests\":[{\"name\":\"ok procedure method\",\"code\":[\"pro IDLffVideoRead::myownmethod\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure method\",\"code\":[\"pro IDLffVideoRead::Cleanup\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.37.reserved-func-method.spec.ts":"{\"suiteName\":\"Detects reserved function methods\",\"fileName\":\"code.37.reserved-func-method.spec.ts\",\"tests\":[{\"name\":\"ok function method\",\"code\":[\"function list::myownmethod\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function method\",\"code\":[\"function list::where\",\" compile_opt idl2\",\" return,1\",\"end\"]}]}","code.38.no-comp-opt.spec.ts":"{\"suiteName\":\"Detects missing compile options\",\"fileName\":\"code.38.no-comp-opt.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" return,1\",\"end\"]},{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" return\",\"end\"]},{\"name\":\"ok main\",\"code\":[\"compile_opt idl2\",\"; main level program\",\" a = 5\",\"end\"]},{\"name\":\"bad main\",\"code\":[\"; main level program\",\" a = 5\",\"end\"]},{\"name\":\"ok main\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end ; -----------\",\"\",\"; main level\",\"; another comment\"]}]}","code.38.no-comp-opt.notebooks.spec.ts":"{\"suiteName\":\"Detects missing compile options\",\"fileName\":\"code.38.no-comp-opt.notebooks.spec.ts\",\"tests\":[{\"name\":\"ok function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" return,1\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" return,1\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ok procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" return\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" return\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ok main\",\"code\":[\"compile_opt idl2\",\"; main level program\",\" a = 5\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"bad main\",\"code\":[\"; main level program\",\" a = 5\",\"end\"],\"config\":{\"isNotebook\":true}}]}","code.39.no-idl2.spec.ts":"{\"suiteName\":\"Detects missing compile option idl2\",\"fileName\":\"code.39.no-idl2.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt hidden\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt hidden\",\" return\",\"end\"]},{\"name\":\"don't complain about idl3\",\"code\":[\"pro mypro\",\" compile_opt idl3\",\" return\",\"end\"]}]}","code.40.illegal-comp-opt.spec.ts":"{\"suiteName\":\"Detects bad compile options\",\"fileName\":\"code.40.illegal-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2, bad1\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2, bad2\",\" return\",\"end\"]}]}","code.40.illegal-comp-opt.regressions.spec.ts":"{\"suiteName\":\"Detects bad compile options (regression)\",\"fileName\":\"code.40.illegal-comp-opt.regressions.spec.ts\",\"tests\":[{\"name\":\"fine\",\"code\":[\"pro mypro\",\" compile_opt idl2, strictarrsubs\",\" return\",\"end\"]}]}","code.41.empty-comp-opt.spec.ts":"{\"suiteName\":\"Detects compile opt without options\",\"fileName\":\"code.41.empty-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt\",\" return\",\"end\"]}]}","code.42.use-idl2.spec.ts":"{\"suiteName\":\"Detects compile opt without options\",\"fileName\":\"code.42.use-idl2.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt defint32, strictarr\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt defint32, strictarr\",\" return\",\"end\"]}]}","code.43.expected-comma.spec.ts":"{\"suiteName\":\"Detects statements that do expect a comma first\",\"fileName\":\"code.43.expected-comma.spec.ts\",\"tests\":[{\"name\":\"in go to\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" goto jumper\",\"end\"]},{\"name\":\"in procedure method call\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" p = plot(/TEST)\",\" p.method abc\",\"end\"]},{\"name\":\"in procedure call\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" print something\",\"end\"]},{\"name\":\"in routine name\",\"code\":[\"pro mypro var1\",\" compile_opt idl2\",\"end\"]}]}","code.44.unexpected-comma.spec.ts":"{\"suiteName\":\"Detects statements that don't expect a comma first\",\"fileName\":\"code.44.unexpected-comma.spec.ts\",\"tests\":[{\"name\":\"verify braces are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = b[,]\",\"end\"]},{\"name\":\"verify compile_opt is caught\",\"code\":[\"pro mypro\",\" compile_opt, idl2\",\"end\"]},{\"name\":\"verify common blocks are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" common, named\",\"end\"]},{\"name\":\"verify forward function is caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" forward_function, funcy\",\"end\"]},{\"name\":\"verify function calls are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = func(,)\",\"end\"]},{\"name\":\"verify function method calls are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = b.func(,)\",\"end\"]},{\"name\":\"verify for loops are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" for, i=0,100 do print, i\",\"end\"]},{\"name\":\"verify foreach loops are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" foreach, val, arr do print, val\",\"end\"]},{\"name\":\"verify structures are caught\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" a = {,name}\",\"end\"]}]}","code.45.multiple-comp-opt.spec.ts":"{\"suiteName\":\"Detects multiple compile_opt statements\",\"fileName\":\"code.45.multiple-comp-opt.spec.ts\",\"tests\":[{\"name\":\"bad function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\" compile_opt idl2\",\" return,1\",\"end\"]},{\"name\":\"bad procedure\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" compile_opt idl2\",\" return\",\"end\"]},{\"name\":\"bad main\",\"code\":[\" compile_opt idl2\",\" compile_opt idl2\",\"end\"]}]}","code.46.unclosed-quote.spec.ts":"{\"suiteName\":\"Detects unclosed quotes\",\"fileName\":\"code.46.unclosed-quote.spec.ts\",\"tests\":[{\"name\":\"ok double quote\",\"code\":[\"a = \\\"good\\\"\"]},{\"name\":\"bad double quote\",\"code\":[\"a = \\\"bad\"]},{\"name\":\"verify exclude fancy numbers\",\"code\":[\"a = \\\"0\"]},{\"name\":\"ok single quote\",\"code\":[\"a = 'good'\"]},{\"name\":\"bad single quote\",\"code\":[\"a = 'bad\"]}]}","code.47.args-first.spec.ts":"{\"suiteName\":\"Detects bad argument definitions\",\"fileName\":\"code.47.args-first.spec.ts\",\"tests\":[{\"name\":\"ok args in routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, $\",\" arg4, arg5\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"bad args in routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, $\",\" arg4, arg5, KW1 = kw1, $\",\" arg6, arg7\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok args in routine method\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, $\",\" arg4, arg5\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"bad args in routine method\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, $\",\" arg4, arg5, KW1 = kw1, $\",\" arg6, arg7\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.48.docs-missing-arg.spec.ts":"{\"suiteName\":\"Detects args missing from docs\",\"fileName\":\"code.48.docs-missing-arg.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.49.no-args-to-doc.spec.ts":"{\"suiteName\":\"Detects documented args when there are no args\",\"fileName\":\"code.49.no-args-to-doc.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod\",\" compile_opt idl2\",\"end\"]}]}","code.50.docs-missing-kw.spec.ts":"{\"suiteName\":\"Detects keywords missing from docs\",\"fileName\":\"code.50.docs-missing-kw.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]}]}","code.51.no-kws-to-doc.spec.ts":"{\"suiteName\":\"Detects documented keywords when there are no keywords\",\"fileName\":\"code.51.no-kws-to-doc.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";\",\"; :Keywords:\",\"; KW1: in, optional, type=boolean\",\"; My favorite argument\",\";\",\";-\",\"pro myclass::mymethod\",\" compile_opt idl2\",\"end\"]}]}","code.52.docs-missing-return.spec.ts":"{\"suiteName\":\"Detects documented keywords when there are no keywords\",\"fileName\":\"code.52.docs-missing-return.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Returns: number\",\";-\",\"function myfunc\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\";-\",\"function myfunc\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.53.docs-invalid-in-out.spec.ts":"{\"suiteName\":\"Detects when in/out is incorrect for docs\",\"fileName\":\"code.53.docs-invalid-in-out.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, type=boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: wrong, optional, type=boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.54.docs-invalid-require.spec.ts":"{\"suiteName\":\"Detects when required/optional is incorrect for docs\",\"fileName\":\"code.54.docs-invalid-require.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, WRONG, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.56.docs-invalid-private.spec.ts":"{\"suiteName\":\"Detects when private/public is incorrect for docs\",\"fileName\":\"code.56.docs-invalid-private.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, hidden\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]}]}","code.57.docs-too-few-params.spec.ts":"{\"suiteName\":\"Detects when not enough documentation parameters are present\",\"fileName\":\"code.57.docs-too-few-params.spec.ts\",\"tests\":[{\"name\":\"no problems for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]}]}","code.58.docs-too-many-params.spec.ts":"{\"suiteName\":\"Detects when too many documentation parameters are present\",\"fileName\":\"code.58.docs-too-many-params.spec.ts\",\"tests\":[{\"name\":\"no problems for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for args\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, private, mcScrooge\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem for keywords\",\"code\":[\";+\",\"; :Keywords:\",\"; var1: in, optional, boolean, public, somethingWrong\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, VAR1=var1\",\" compile_opt idl2\",\"end\"]}]}","code.59.docs-left-align.spec.ts":"{\"suiteName\":\"Detects when docs are not left-aligned as expected\",\"fileName\":\"code.59.docs-left-align.spec.ts\",\"tests\":[{\"name\":\"no problems in params/keywords\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\"; And another line\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in params/keywords\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\"; And another line\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in other blocks\",\"code\":[\";+\",\"; First line is great\",\"; THEN CHAOS ENSUES\",\";\",\"; :Params:\",\"; var1: in, optional, boolean\",\"; My favorite argument\",\";-\",\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"no problems in variables\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"end\"]},{\"name\":\"problems in variables\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ;and need a big description\",\" ;-\",\" a = 42\",\"end\"]}]}","code.60.docs-return-has-no-type.spec.ts":"{\"suiteName\":\"Detects when the returns tag for docs is missing the data type\",\"fileName\":\"code.60.docs-return-has-no-type.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns:\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.61.docs-return-invalid.spec.ts":"{\"suiteName\":\"Detects when the returns tag has too much information\",\"fileName\":\"code.61.docs-return-invalid.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\"; Fun fact about zach\",\"; he is a vegetarian\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"no problem with extra spaces\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";\",\";\",\";\",\";-\",\"function myfunc, var1\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.62.docs-return-not-needed.spec.ts":"{\"suiteName\":\"Detects when the returns tag is present for procedures\",\"fileName\":\"code.62.docs-return-not-needed.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\";-\",\"pro myroutine, var1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem\",\"code\":[\";+\",\"; :Params:\",\"; var1: in, optional, boolean, public\",\"; My favorite argument\",\"; :Returns: number\",\";-\",\"pro myroutine, var1\",\" compile_opt idl2\",\"end\"]}]}","code.63.docs-not-real-param.spec.ts":"{\"suiteName\":\"Detects when a documented parameter does not exist in routine definition\",\"fileName\":\"code.63.docs-not-real-param.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem with args and keywords\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, var2, KW1=kw1, KW2=kw2\",\" compile_opt idl2\",\"end\"]},{\"name\":\"do not mistake colons in the description as parameters\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing: something else\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag: something else\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"detect in structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","code.64.pdocs-param-missing.spec.ts":"{\"suiteName\":\"Detects when a defined parameter is missing from user docs\",\"fileName\":\"code.64.pdocs-param-missing.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problem with args and keywords\",\"code\":[\";+\",\"; My procedure\",\";\",\"; :Args:\",\";\",\"; :Keywords:\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\"end\"]}]}","code.65.string-literal-too-many-args.spec.ts":"{\"suiteName\":\"Detects when a string literal has too many arguments\",\"fileName\":\"code.65.string-literal-too-many-args.spec.ts\",\"tests\":[{\"name\":\"no problems\",\"code\":\"`${1.234,\\\"%10.3f\\\"}`\"},{\"name\":\"no problems - string literal in formatting\",\"code\":\"`${1.234,`%${w}.3f`}`\"},{\"name\":\"problem with too many args\",\"code\":\"`${1.234,abc,\\\"%10.3f\\\"}`\"}]}","code.66.bad-continue.spec.ts":"{\"suiteName\":\"Detects bad continue statements\",\"fileName\":\"code.66.bad-continue.spec.ts\",\"tests\":[{\"name\":\"no problems in loops\",\"code\":[\"compile_opt idl2\",\"for i=0,10 do if !true then continue\",\"foreach val, key do if !true then continue\",\"while !true do if !false then continue\",\"repeat if !true then continue until !true\",\"end\"]},{\"name\":\"problems outside of loops\",\"code\":[\"compile_opt idl2\",\"continue\",\"end\"]}]}","code.67.bad-break.spec.ts":"{\"suiteName\":\"Detects bad break statements\",\"fileName\":\"code.67.bad-break.spec.ts\",\"tests\":[{\"name\":\"no problems in loops\",\"code\":[\"compile_opt idl2\",\"for i=0,10 do if !true then break\",\"foreach val, key do if !true then break\",\"while !true do if !false then break\",\"repeat if !true then break until !true\",\"end\"]},{\"name\":\"no problems in switch\",\"code\":[\"compile_opt idl2\",\"switch a of\",\" !true: break\",\"endswitch\",\"end\"]},{\"name\":\"no problems in case\",\"code\":[\"compile_opt idl2\",\"case a of\",\" !true: break\",\"endcase\",\"end\"]},{\"name\":\"problems outside of loops\",\"code\":[\"compile_opt idl2\",\"break\",\"end\"]}]}","code.68.expected-statement.spec.ts":"{\"suiteName\":\"Detects tokens that are empty but shouldn't be\",\"fileName\":\"code.68.expected-statement.spec.ts\",\"tests\":[{\"name\":\"problem in assignment\",\"code\":[\"compile_opt idl2\",\"a = \",\"end\"]},{\"name\":\"problem in basic operators\",\"code\":[\"compile_opt idl2\",\"a = 42 +\",\"end\"]},{\"name\":\"problem in compound operator\",\"code\":[\"compile_opt idl2\",\"a *= \",\"end\"]},{\"name\":\"problem in logical operator\",\"code\":[\"compile_opt idl2\",\"a = 5 and \",\"end\"]},{\"name\":\"problem in negative sign\",\"code\":[\"compile_opt idl2\",\"a = - \",\"end\"]},{\"name\":\"problem in pointer dereference\",\"code\":[\"compile_opt idl2\",\"a = *\",\"end\"]},{\"name\":\"problem in parentheses\",\"code\":[\"compile_opt idl2\",\"a = ()\",\"end\"]},{\"name\":\"problem in for\",\"code\":[\"compile_opt idl2\",\"for\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"foreach\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"while\",\"end\"]},{\"name\":\"problem in foreach\",\"code\":[\"compile_opt idl2\",\"for i=0,1 do\",\"end\"]},{\"name\":\"problem in repeat\",\"code\":[\"compile_opt idl2\",\"repeat\",\"end\"]},{\"name\":\"problem in until\",\"code\":[\"compile_opt idl2\",\"repeat a = 5 until\",\"end\"]},{\"name\":\"problem in if\",\"code\":[\"compile_opt idl2\",\"if\",\"end\"]},{\"name\":\"problem in then\",\"code\":[\"compile_opt idl2\",\"if !true then\",\"end\"]},{\"name\":\"problem in else\",\"code\":[\"compile_opt idl2\",\"if !true then a = 42 else\",\"end\"]},{\"name\":\"problem in ternary then\",\"code\":[\"compile_opt idl2\",\"a = !true ?\",\"end\"]},{\"name\":\"problem in ternary else\",\"code\":[\"compile_opt idl2\",\"a = !true ? 42 :\",\"end\"]},{\"name\":\"problem in switch\",\"code\":[\"compile_opt idl2\",\"switch\",\"end\"]},{\"name\":\"problem in case\",\"code\":[\"compile_opt idl2\",\"case\",\"end\"]},{\"name\":\"problem in of for switch\",\"code\":[\"compile_opt idl2\",\"switch !true of\",\"end\"]},{\"name\":\"problem in of for case\",\"code\":[\"compile_opt idl2\",\"switch !true of\",\"end\"]}]}","code.69.unfinished-dot.spec.ts":"{\"suiteName\":\"Detects tokens that are empty but shouldn't be\",\"fileName\":\"code.69.unfinished-dot.spec.ts\",\"tests\":[{\"name\":\"as procedure-method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a.\",\"end\"]},{\"name\":\"as function method or property access, but incomplete\",\"code\":[\"compile_opt idl2\",\"a = b.\",\"end\"]},{\"name\":\"standalone 1\",\"code\":[\"compile_opt idl2\",\"a = .\",\"end\"]},{\"name\":\"standalone 2\",\"code\":[\"compile_opt idl2\",\".\",\"end\"]}]}","code.70.illegal-hex-escape.spec.ts":"{\"suiteName\":\"Verify string literal escape characters\",\"fileName\":\"code.70.illegal-hex-escape.spec.ts\",\"tests\":[{\"name\":\"only have a problem with the last one\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"]}]}","code.71.unknown-template-escape.spec.ts":"{\"suiteName\":\"Find unknown string literal escape characters\",\"fileName\":\"code.71.unknown-template-escape.spec.ts\",\"tests\":[{\"name\":\"no problems with all good\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00`\",\"end\"]},{\"name\":\"problems with incomplete and bad ones\",\"code\":[\"compile_opt idl2\",\"a = `\\\\ `\",\"a = `\\\\a`\",\"a = `\\\\42`\",\"a = `\\\\lark \\\\r\\\\n`\",\"end\"]}]}","code.72.duplicate-arg-kw-var-def.spec.ts":"{\"suiteName\":\"Find duplicate arg and keyword variables and detect\",\"fileName\":\"code.72.duplicate-arg-kw-var-def.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"pro mypro, a, b, AKW = akw, BKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedures\",\"code\":[\"pro mypro, a, a, b, B = b, C = b\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedure methods\",\"code\":[\"pro myclass::mymethod, a, a, b, B = b, C = b\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in functions\",\"code\":[\"function myfunc, a, a, b, B = b, C = b\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problems in function methods\",\"code\":[\"function myclass::mymethod, a, a, b, B = b, C = b\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.73.duplicate-kw-def.spec.ts":"{\"suiteName\":\"Find duplicate keyword definitions\",\"fileName\":\"code.73.duplicate-kw-def.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"pro mypro, AKW = akw, BKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedures\",\"code\":[\"pro mypro, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in procedure methods\",\"code\":[\"pro myclass::mypro, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\"end\"]},{\"name\":\"problems in functions\",\"code\":[\"function myfunc, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\" return, 1\",\"end\"]},{\"name\":\"problems in function methods\",\"code\":[\"function myfunc::mymethod, AKW = akw, AKW = bkw\",\" compile_opt idl2\",\" return, 1\",\"end\"]}]}","code.74.duplicate-property.spec.ts":"{\"suiteName\":\"Find duplicate properties and find\",\"fileName\":\"code.74.duplicate-property.spec.ts\",\"tests\":[{\"name\":\"no problems when OK\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = {a:a, B :b}\",\"end\"]},{\"name\":\"problems when we have them\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = {a:a, A :b}\",\"end\"]}]}","code.75.duplicate-kw-usage.spec.ts":"{\"suiteName\":\"Find keyword usage and detect problems in\",\"fileName\":\"code.75.duplicate-kw-usage.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"plot, kw1=5, KW1=5, kw1=5, /KW1\",\"end\"]},{\"name\":\"procedure methods\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a.plot, kw1=5, KW1=5, kw1=5, /KW1\",\"end\"]},{\"name\":\"functions\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = plot(kw1=5, KW1=5, kw1=5, /KW1)\",\"end\"]},{\"name\":\"function methods\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"a = b.plot(kw1=5, KW1=5, kw1=5, /KW1)\",\"end\"]}]}","code.76.init-method-pro.spec.ts":"{\"suiteName\":\"Check for init methods\",\"fileName\":\"code.76.init-method-pro.spec.ts\",\"tests\":[{\"name\":\"being procedures incorrectly\",\"code\":[\"pro mypro::init\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.77.unknown-structure.spec.ts":"{\"suiteName\":\"Check for structure names\",\"fileName\":\"code.77.unknown-structure.spec.ts\",\"tests\":[{\"name\":\"reported not in class definitions\",\"code\":[\"pro auto_doc_example\",\" compile_opt idl2\",\" a = {ENVIRaster2}\",\"end\"]},{\"name\":\"ignored in class definitions\",\"code\":[\"pro auto_doc_example__define\",\" compile_opt idl2\",\" a = {ENVIRaster2}\",\"end\"]}]}","code.78.illegal-chain.spec.ts":"{\"suiteName\":\"Check for bad access\",\"fileName\":\"code.78.illegal-chain.spec.ts\",\"tests\":[{\"name\":\"from function calls\",\"code\":[\"pro so_bad\",\" compile_opt idl2\",\" a = myfunc().ohNo\",\" a = myfunc().(42)\",\" myfunc().ohMeOhMy\",\" a = myfunc().ohNotOk()\",\"end\"]},{\"name\":\"from function method calls\",\"code\":[\"pro so_sad\",\" compile_opt idl2\",\" a = var.myfunc().ohNo\",\" a = var.myfunc().(42)\",\" var.myfunc().ohMeOhMy\",\" a = var.myfunc().ohNotOk()\",\"end\"]}]}","code.79.docs-missing-struct.spec.ts":"{\"suiteName\":\"Check for missing structure definitions\",\"fileName\":\"code.79.docs-missing-struct.spec.ts\",\"tests\":[{\"name\":\"from docs 1\",\"code\":[\";+\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"from docs 2\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\"; prop2:any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when no docs\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when just procedure\",\"code\":[\";+\",\";-\",\"pro pro4\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]},{\"name\":\"ignore when function\",\"code\":[\"function myfunc\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" return, 1\",\"end\"]}]}","code.80.docs-missing-prop.spec.ts":"{\"suiteName\":\"Check for missing properties\",\"fileName\":\"code.80.docs-missing-prop.spec.ts\",\"tests\":[{\"name\":\"in our docs\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","code.81.class-no-params.spec.ts":"{\"suiteName\":\"Check for args and keywords in procedure class definitions\",\"fileName\":\"code.81.class-no-params.spec.ts\",\"tests\":[{\"name\":\"with arg\",\"code\":[\"pro pro4__define, a\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"with kw\",\"code\":[\"pro pro4__define, KW = kw\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"with both\",\"code\":[\"pro pro4__define, arg, KW = kw\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"ok with neither\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\"end\"]}]}","code.82.docs-prop-too-few-params.spec.ts":"{\"suiteName\":\"Not enough parameters for properties\",\"fileName\":\"code.82.docs-prop-too-few-params.spec.ts\",\"tests\":[{\"name\":\"without anything\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1:\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: \",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]},{\"name\":\"no problems\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String | number\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]}]}","code.83.docs-prop-too-many-params.spec.ts":"{\"suiteName\":\"Too many parameters for properties\",\"fileName\":\"code.83.docs-prop-too-many-params.spec.ts\",\"tests\":[{\"name\":\"with extra\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: any, bad\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String, noop\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]},{\"name\":\"no problems\",\"code\":[\";+\",\"; :NYStruct0:\",\"; prop1: Hash\",\"; Placeholder docs for argument, keyword, or property\",\";\",\"; :NYStruct:\",\"; prop2: String\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3__define\",\" compile_opt idl3\",\"\",\" !null = {NYStruct0, prop1: 5}\",\"\",\" !null = {NYStruct, inherits NYStruct0, prop2: 6}\",\"end\"]}]}","code.84.illegal-subscript.spec.ts":"{\"suiteName\":\"Illegal subscript\",\"fileName\":\"code.84.illegal-subscript.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro index_problems, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\" ; for arrays\",\" a1 = arg1[*]\",\" a2 = arg1[0, 1, *]\",\" a3 = arg1[0, 1, 2]\",\" a4 = arg1[0 : -1 : 1]\",\" a5 = arg1[0, 1, *]\",\"\",\" ; for lists\",\" l1 = arg2[*]\",\" l2 = arg2[0, 1, *]\",\" l3 = arg2[0, 1, 2]\",\" l4 = arg2[0 : -1 : 1]\",\" l5 = arg2[0, 1, *]\",\"\",\" ; for hashes\",\" h1 = arg3[*]\",\" h2 = arg3[0, 1, *]\",\" h3 = arg3[0, 1, 2]\",\" h4 = arg3[0 : -1 : 1]\",\" h5 = arg3[0, 1, *]\",\"\",\" ; for ordered hashes\",\" oh1 = arg4[*]\",\" oh2 = arg4[0, 1, *]\",\" oh3 = arg4[0, 1, 2]\",\" oh4 = arg4[0 : -1 : 1]\",\" oh5 = arg4[0, 1, *]\",\"\",\" ; for dictionaries\",\" d1 = arg5[*]\",\" d2 = arg5[0, 1, *]\",\" d3 = arg5[0, 1, 2]\",\" d3 = arg5[0 : -1 : 1]\",\" d5 = arg5[0, 1, *]\",\"end\"]}]}","code.85.illegal-struct-op.spec.ts":"{\"suiteName\":\"Illegal structure\",\"fileName\":\"code.85.illegal-struct-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro struct_checks\",\"compile_opt idl2\",\"\",\"str = {a: 42}\",\"\",\"a = 1 + str\",\"\",\"b = str + {a: 42}\",\"\",\"c = str + list()\",\"\",\"d = str + hash()\",\"\",\"e = str + orderedhash()\",\"\",\"f = str + dictionary()\",\"end\"]}]}","code.86.illegal-list-op.spec.ts":"{\"suiteName\":\"Illegal list\",\"fileName\":\"code.86.illegal-list-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro list_checks\",\"compile_opt idl2\",\"\",\"a = 1 + list()\",\"\",\"b = list() + list()\",\"\",\"c = list() + hash()\",\"\",\"d = list() + orderedhash()\",\"\",\"e = list() + dictionary()\",\"end\"]}]}","code.87.illegal-hash-op.spec.ts":"{\"suiteName\":\"Illegal hash\",\"fileName\":\"code.87.illegal-hash-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro hash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + hash()\",\"\",\"b = hash() + list()\",\"\",\"c = hash() + hash()\",\"\",\"d = hash() + orderedhash()\",\"\",\"e = hash() + dictionary()\",\"end\"]}]}","code.88.illegal-ordered-hash-op.spec.ts":"{\"suiteName\":\"Illegal ordered hash\",\"fileName\":\"code.88.illegal-ordered-hash-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro orderedhash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + orderedhash()\",\"\",\"b = orderedhash() + list()\",\"\",\"c = orderedhash() + hash()\",\"\",\"d = orderedhash() + orderedhash()\",\"\",\"e = orderedhash() + dictionary()\",\"end\"]}]}","code.89.illegal-dictionary-op.spec.ts":"{\"suiteName\":\"Illegal dictionary\",\"fileName\":\"code.89.illegal-dictionary-op.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro dictionary_checks\",\"compile_opt idl2\",\"\",\"a = 1 + dictionary()\",\"\",\"b = dictionary() + list()\",\"\",\"c = dictionary() + hash()\",\"\",\"d = dictionary() + orderedhash()\",\"\",\"e = dictionary() + dictionary()\",\"end\"]}]}","code.90.potential-type-incompatibility.spec.ts":"{\"suiteName\":\"Potential type incompatibility in\",\"fileName\":\"code.90.potential-type-incompatibility.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"a = 1 + ENVIRaster()\",\"\",\"b = 1 + plot()\",\"end\"]},{\"name\":\"no problems with array creation\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"arr1 = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster()]\",\"arr2 = [{}, {}]\",\"end\"]},{\"name\":\"problems with array creation\",\"code\":[\"pro incompatible_checks\",\"compile_opt idl2\",\"\",\"bad1 = [ENVIRaster(), {}]\",\"bad2 = [{}, 1]\",\"end\"]}]}","code.91.illegal-index-type.spec.ts":"{\"suiteName\":\"Illegal index checks for\",\"fileName\":\"code.91.illegal-index-type.spec.ts\",\"tests\":[{\"name\":\"all types\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro index_problems, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\" ; for arrays\",\" !null = arg1[plot()]\",\" !null = arg1[1j]\",\" !null = arg1[1i]\",\" !null = arg1[1di]\",\" !null = arg1[1dj]\",\"\",\" ; for lists\",\" !null = arg2[plot()]\",\" !null = arg2[1j]\",\" !null = arg2[1i]\",\" !null = arg2[1di]\",\" !null = arg2[1dj]\",\"\",\" ; for hashes\",\" !null = arg3[plot()]\",\" !null = arg3[1j]\",\" !null = arg3[1i]\",\" !null = arg3[1di]\",\" !null = arg3[1dj]\",\"\",\" ; for ordered hashes\",\" !null = arg4[plot()]\",\" !null = arg4[1j]\",\" !null = arg4[1i]\",\" !null = arg4[1di]\",\" !null = arg4[1dj]\",\"\",\" ; for dictionaries\",\" !null = arg5[plot()]\",\" !null = arg5[1j]\",\" !null = arg5[1i]\",\" !null = arg5[1di]\",\" !null = arg5[1dj]\",\"end\"]},{\"name\":\"allow boolean since it is really a number\",\"code\":[\"pro index_problems\",\" compile_opt idl2\",\"\",\" ; for arrays\",\" display = strarr(c)\",\" i = keyword_set(!null)\",\" !null = display[i]\",\"end\"]}]}","code.92.potential-arr-type-incompatibility.spec.ts":"{\"suiteName\":\"Array data type incompatibility\",\"fileName\":\"code.92.potential-arr-type-incompatibility.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro array_incompatibility, arg1, arg4, arg5\",\" compile_opt idl2\",\"\",\" ; OK\",\" a = arg1 + arg4\",\"\",\" ; bad\",\" b = arg1 + arg4 + arg5\",\"end\"]}]}","code.93.ptr-nothing-to-de-ref.spec.ts":"{\"suiteName\":\"De-referencing noting\",\"fileName\":\"code.93.ptr-nothing-to-de-ref.spec.ts\",\"tests\":[{\"name\":\"with asterisks\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\"\",\" ; yikes\",\" a = *\",\"\",\" ; bad\",\" b = (*)\",\"end\"]}]}","code.94.ptr-de-ref-illegal.spec.ts":"{\"suiteName\":\"Pointer de-ref without pointers\",\"fileName\":\"code.94.ptr-de-ref-illegal.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; any, unable to de-reference\",\" d = *5\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"end\"]}]}","code.95.indexing-error.spec.ts":"{\"suiteName\":\"Errors for indexing\",\"fileName\":\"code.95.indexing-error.spec.ts\",\"tests\":[{\"name\":\"variables that cannot be indexed\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; a: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\"; b: in, required, ComplexNumber\",\"; Placeholder docs for argument, keyword, or property\",\"; c: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; d: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; e: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; f: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; g: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\"; h: in, required, ENVIRasterMetadata\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function allowed_to_index, a, b, c, d, e, f, g, h\",\" compile_opt idl2\",\"\",\" ; OK\",\" !null = c[0]\",\" !null = d[0]\",\" !null = e[0]\",\" !null = f[0]\",\" !null = g[0]\",\"\",\" ; also OK, though non standard IDL types\",\" !null = h[0]\",\"\",\" ; problems\",\" byte = ('s' + 1b)[0]\",\" int = ('s' + 1s)[0]\",\" uint = ('s' + 1us)[0]\",\" long = ('s' + 1l)[0]\",\" ulong = ('s' + 1ul)[0]\",\" long64 = ('s' + 1ll)[0]\",\" ulong64 = ('s' + 1ull)[0]\",\" float1 = ('s' + 1.)[0]\",\" float2 = ('s' + 1e)[0]\",\" double = ('s' + 1d)[0]\",\" biginteger = ('s' + BigInteger(5))[0]\",\" number = ('s' + a)[0]\",\" complexfloat = ('s' + 1.i)[0]\",\" complexdouble = ('s' + 1di)[0]\",\" complexdouble = ('s' + 1dj)[0]\",\" complexnumber1 = ('s' + a + 1di + 1dj)[0]\",\" complexnumber2 = (a + b)[0]\",\"\",\" return, 1\",\"end\"]}]}","code.96.ptr-de-ref-ambiguity.spec.ts":"{\"suiteName\":\"Pointer de-ref without pointers\",\"fileName\":\"code.96.ptr-de-ref-ambiguity.spec.ts\",\"tests\":[{\"name\":\"operations\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; ambiguous\",\" c = *arg4\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"end\"]}]}","code.97.unknown-kw.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.spec.ts\",\"tests\":[{\"name\":\"and report errors if we dont have \\\"_extra\\\" or \\\"_ref_extra\\\"\",\"code\":[\";+\",\"; :Description:\",\"; Constructor\",\";\",\"; :Returns:\",\"; myclass\",\";\",\";-\",\"function myclass::Init\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::method, kw = kw, _ref_extra = _extra\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::method, kw = kw, _extra = _extra\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; Class definition procedure\",\";\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" struct = {myclass}\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Long\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, Byte\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro mypro, kw = kw\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"mypro, kw = a, /kw2, kw3 = 3\",\"\",\"; functions\",\"!null = myfunc(kw = b, /kw2, kw3 = 3)\",\"\",\"; make class for methods\",\"var = myclass()\",\"\",\"; procedure methods\",\"var.method, kw = c, /kw2, kw3 = 3\",\"\",\"; function methods\",\"!null = var.method(kw = d, /kw2, kw3 = 3)\",\"end\"]}]}","code.97.unknown-kw.exceptions.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions.spec.ts\",\"tests\":[{\"name\":\"and exclude these cases\",\"code\":[\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"p = plot(/tes)\",\"end\"]},{\"name\":\"unless we have extra or ref extra (only one at a time)\",\"code\":[\";+\",\"; :Keywords:\",\"; _ref_extra: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example2, _ref_extra = ex\",\" compile_opt idl2\",\"\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; _extra: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, _extra = ex\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"\",\"; OK with only extra\",\"auto_doc_example, /anything_i_want\",\"\",\"; OK with only ref extra\",\"auto_doc_example2, /anything_i_want\",\"\",\"end\"]}]}","code.97.unknown-kw.exceptions2.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions2.spec.ts\",\"tests\":[{\"name\":\"but always ignore extra and strict extra\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function auto_doc_example\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"\",\"; no error\",\"a = auto_doc_example(_extra = !null)\",\"\",\"; no error\",\"a = auto_doc_example(_strict_extra = !null)\",\"\",\"end\"]}]}","code.97.unknown-kw.exceptions3.spec.ts":"{\"suiteName\":\"Check for known keywords\",\"fileName\":\"code.97.unknown-kw.exceptions3.spec.ts\",\"tests\":[{\"name\":\"but always obj_new\",\"code\":[\"; main\",\"compile_opt idl2\",\"\",\"; no error\",\"outClass = 'something'\",\"!null = OBJ_NEW(outClass, FOLD_CASE=!null))\",\"\",\"end\"]}]}","code.98.incomplete-ternary.spec.ts":"{\"suiteName\":\"Check for incomplete ternary\",\"fileName\":\"code.98.incomplete-ternary.spec.ts\",\"tests\":[{\"name\":\"operators missing the second half\",\"code\":[\"compile_opt idl2\",\"; wrong\",\"a = !true ? 5\",\"\",\"; right\",\"!null = !true ? 5 : 'yeah'\",\"\",\"; right\",\"!null = !true ? (5) : 'yeah'\",\"\",\"end\"]}]}","code.99.undefined-var.spec.ts":"{\"suiteName\":\"Detect undefined variables\",\"fileName\":\"code.99.undefined-var.spec.ts\",\"tests\":[{\"name\":\"in most places\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro undefined_without_common, a, b, c\",\" compile_opt idl2\",\"\",\" ; direct vars\",\" test1 = bad\",\"\",\" ; within child branches\",\" test2 = (ok = 5) + wrong\",\"\",\" ; as keyword\",\" test3 = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\" ; OK\",\" for i = 0, 100 do begin\",\" !null = i\",\" endfor\",\"\",\" ; item is bad\",\" foreach val, item, key do begin\",\" !null = val\",\" !null = key\",\" endforeach\",\"\",\" ; noBueno is bad\",\" noBueno->method\",\"end\"]},{\"name\":\"never define self\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function dataToMemoryRaster\",\" compile_opt idl2\",\"\",\" ; should error\",\" self = 5\",\"\",\" ; should error\",\" a = self\",\"\",\" return, 1\",\"end\"]},{\"name\":\"define self in methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::mymethod\",\" compile_opt idl2\",\"\",\" ; no error\",\" self = 5\",\"\",\" ; no error\",\" a = self\",\"\",\" return, 1\",\"end\"]},{\"name\":\"catc\",\"code\":[\"compile_opt idl2\",\"filename = filepath('qb_boulder_msi', root = nv.root_dir)\",\"end\"]}]}","code.99.undefined-var.edge-cases.spec.ts":"{\"suiteName\":\"Check unknown variables in edge cases\",\"fileName\":\"code.99.undefined-var.edge-cases.spec.ts\",\"tests\":[{\"name\":\"in keywords\",\"code\":[\"compile_opt idl2\",\"filename = filepath('qb_boulder_msi', root = nv.root_dir)\",\"end\"]},{\"name\":\"pointer value assignment\",\"code\":[\"compile_opt idl2\",\"*other = 42\",\"end\"]}]}","code.99.undefined-var.exceptions1.spec.ts":"{\"suiteName\":\"Don't check unknown keywords\",\"fileName\":\"code.99.undefined-var.exceptions1.spec.ts\",\"tests\":[{\"name\":\"in in methods that we dont know\",\"code\":[\" compile_opt idl2\",\"l = luna(/in_package)\",\"(l.expects(routine)).toRunFunction, raster, _output = output\",\"end\"]},{\"name\":\"verify we process parents before children\",\"code\":[\" compile_opt idl2\",\" item = list()\",\" ; item is bad\",\" foreach val, item, key do begin\",\" val = 5\",\" endforeach\",\"end\"]}]}","code.99.undefined-var.exceptions2.spec.ts":"{\"suiteName\":\"Without docs, keywords are least restrictive\",\"fileName\":\"code.99.undefined-var.exceptions2.spec.ts\",\"tests\":[{\"name\":\"and bidirectional\",\"code\":[\"pro unknown_kw_relaxed, kw = kw\",\"compile_opt idl2\",\"end\",\"\",\"; main\",\"compile_opt idl2\",\"unknown_kw_relaxed, kw = newVar\",\"end\"]}]}","code.99.undefined-var.exceptions3.spec.ts":"{\"suiteName\":\"Without known global, arguments are least restrictive\",\"fileName\":\"code.99.undefined-var.exceptions3.spec.ts\",\"tests\":[{\"name\":\"and bidirectional\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; data: bidirectional, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function dataToMemoryRaster, data\",\" compile_opt idl2, hidden\",\"\",\" ; make everything\",\" oSvc = obj_new('IDLcfSvcOpenMemoryRaster') ; IDLcfSvcOpenMemoryRaster()\",\" ok = oSvc.Open(memory_data = data, '', oRaster, data_type = data.typecode)\",\" ok = IDLcfGetServiceObject(!null, 'ManageRaster', oManageRaster)\",\" void = oManageRaster.ManageBands(oRaster)\",\"\",\" ; return our raster\",\" return, ENVIWrapComponent(oRaster)\",\"end\"]}]}","code.99.undefined-var.exceptions4.spec.ts":"{\"suiteName\":\"Keyword variables should be defined\",\"fileName\":\"code.99.undefined-var.exceptions4.spec.ts\",\"tests\":[{\"name\":\"and not report errors\",\"code\":[\"function bridge_it::Init, nbridges, init = init, msg = msg, logdir = logdir, nrefresh = nrefresh, prefix = prefix\",\"compile_opt idl2, hidden\",\"\",\"; check to see if different messag eneeds to be used\",\"if ~keyword_set(msg) then self.msg = 'Time to complete bridge process (sec): ' else self.msg = msg\",\"\",\"; check to see if we have a number of processes to complete before refreshing the bridges\",\"; otherwise set the refresh number to an absurbly high result!\",\"if keyword_set(nrefresh) then self.nrefresh = nrefresh else self.nrefresh = 1000000l\",\"\",\"; check if init keyword is set, if so then we want to save the init string\",\"if keyword_set(init) then self.init = strjoin(init, ' & ')\",\"\",\"; check if logdir is specified\",\"if keyword_set(logdir) then begin\",\" if file_test(logdir) then begin\",\" self.logdir = logdir\",\" endif else begin\",\" message, 'Specified LOGDIR does not exist!'\",\" endelse\",\"endif\",\"\",\"return, 1\",\"end\"]}]}","code.99.undefined-var.exceptions5.spec.ts":"{\"suiteName\":\"With lambda functions\",\"fileName\":\"code.99.undefined-var.exceptions5.spec.ts\",\"tests\":[{\"name\":\"do not extract or check variables\",\"code\":[\"; main level\",\"compile_opt idl2\",\"!null = lambda(n:n le 3 || min(n mod [2:fix(sqrt(n))]))\",\"end\"]}]}","code.99.undefined-var.exceptions6.spec.ts":"{\"suiteName\":\"With common blocks\",\"fileName\":\"code.99.undefined-var.exceptions6.spec.ts\",\"tests\":[{\"name\":\"skip the name of the common block\",\"code\":[\"; main level\",\"compile_opt idl2\",\"common theName, a1, bb, cc\",\"end\"]}]}","code.100.potential-undefined-var.spec.ts":"{\"suiteName\":\"Detect undefined variables\",\"fileName\":\"code.100.potential-undefined-var.spec.ts\",\"tests\":[{\"name\":\"when we have a common block present\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro undefined_with_common, a, b, c\",\" compile_opt idl2\",\" common\",\"\",\" ; direct vars\",\" test1 = bad\",\"\",\" ; within child branches\",\" test2 = (ok = 5) + wrong\",\"\",\" ; as keyword\",\" test3 = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\" ; OK\",\" for i = 0, 100 do begin\",\" !null = i\",\" endfor\",\"\",\" ; item is bad\",\" foreach val, item, key do begin\",\" !null = val\",\" !null = key\",\" endforeach\",\"\",\" ; noBueno is bad\",\" noBueno->method\",\"end\"]},{\"name\":\"dont add a var for the first child of a common block\",\"code\":[\"pro color_edit_back\",\"compile_opt idl2\",\"\",\"common color_edit, wxsize, wysize, r0\",\"\",\"for i = wysize - 60, wysize - 30 do tv, ramp, wxsize / 2 - 256, i\",\"\",\"cx = wxsize / 4.\",\"cy = wysize - 90. - r0\",\"\",\"a = color_edit\",\"\",\"return\",\"end\"]}]}","code.101.var-use-before-def.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.101.var-use-before-def.spec.ts\",\"tests\":[{\"name\":\"when we dont have a common-block present\",\"code\":[\"pro before_defined_no_common\",\"compile_opt idl2\",\"\",\"; problemo\",\"a = b\",\"\",\"; define\",\"b = 5\",\"\",\"; complex problem0\",\"c = d + (d = 5)\",\"\",\"; no problemo\",\"f = (g = 6) + g\",\"end\"]}]}","code.101.var-use-before-def.exceptions.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.101.var-use-before-def.exceptions.spec.ts\",\"tests\":[{\"name\":\"does not trigger anywhere\",\"code\":[\"function ReadExif::_GetName, tag, image = img, photo = pht, gps = gps, iop = iop\",\"compile_opt idl2, hidden\",\"\",\"name = ''\",\"img = keyword_set(img)\",\"pht = keyword_set(pht)\",\"gps = keyword_set(gps)\",\"iop = keyword_set(iop)\",\"\",\"; if none are set, default to all\",\"if (array_equal([img, pht, gps, iop], 0)) then begin\",\" img = (pht = (gps = (iop = 1)))\",\"endif\",\"\",\"if (iop) then begin\",\" if (self.ioptags.HasKey(tag)) then begin\",\" name = self.ioptags[tag]\",\" endif\",\"endif\",\"\",\"if (gps) then begin\",\" if (self.gpstags.HasKey(tag)) then begin\",\" name = self.gpstags[tag]\",\" endif\",\"endif\",\"\",\"if (pht) then begin\",\" if (self.phototags.HasKey(tag)) then begin\",\" name = self.phototags[tag]\",\" endif\",\"endif\",\"\",\"if (img) then begin\",\" if (self.imagetags.HasKey(tag)) then begin\",\" name = self.imagetags[tag]\",\" endif\",\"endif\",\"\",\"return, name\",\"end\"]}]}","code.102.potential-var-use-before-def.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.102.potential-var-use-before-def.spec.ts\",\"tests\":[{\"name\":\"when we dont have a common-block present\",\"code\":[\"pro before_defined_common\",\"compile_opt idl2\",\"common\",\"\",\"; problemo\",\"a = b\",\"\",\"; define\",\"b = 5\",\"\",\"; complex problem0\",\"c = d + (d = 5)\",\"\",\"; no problemo\",\"f = (g = 6) + g\",\"end\"]}]}","code.102.potential-var-use-before-def.exception.spec.ts":"{\"suiteName\":\"Use variable before it is defined\",\"fileName\":\"code.102.potential-var-use-before-def.exception.spec.ts\",\"tests\":[{\"name\":\"does not get triggered here\",\"code\":[\"pro IDLitVisAxis2::OnViewportChange, oDestination\",\" compile_opt idl2, hidden\",\"\",\" if (obj_valid(oDestination)) then $\",\" oDestination.GetProperty, current_zoom = zoomFactor $\",\" else $\",\" zoomFactor = 1.0\",\"\",\"end\"]}]}","code.103.ambiguous-keyword-abbreviation.spec.ts":"{\"suiteName\":\"Keywords that are abbreviated but\",\"fileName\":\"code.103.ambiguous-keyword-abbreviation.spec.ts\",\"tests\":[{\"name\":\"have multiple for auto complete\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::mymethod, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::mymethod, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\"end\",\"\",\";+\",\"; :myclass:\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" !null = {myclass}\",\"\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function auto_doc_example, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw1: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\"; kw2: bidirectional, optional, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main leve program\",\"compile_opt idl2\",\"\",\"; problem 1\",\"auto_doc_example, /kw\",\"\",\"; problem 2\",\"!null = auto_doc_example(kw = 5)\",\"\",\"a = {myclass}\",\"\",\"; problem 3\",\"a.mymethod, kw = 5\",\"\",\"; problem 4\",\"!null = a.mymethod(/kw)\",\"\",\"end\"]}]}","code.103.ambiguous-keyword-abbreviation.exceptions.spec.ts":"{\"suiteName\":\"Keywords that could be abbreviated\",\"fileName\":\"code.103.ambiguous-keyword-abbreviation.exceptions.spec.ts\",\"tests\":[{\"name\":\"but have a direct match\",\"code\":[\"; main leve program\",\"compile_opt idl2\",\"\",\"; problem 1\",\"device, /close\",\"\",\"end\"]}]}","code.104.unused-var.spec.ts":"{\"suiteName\":\"Unused variable\",\"fileName\":\"code.104.unused-var.spec.ts\",\"tests\":[{\"name\":\"problems with args, kws, and vars\",\"code\":[\"function test1, a, b, kw = kw\",\" compile_opt idl2\",\" c = 5\",\" return, 1\",\"end\"]},{\"name\":\"no problems when used\",\"code\":[\"function test1, a, b, kw = kw\",\" compile_opt idl2\",\" c = 5\",\" !null = a + b + c + keyword_set(kw)\",\" return, 1\",\"end\"]}]}","code.104.unused-var.exceptions1.spec.ts":"{\"suiteName\":\"Unused variable\",\"fileName\":\"code.104.unused-var.exceptions1.spec.ts\",\"tests\":[{\"name\":\"exceptions for static references\",\"code\":[\"compile_opt idl2\",\"!null = ENVI.openRaster()\",\"end\"]}]}","code.104.unused-var.exceptions2.spec.ts":"{\"suiteName\":\"Unused var exceptions when parentheses for indexing\",\"fileName\":\"code.104.unused-var.exceptions2.spec.ts\",\"tests\":[{\"name\":\"is var\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"is not var\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}","code.105.illegal-var-index.spec.ts":"{\"suiteName\":\"Indexing with parentheses\",\"fileName\":\"code.105.illegal-var-index.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}","type-validation-reference.spec.ts":"{\"suiteName\":\"All the places we want to make sure we test for\",\"fileName\":\"type-validation-reference.spec.ts\",\"tests\":[{\"name\":\"type validation\",\"code\":[\";+\",\"; :Arguments:\",\"; arg3: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro validate_problems, arg3, arg4\",\" compile_opt idl3\",\"\",\" ; validation edge cases\",\" ; same variables should always have validation applied, but not always saved\",\" dup1 = arg3[arg4]\",\" dup1 = arg3[arg4]\",\"\",\" ; anything with assignment before should validate\",\" !x.charsize = arg3[arg4]\",\" !null = arg3[arg4]\",\"\",\" ; arguments and keywords\",\" a = polot1(arg3[arg4], $\",\" arg3[arg4], $\",\" thing = arg3[arg4], $\",\" thang = arg3[arg4])\",\"\",\" ; left-side of the equation\",\" arg3[arg4] = 5\",\" (arg3[arg4]) = 5\",\" (myfunc(arg3[arg4])) = 5\",\" !null = (myfunc2(arg3[arg4]))\",\" !null = (myfunc3(arg3[arg4])) + 1\",\"\",\" ; arguments\",\" a = polot2(arg3[arg4], arg3[arg4])\",\"end\"]}]}","docs-problems-when-docs-below.spec.ts":"{\"suiteName\":\"Properly reports problems for docs\",\"fileName\":\"docs-problems-when-docs-below.spec.ts\",\"tests\":[{\"name\":\"when blocks are inside procedures\",\"code\":[\"pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";-\",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"end\"]},{\"name\":\"when blocks are inside functions\",\"code\":[\"function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";-\",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"rturn, 1\",\"end\"]},{\"name\":\"when blocks are inside functions\",\"code\":[\";+\",\"; No problems for me!!! Im care free!!!\",\";-\",\"\",\"\",\"function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";-\",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"rturn, 1\",\"end\"]}]}"},"auto-selected-token-tests":{"basic.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"basic.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"code\":[\"function myfunc\",\" return,1\",\"end\",\"\",\"; main level\",\"something = 42\",\"end\"],\"position\":[{\"line\":0,\"character\":0},{\"line\":3,\"character\":0}]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly identifies keywords from routine calls\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"code\":[\"; main level\",\"r = ENVIRaster(NCOLUMNS = nCols, NROWS = nrows)\",\"end\"],\"position\":[{\"line\":1,\"character\":20},{\"line\":1,\"character\":35}]}]}","proper-parent.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"proper-parent.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens with multiple parent routines\",\"code\":[\"function myfunc2\",\" compile_opt idl2\",\" a = 42\",\" return,1\",\"end\",\"\",\"function myfunc1\",\" compile_opt idl2\",\" a = 17\",\" return,1\",\"end\"],\"position\":[{\"line\":2,\"character\":2},{\"line\":8,\"character\":2}]}]}","relaxed.spec.ts":"{\"suiteName\":\"Correctly use relaxed options for hover help\",\"fileName\":\"relaxed.spec.ts\",\"tests\":[{\"name\":\"at end of assignment\",\"code\":[\"function myfunc1\",\" compile_opt idl2\",\" a = \",\" return,1\",\"end\"],\"position\":[{\"line\":2,\"character\":5},{\"line\":8,\"character\":6}]}]}","within-parent.spec.ts":"{\"suiteName\":\"Find the right token when we do/don't have anything selected\",\"fileName\":\"within-parent.spec.ts\",\"tests\":[{\"name\":\"with a branch token\",\"code\":[\"args.setData, \",\"end\"],\"position\":[{\"line\":0,\"character\":12},{\"line\":0,\"character\":13},{\"line\":0,\"character\":14},{\"line\":0,\"character\":15},{\"line\":0,\"character\":16}]}]}"},"auto-hover-help-tests":{"bracket-paren.1.spec.ts":"{\"suiteName\":\"Correctly provides hover help for\",\"fileName\":\"bracket-paren.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/hover-help/bracket_paren.pro\",\"position\":[{\"line\":14,\"character\":20},{\"line\":17,\"character\":21},{\"line\":17,\"character\":27},{\"line\":20,\"character\":20},{\"line\":23,\"character\":25},{\"line\":24,\"character\":13}]}]}","comment-regression.spec.ts":"{\"suiteName\":\"Correctly get hover help\",\"fileName\":\"comment-regression.spec.ts\",\"tests\":[{\"name\":\"for comment edge case\",\"file\":\"idl/test/hover-help/comment_regression.pro\",\"position\":[{\"line\":3,\"character\":12},{\"line\":5,\"character\":13}]}]}","docs-overrides.spec.ts":"{\"suiteName\":\"Correctly overrides doc hover help\",\"fileName\":\"docs-overrides.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/docs_overrides.pro\",\"position\":[{\"line\":3,\"character\":8},{\"line\":3,\"character\":13},{\"line\":3,\"character\":22}]}]}","docs-overrides.2.spec.ts":"{\"suiteName\":\"Correctly overrides doc hover help\",\"fileName\":\"docs-overrides.2.spec.ts\",\"tests\":[{\"name\":\"for structure properties\",\"file\":\"idl/test/hover-help/docs_overrides2.pro\",\"position\":[{\"line\":6,\"character\":11}]}]}","ex-1.spec.ts":"{\"suiteName\":\"Correctly identifies search terms from syntax tree\",\"fileName\":\"ex-1.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/awesomerasterintersection.pro\",\"position\":[{\"line\":87,\"character\":10},{\"line\":90,\"character\":7},{\"line\":91,\"character\":25}]}]}","ex-2.spec.ts":"{\"suiteName\":\"Correctly identifies keywords from routine calls\",\"fileName\":\"ex-2.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/myfunc.pro\",\"position\":[{\"line\":24,\"character\":12},{\"line\":24,\"character\":20},{\"line\":27,\"character\":6},{\"line\":32,\"character\":6},{\"line\":40,\"character\":13}]}]}","ex-3.spec.ts":"{\"suiteName\":\"Correctly finds no information for parameters in docs but not code\",\"fileName\":\"ex-3.spec.ts\",\"tests\":[{\"name\":\"with keywords and arguments\",\"file\":\"idl/test/hover-help/only_code.pro\",\"position\":[{\"line\":26,\"character\":2},{\"line\":27,\"character\":2}]}]}","init-methods.spec.ts":"{\"suiteName\":\"Verify hover-help for\",\"fileName\":\"init-methods.spec.ts\",\"tests\":[{\"name\":\"init methods\",\"file\":\"idl/test/hover-help/init_method.pro\",\"position\":[{\"line\":13,\"character\":14},{\"line\":16,\"character\":19}]}]}","keywords.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"keywords.spec.ts\",\"tests\":[{\"name\":\"abbreviated keywords\",\"file\":\"idl/test/hover-help/keywords.pro\",\"position\":[{\"line\":4,\"character\":13}]}]}","literal-types.spec.ts":"{\"suiteName\":\"Correctly display help for literal types\",\"fileName\":\"literal-types.spec.ts\",\"tests\":[{\"name\":\"for numbers and strings\",\"file\":\"idl/test/hover-help/literal_types.pro\",\"position\":[{\"line\":1,\"character\":2},{\"line\":2,\"character\":2},{\"line\":3,\"character\":2},{\"line\":4,\"character\":2},{\"line\":5,\"character\":2}]}]}","no-end.spec.ts":"{\"suiteName\":\"Correctly does not provide hover help\",\"fileName\":\"no-end.spec.ts\",\"tests\":[{\"name\":\"for end tokens but does for the beginning\",\"file\":\"idl/test/hover-help/middle_functions.pro\",\"position\":[{\"line\":3,\"character\":6},{\"line\":3,\"character\":10}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly find find definition from obj new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"case 1\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":53,\"character\":12}]},{\"name\":\"case 2\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":56,\"character\":12}]},{\"name\":\"keywords\",\"file\":\"idl/test/hover-help/obj_new.pro\",\"position\":[{\"line\":56,\"character\":35}]}]}","structures.spec.ts":"{\"suiteName\":\"Provide hover help for\",\"fileName\":\"structures.spec.ts\",\"tests\":[{\"name\":\"anonymous structures\",\"file\":\"idl/test/hover-help/structures.pro\",\"position\":[{\"line\":8,\"character\":10},{\"line\":9,\"character\":12},{\"line\":10,\"character\":14},{\"line\":11,\"character\":12}]}]}","structures-properties.spec.ts":"{\"suiteName\":\"Provide hover help for\",\"fileName\":\"structures-properties.spec.ts\",\"tests\":[{\"name\":\"named structure properties\",\"file\":\"idl/test/hover-help/structures2.pro\",\"position\":[{\"line\":13,\"character\":24},{\"line\":13,\"character\":34}]},{\"name\":\"anonymous structure properties\",\"file\":\"idl/test/hover-help/structures2.pro\",\"position\":[{\"line\":15,\"character\":9},{\"line\":15,\"character\":25}]}]}","syntax-errors.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"syntax-errors.spec.ts\",\"tests\":[{\"name\":\"incorrect function call\",\"file\":\"idl/test/hover-help/syntax_error.pro\",\"position\":[{\"line\":1,\"character\":8}]},{\"name\":\"the end of the function call start (regression test for crash)\",\"file\":\"idl/test/hover-help/syntax_error.pro\",\"position\":[{\"line\":1,\"character\":11}]}]}","tasks.spec.ts":"{\"suiteName\":\"Task type hover help\",\"fileName\":\"tasks.spec.ts\",\"tests\":[{\"name\":\"as regression for task type parsing and serialization\",\"file\":\"idl/test/hover-help/tasks.pro\",\"position\":[{\"line\":13,\"character\":14},{\"line\":14,\"character\":14},{\"line\":15,\"character\":14}]}]}","variables.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"variables.spec.ts\",\"tests\":[{\"name\":\"system variables\",\"file\":\"idl/test/hover-help/variables.pro\",\"position\":[{\"line\":5,\"character\":2}]}]}","type-detection.methods.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.methods.spec.ts\",\"tests\":[{\"name\":\"function method\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":10,\"character\":13}]},{\"name\":\"procedure methods\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":13,\"character\":6}]}]}","type-detection.properties.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.properties.spec.ts\",\"tests\":[{\"name\":\"first level properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":16,\"character\":16}]},{\"name\":\"secondary properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":16,\"character\":23}]},{\"name\":\"first level properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":19,\"character\":16}]},{\"name\":\"secondary properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":22,\"character\":25}]},{\"name\":\"static properties that exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":25,\"character\":16}]},{\"name\":\"static properties that dont exist\",\"file\":\"idl/test/hover-help/types.pro\",\"position\":[{\"line\":28,\"character\":22}]}]}","type-detection.methods-inheritance.spec.ts":"{\"suiteName\":\"Correctly provide hover help for\",\"fileName\":\"type-detection.methods-inheritance.spec.ts\",\"tests\":[{\"name\":\"function method\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":10,\"character\":13}]},{\"name\":\"procedure methods\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":13,\"character\":6}]}]}","type-detection.properties-inheritance.spec.ts":"{\"suiteName\":\"Correctly provide hover help for inheritance of\",\"fileName\":\"type-detection.properties-inheritance.spec.ts\",\"tests\":[{\"name\":\"first level properties that exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":16,\"character\":16}]},{\"name\":\"secondary properties that exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":16,\"character\":23}]},{\"name\":\"first level properties that dont exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":19,\"character\":16}]},{\"name\":\"secondary properties that dont exist\",\"file\":\"idl/test/hover-help/types_inheritance.pro\",\"position\":[{\"line\":22,\"character\":25}]}]}","type-detection.sysvar.spec.ts":"{\"suiteName\":\"Correctly provide hover help for system variable\",\"fileName\":\"type-detection.sysvar.spec.ts\",\"tests\":[{\"name\":\"properties that exist\",\"file\":\"idl/test/hover-help/types_sysvar.pro\",\"position\":[{\"line\":3,\"character\":15}]},{\"name\":\"properties that don't exist\",\"file\":\"idl/test/hover-help/types_sysvar.pro\",\"position\":[{\"line\":4,\"character\":14}]}]}","type-detection.keywords.spec.ts":"{\"suiteName\":\"Correctly provide hover help for keywords\",\"fileName\":\"type-detection.keywords.spec.ts\",\"tests\":[{\"name\":\"in method calls\",\"file\":\"idl/test/hover-help/types_keywords.pro\",\"position\":[{\"line\":10,\"character\":27},{\"line\":12,\"character\":19},{\"line\":12,\"character\":27}]}]}"},"auto-token-definition-tests":{"functions.spec.ts":"{\"suiteName\":\"Correctly find function definitions\",\"fileName\":\"functions.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":11}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":61,\"character\":11}]}]}","function-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for function methods\",\"fileName\":\"function-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":17},{\"line\":85,\"character\":14}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":88,\"character\":19}]}]}","include.spec.ts":"{\"suiteName\":\"Correctly find find include\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/include_test.pro\"],\"position\":[{\"line\":4,\"character\":7}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/include_test.pro\"],\"position\":[{\"line\":7,\"character\":8}]}]}","keywords.procedures.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.procedures.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":7}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":16},{\"line\":55,\"character\":8}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":30}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":37}]}]}","keywords.procedure-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.procedure-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":16},{\"line\":76,\"character\":16}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":25},{\"line\":76,\"character\":25},{\"line\":79,\"character\":17}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":38},{\"line\":76,\"character\":38}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":45},{\"line\":76,\"character\":45}]}]}","keywords.functions.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.functions.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":15}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":24},{\"line\":61,\"character\":16}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":37}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":58,\"character\":44}]}]}","keywords.function-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for keywords\",\"fileName\":\"keywords.function-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":24},{\"line\":85,\"character\":24}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":33},{\"line\":85,\"character\":33},{\"line\":88,\"character\":25}]},{\"name\":\"real binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":46},{\"line\":85,\"character\":46}]},{\"name\":\"fake binary\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":82,\"character\":53},{\"line\":85,\"character\":53}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly find find definition from obj new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/obj_new.pro\"],\"position\":[{\"line\":53,\"character\":12}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/obj_new.pro\"],\"position\":[{\"line\":56,\"character\":12}]}]}","procedures.spec.ts":"{\"suiteName\":\"Correctly find procedure definitions\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":52,\"character\":6}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":55,\"character\":2}]}]}","procedure-methods.spec.ts":"{\"suiteName\":\"Correctly find definitions for procedure methods\",\"fileName\":\"procedure-methods.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":73,\"character\":8},{\"line\":76,\"character\":8}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":79,\"character\":6}]}]}","properties.spec.ts":"{\"suiteName\":\"Correctly find definitions for properties\",\"fileName\":\"properties.spec.ts\",\"tests\":[{\"name\":\"real\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":64,\"character\":14},{\"line\":67,\"character\":14}]},{\"name\":\"fake\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":70,\"character\":14}]}]}","structures.spec.ts":"{\"suiteName\":\"Correctly find definitions in structures\",\"fileName\":\"structures.spec.ts\",\"tests\":[{\"name\":\"using structure names\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":40,\"character\":9}]},{\"name\":\"using properties (inherited, ours, fake)\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":43,\"character\":19},{\"line\":43,\"character\":31},{\"line\":43,\"character\":42}]},{\"name\":\"anonymous properties\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":94,\"character\":22}]}]}","tasks.spec.ts":"{\"suiteName\":\"Correctly find definitions for task files\",\"fileName\":\"tasks.spec.ts\",\"tests\":[{\"name\":\"from ENVITask function\",\"files\":[\"idl/test/token-def/tasks.pro\",\"idl/test/token-def/atanomalydetection.task\"],\"position\":[{\"line\":2,\"character\":12}]}]}","variables.spec.ts":"{\"suiteName\":\"Correctly find definitions in structures\",\"fileName\":\"variables.spec.ts\",\"tests\":[{\"name\":\"real variables\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":46,\"character\":9}]},{\"name\":\"fake variables\",\"files\":[\"idl/test/token-def/all_cases.pro\"],\"position\":[{\"line\":49,\"character\":9}]}]}"},"auto-auto-complete-tests":{"bracket-paren.1.spec.ts":"{\"suiteName\":\"Correctly provides auto complete for\",\"fileName\":\"bracket-paren.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/auto-complete/bracket_paren.pro\",\"position\":[{\"line\":14,\"character\":18},{\"line\":17,\"character\":24},{\"line\":20,\"character\":17},{\"line\":23,\"character\":19},{\"line\":24,\"character\":11}]}]}","dont-complete.spec.ts":"{\"suiteName\":\"Don't do auto-complete\",\"fileName\":\"dont-complete.spec.ts\",\"tests\":[{\"name\":\"for any of these\",\"file\":\"idl/test/auto-complete/dont_complete.pro\",\"position\":[{\"line\":1,\"character\":18},{\"line\":1,\"character\":19},{\"line\":1,\"character\":34},{\"line\":6,\"character\":9},{\"line\":6,\"character\":10},{\"line\":6,\"character\":25},{\"line\":13,\"character\":13},{\"line\":16,\"character\":2},{\"line\":17,\"character\":2},{\"line\":20,\"character\":9},{\"line\":21,\"character\":9},{\"line\":22,\"character\":9},{\"line\":25,\"character\":10},{\"line\":28,\"character\":10}]}]}","executive-commands.1.spec.ts":"{\"suiteName\":\"Correctly send only executive commands\",\"fileName\":\"executive-commands.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":36,\"character\":2}]}]}","include-properties.spec.ts":"{\"suiteName\":\"Include properties\",\"fileName\":\"include-properties.spec.ts\",\"tests\":[{\"name\":\"for procedure methods with only dots\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":22,\"character\":4}]},{\"name\":\"for static properties\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":26,\"character\":15}]}]}","in-structures.1.spec.ts":"{\"suiteName\":\"Verify auto-complete in structures\",\"fileName\":\"in-structures.1.spec.ts\",\"tests\":[{\"name\":\"for properties, property completion, and normal property completion\",\"file\":\"idl/test/auto-complete/in_structures.pro\",\"position\":[{\"line\":17,\"character\":15},{\"line\":19,\"character\":22},{\"line\":21,\"character\":47},{\"line\":24,\"character\":27},{\"line\":24,\"character\":28}]}]}","include.spec.ts":"{\"suiteName\":\"Verify auto-complete for\",\"fileName\":\"include.spec.ts\",\"tests\":[{\"name\":\"include statements\",\"file\":\"idl/test/auto-complete/include.pro\",\"position\":[{\"line\":2,\"character\":1}]}]}","init-methods.spec.ts":"{\"suiteName\":\"Verify auto-complete for\",\"fileName\":\"init-methods.spec.ts\",\"tests\":[{\"name\":\"init methods\",\"file\":\"idl/test/auto-complete/init_method.pro\",\"position\":[{\"line\":13,\"character\":10},{\"line\":16,\"character\":18}]}]}","keywords.1.spec.ts":"{\"suiteName\":\"Correctly provides auto complete for keywords\",\"fileName\":\"keywords.1.spec.ts\",\"tests\":[{\"name\":\"things after brackets and parentheses\",\"file\":\"idl/test/auto-complete/keywords.pro\",\"position\":[{\"line\":4,\"character\":10},{\"line\":7,\"character\":11},{\"line\":10,\"character\":15},{\"line\":13,\"character\":13},{\"line\":16,\"character\":14}]}]}","keywords.2.spec.ts":"{\"suiteName\":\"Correctly exclude keywords\",\"fileName\":\"keywords.2.spec.ts\",\"tests\":[{\"name\":\"for these cases\",\"file\":\"idl/test/auto-complete/keywords.pro\",\"position\":[{\"line\":22,\"character\":12},{\"line\":23,\"character\":11},{\"line\":24,\"character\":9}]}]}","methods.1.spec.ts":"{\"suiteName\":\"Verify types being used for\",\"fileName\":\"methods.1.spec.ts\",\"tests\":[{\"name\":\"methods\",\"file\":\"idl/test/auto-complete/types.pro\",\"position\":[{\"line\":10,\"character\":8},{\"line\":13,\"character\":4},{\"line\":26,\"character\":12}]}]}","no-init.spec.ts":"{\"suiteName\":\"Exclude init method\",\"fileName\":\"no-init.spec.ts\",\"tests\":[{\"name\":\"for function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":7,\"character\":12}]}]}","no-paren.spec.ts":"{\"suiteName\":\"Exclude parentheses\",\"fileName\":\"no-paren.spec.ts\",\"tests\":[{\"name\":\"for functions and function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":10,\"character\":9},{\"line\":11,\"character\":12},{\"line\":12,\"character\":14}]}]}","no-properties.spec.ts":"{\"suiteName\":\"Exclude properties\",\"fileName\":\"no-properties.spec.ts\",\"tests\":[{\"name\":\"for function methods\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":18,\"character\":12},{\"line\":19,\"character\":14}]},{\"name\":\"for procedure method\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":23,\"character\":7}]}]}","no-variables.spec.ts":"{\"suiteName\":\"Exclude variables\",\"fileName\":\"no-variables.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":15,\"character\":9}]}]}","procedures.1.spec.ts":"{\"suiteName\":\"When in procedure, send procedure tokens\",\"fileName\":\"procedures.1.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"file\":\"idl/test/auto-complete/procedures.pro\",\"position\":[{\"line\":4,\"character\":2}]}]}","obj-new.spec.ts":"{\"suiteName\":\"Correctly return auto-complete from obj-new\",\"fileName\":\"obj-new.spec.ts\",\"tests\":[{\"name\":\"real\",\"file\":\"idl/test/auto-complete/obj_new.pro\",\"position\":[{\"line\":53,\"character\":26}]},{\"name\":\"fake\",\"file\":\"idl/test/auto-complete/obj_new.pro\",\"position\":[{\"line\":56,\"character\":29}]}]}","procedures.spec.ts":"{\"suiteName\":\"Procedures\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"including user and variables\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":2,\"character\":0}]}]}","properties.1.spec.ts":"{\"suiteName\":\"Verify types being used for\",\"fileName\":\"properties.1.spec.ts\",\"tests\":[{\"name\":\"properties\",\"file\":\"idl/test/auto-complete/types.pro\",\"position\":[{\"line\":16,\"character\":15},{\"line\":19,\"character\":21},{\"line\":19,\"character\":21}]}]}","regression.1.spec.ts":"{\"suiteName\":\"Regression tests\",\"fileName\":\"regression.1.spec.ts\",\"tests\":[{\"name\":\"for problems\",\"file\":\"idl/test/auto-complete/regression1.pro\",\"position\":[{\"line\":2,\"character\":28}]}]}","structures-anonymous.spec.ts":"{\"suiteName\":\"Structures\",\"fileName\":\"structures-anonymous.spec.ts\",\"tests\":[{\"name\":\"without a name\",\"file\":\"idl/test/auto-complete/structures.pro\",\"position\":[{\"line\":8,\"character\":12},{\"line\":9,\"character\":14},{\"line\":10,\"character\":21}]},{\"name\":\"auto-complete for structure names\",\"file\":\"idl/test/auto-complete/structures.pro\",\"position\":[{\"line\":13,\"character\":11},{\"line\":14,\"character\":14}]}]}","tasks.functions.spec.ts":"{\"suiteName\":\"Task auto complete\",\"fileName\":\"tasks.functions.spec.ts\",\"tests\":[{\"name\":\"to make sure they look nice\",\"file\":\"idl/test/auto-complete/task_functions.pro\",\"position\":[{\"line\":3,\"character\":8}],\"startsWith\":\"ENVITask\"}]}","tasks.properties.spec.ts":"{\"suiteName\":\"Task auto complete\",\"fileName\":\"tasks.properties.spec.ts\",\"tests\":[{\"name\":\"as regression for task type parsing\",\"file\":\"idl/test/auto-complete/tasks.pro\",\"position\":[{\"line\":13,\"character\":4},{\"line\":14,\"character\":4},{\"line\":15,\"character\":4}]}]}","method-regression.spec.ts":"{\"suiteName\":\"Methods\",\"fileName\":\"method-regression.spec.ts\",\"tests\":[{\"name\":\"inside the paren showing variables\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":10,\"character\":10},{\"line\":11,\"character\":13},{\"line\":12,\"character\":15}]}]}","system-variables.1.spec.ts":"{\"suiteName\":\"Correctly send only system variables\",\"fileName\":\"system-variables.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/examples.pro\",\"position\":[{\"line\":29,\"character\":3},{\"line\":30,\"character\":9}]}]}","variables.1.spec.ts":"{\"suiteName\":\"Correctly finds the right variables\",\"fileName\":\"variables.1.spec.ts\",\"tests\":[{\"name\":\"when we auto-complete\",\"file\":\"idl/test/auto-complete/variables.pro\",\"position\":[{\"line\":6,\"character\":10},{\"line\":9,\"character\":2}]}]}"},"auto-local-global-scope-compile-types-tests":{"all-docs-work-right.spec.ts":"{\"suiteName\":\"Correctly gets docs and variables\",\"fileName\":\"all-docs-work-right.spec.ts\",\"tests\":[{\"name\":\"for a routine\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, KW1=kw1\",\" compile_opt idl2\",\" ;+ awesome variable with docs\",\" a = 42\",\" ;+\",\" ; Big comment block here\",\" ; like a great code writer\",\" ;-\",\" b = 42\",\"end\",\"\"]}]}","common.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"common.spec.ts\",\"tests\":[{\"name\":\"common, excluding the first of the common block\",\"code\":[\"pro color_edit_back\",\"compile_opt idl2\",\"\",\"common color_edit, wxsize, wysize, r0\",\"end\"]}]}","complex-docs-example1.spec.ts":"{\"suiteName\":\"Complex real world test\",\"fileName\":\"complex-docs-example1.spec.ts\",\"tests\":[{\"name\":\"with past failure in complex docs\",\"code\":[\";h+\",\"; Copyright (c) 2018 Harris Geospatial Solutions, Inc.\",\"; \",\"; Licensed under MIT. See LICENSE.txt for additional details and information.\",\";h-\",\"\",\"\",\"\",\";+\",\"; :Description:\",\"; Tool for determining the intersection between two rasters based on their\",\"; spatial reference and spatial extent. Both rasters will also contain only\",\"; the valid pixels from each scene for analysis. In other words, if a pixel\",\"; is `off` in the first image and not the second, it will be turned `off` in\",\"; each of the output rasters for consistency. If one of the rasters does not\",\"; have a data ignore value, then a pixel state mask is automatically generated\",\"; so that you can mask the output rasters if needed.\",\"; \",\"; The pixel size of the output rasters will be the smallest x and y\",\"; pixel size from each raster.\",\";\",\";\",\";\",\"; :Examples:\",\"; ```idl\",\"; ;start ENVI\",\"; e = envi(/HEADLESS)\",\"; \",\"; ;make sure we have access to our ENVI tasks\",\"; awesomeENVIAlgorithms, /INIT\",\"; \",\"; ;specify two rasters to process\",\"; raster1 = e.openRaster(file1)\",\"; raster2 = e.openRaster(file2)\",\"; \",\"; ;get our task\",\"; task = ENVITask('AwesomeRasterIntersection')\",\"; task.INPUT_RASTER1 = raster1\",\"; task.INPUT_RASTER2 = raster2\",\"; task.execute\",\"; \",\"; ;print our output locations\",\"; print, task.OUTPUT_RASTER1_URI\",\"; print, task.OUTPUT_RASTER2_URI\",\"; ```\",\";\",\"; :Keywords:\",\"; DEBUG: in, optional, type=boolean, private\",\"; If set, errors are stopped on.\",\"; DATA_IGNORE_VALUE: in, optional, type=number\",\"; If one or both of your input rasters do not have\",\"; a data ignore value metadata item, you can specify\",\"; GENERATE_PIXEL_STATE_MASK: in, optional, type=boolean\",\"; If set, then an addititonal output raster is created\",\"; that represents which pixels can be processed or not.\",\"; \",\"; This will automatically be generated if one of the input\",\"; images does not have a data ignore value.\",\"; INPUT_RASTER1: in, required, type=ENVIRaster\",\"; Specify the first raster to use for intersection.\",\"; INPUT_RASTER2: in, required, type=ENVIRaster\",\"; Specify the second raster to use for intersection\",\"; OUTPUT_GRID_DEFINITION: out, optional, type=ENVIGridDefinition\",\"; Optionally return the ENVIGridDefinition object used to get the intersection\",\"; of the two scenes.\",\"; OUTPUT_RASTER1_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the first intersect raster.\",\"; OUTPUT_RASTER2_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the second intersect raster.\",\"; OUTPUT_MASK_RASTER_URI: in, optional, type=string\",\"; Optionally specify the fully-qualified filepath\",\"; for the location of the pixel state mask. Only applies\",\"; when `GENERATE_PIXEL_STATE_MASK` is set or one of the \",\"; input rasters does not have a data ignore value.\",\"; RESAMPLING: in, optional, type=string\",\"; Optionally return the ENVIGridDefinition object used to get the intersection\",\"; of the two scenes. Specify one of the following options:\",\"; - Nearest Neighbor\",\"; - Bilinear\",\"; - Cubic Convolution\",\";\",\"; :Tooltip:\",\"; Calculates the intersection of two rasters such that both\",\"; have the same spatial extent and spatial dimensions\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";-\",\"pro awesomeRasterIntersection, $\",\" DEBUG = debug,$\",\" DATA_IGNORE_VALUE = data_ignore_value,$\",\" GENERATE_PIXEL_STATE_MASK = generate_pixel_state_mask,$\",\" INPUT_RASTER1 = input_raster1,$\",\" INPUT_RASTER2 = input_raster2,$\",\" OUTPUT_MASK_RASTER_URI = output_mask_raster_uri,$\",\" OUTPUT_GRID_DEFINITION = output_grid_definition,$\",\" OUTPUT_RASTER1_URI = output_raster1_uri,$\",\" OUTPUT_RASTER2_URI = output_raster2_uri,$\",\" RESAMPLING = resampling\",\" compile_opt idl2, hidden\",\"end\",\"\"]}]}","complex-docs-example2.spec.ts":"{\"suiteName\":\"Complex real world test\",\"fileName\":\"complex-docs-example2.spec.ts\",\"tests\":[{\"name\":\"with past failure in complex docs\",\"code\":[\";+\",\"; :Description:\",\"; Function which will initialize the bdige_it object and start all bridges. When bridges are initialized\",\"; they are done so in parallel, but whe function will not return until every bridge is idle again.\",\";\",\"; :Params:\",\"; nbridges: in, required, type=int\",\"; The number of bridges that you want to create\",\";\",\"; :Keywords:\",\"; INIT : in, optional, type=strarr\",\"; Optional argument which allows you to pass in a string array of extra commands\",\"; to have each IDL_IDLBridge object execute upon creation.\",\"; MSG : in, optional, type=string\",\"; Optional argument to show the message prefix when a bridge process has completed for the TIME\",\"; keyword in bridge_it::run and bridge_it::run().\",\"; LOGDIR : in, optional, type=string\",\"; Specify the directory that the log file will be written to. The log file is just a text file with\",\"; all of the IDL Console output from each child process.\",\"; NREFRESH : in, optional, type=long\",\"; Specify the number of bridge processes to execute before closing and re-starting the\",\"; child process. Necessary for some ENVI routines so that we don't have memory fragmentation\",\"; regarding opening lots of small rasters.\",\"; PREFIX : in, optional, type=string, default='_KW_'\",\"; This optional keyword specifies the prefix which is used to differentiate between arguments and\",\"; keywords when it comes time to parse the arguments and keyword that will be passed into a routine.\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";\",\";-\",\"function bridge_it::Init, nbridges, INIT = init, MSG = msg, LOGDIR = logdir, NREFRESH = nrefresh, PREFIX = prefix\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" return, 1\",\"end\"]}]}","docs-below-1.spec.ts":"{\"suiteName\":\"Extract docs below routines\",\"fileName\":\"docs-below-1.spec.ts\",\"tests\":[{\"name\":\"for procedure\",\"code\":[\"pro parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";- \",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"end\"]},{\"name\":\"for function\",\"code\":[\"function parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";- \",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"return, 1\",\"end\"]}]}","document-vars.spec.ts":"{\"suiteName\":\"Correctly extract docs for\",\"fileName\":\"document-vars.spec.ts\",\"tests\":[{\"name\":\"variables with single-line block\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+ meaning of life\",\" a = 42\",\"end\"]},{\"name\":\"variables with multi-line block\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"end\"]},{\"name\":\"only use docs from first encounter\",\"code\":[\"pro myclass::mymethod, var1\",\" compile_opt idl2\",\" ;+\",\" ; Some things are really awesome\",\" ; and need a big description\",\" ;-\",\" a = 42\",\"\",\" ;+ second docs are ignored\",\" a = 42\",\"end\"]}]}","functions.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"functions.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":[\"function myfunc, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\"]}]}","function-methods.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"function-methods.spec.ts\",\"tests\":[{\"name\":\"function methods\",\"code\":[\"function myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\"]}]}","function-methods.init.spec.ts":"{\"suiteName\":\"Add function for\",\"fileName\":\"function-methods.init.spec.ts\",\"tests\":[{\"name\":\"class init methods\",\"code\":[\"function MyClass::init, a, b, c, kw2 = kw2\",\" compile_opt idl2\",\"\",\" ; set data type correctly for local variable\",\" z = MyClass()\",\"\",\" return, 1\",\"end\"]}]}","inherit-args-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-args-docs.spec.ts\",\"tests\":[{\"name\":\"arguments\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Args:\",\"; var1: in, required, any\",\"; My favorite thing\",\";\",\";-\",\"pro mypro, var1\",\" compile_opt idl2\",\"end\",\"\"]}]}","inherit-kw-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-kw-docs.spec.ts\",\"tests\":[{\"name\":\"keywords\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, KW1=kw1\",\" compile_opt idl2\",\"end\",\"\"]}]}","inherit-private-docs.spec.ts":"{\"suiteName\":\"Correctly inherits docs for\",\"fileName\":\"inherit-private-docs.spec.ts\",\"tests\":[{\"name\":\"private\",\"code\":[\"\",\";+\",\"; My procedure\",\";\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean, private\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, KW1=kw1\",\" compile_opt idl2\",\"end\",\"\"]}]}","lambda.no-vars.spec.ts":"{\"suiteName\":\"With lambda functions\",\"fileName\":\"lambda.no-vars.spec.ts\",\"tests\":[{\"name\":\"do not extract variables\",\"code\":[\"; main level\",\"compile_opt idl2\",\"!null = lambda(n:n le 3 || min(n mod [2:fix(sqrt(n))]))\",\"end\"]}]}","main.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"main.spec.ts\",\"tests\":[{\"name\":\"main level\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"mypro, a, b, c, d\",\"end\"]}]}","notebook-parse.compile-opt.1.spec.ts":"{\"suiteName\":\"Verify notebook parsing\",\"fileName\":\"notebook-parse.compile-opt.1.spec.ts\",\"tests\":[{\"name\":\"adds compile-opt idl2 for main and gets right default type\",\"code\":[\"a = 42\",\"\",\"end\"],\"config\":{\"isNotebook\":true}}]}","notebook-parse.compile-opt.exceptions.spec.ts":"{\"suiteName\":\"Verify notebook parsing\",\"fileName\":\"notebook-parse.compile-opt.exceptions.spec.ts\",\"tests\":[{\"name\":\"ignores compile opt idl2 for procedures\",\"code\":[\"pro myPro\",\" print, 'Hello world'\",\"end\"],\"config\":{\"isNotebook\":true}},{\"name\":\"ignores compile opt idl2 for functions\",\"code\":[\"function myPro\",\" print, 'Hello world'\",\" return 42\",\"end\"],\"config\":{\"isNotebook\":true}}]}","only-from-code.spec.ts":"{\"suiteName\":\"Only use code for docs\",\"fileName\":\"only-from-code.spec.ts\",\"tests\":[{\"name\":\"and exclude incorrectly documented parameters\",\"code\":[\";+\",\"; Header\",\";\",\"; :Args:\",\"; a: in, required, int\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; b: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; :Keywords:\",\"; kw1: in, required, int\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; kw2: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\";\",\"; :Author: Meeeeeeeeeeeeeeeeeee\",\"\",\"\",\"\",\"\",\"pro myPro, a, kw1 = kw1\",\"\",\"\",\" print, 'Hello world'\",\"\",\"\",\"end\"]}]}","parse-fast.ignore-docs.1.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.1.spec.ts\",\"tests\":[{\"name\":\"for structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: Long\",\"; Placeholder docs for argument or keyword\",\"; prop2: ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"full\":false}}]}","parse-fast.ignore-docs.2.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.2.spec.ts\",\"tests\":[{\"name\":\"for procedures\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5, KW1 = kw1\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"full\":false}}]}","parse-fast.ignore-docs.3.spec.ts":"{\"suiteName\":\"Verify fast parsing ignores docs\",\"fileName\":\"parse-fast.ignore-docs.3.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, arg1, arg2, arg3, arg4, arg5, KW1 = kw1\",\" compile_opt idl3\",\" return, 42\",\"end\"],\"config\":{\"full\":false}}]}","populate-structures.1.spec.ts":"{\"suiteName\":\"Correctly populate structures\",\"fileName\":\"populate-structures.1.spec.ts\",\"tests\":[{\"name\":\"in class definitions\",\"code\":[\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"end\"]},{\"name\":\"with no properties\",\"code\":[\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct}\",\"end\"]}]}","populate-structures.2.spec.ts":"{\"suiteName\":\"Use docs for property types\",\"fileName\":\"populate-structures.2.spec.ts\",\"tests\":[{\"name\":\"in structures\",\"code\":[\";+\",\"; :MyStruct:\",\"; prop: Long\",\"; Placeholder docs for argument or keyword\",\"; prop2: ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro mystruct__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"]}]}","populate-structures.3.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.3.spec.ts\",\"tests\":[{\"name\":\"normal procedures\",\"code\":[\"pro define_these_structures\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"end\"]}]}","populate-structures.4.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.4.spec.ts\",\"tests\":[{\"name\":\"normal functions\",\"code\":[\"function define_these_structures\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"return, 1\",\"end\"]}]}","populate-structures.5.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.5.spec.ts\",\"tests\":[{\"name\":\"procedure methods\",\"code\":[\"pro define_these_structures::method\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"end\"]}]}","populate-structures.6.spec.ts":"{\"suiteName\":\"Find them in\",\"fileName\":\"populate-structures.6.spec.ts\",\"tests\":[{\"name\":\"function methods\",\"code\":[\"function define_these_structures::method\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"return, 1\",\"end\"]}]}","populate-structures.7.spec.ts":"{\"suiteName\":\"Ignore them in\",\"fileName\":\"populate-structures.7.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"if ~_exists then defsysv, '!notebook_magic', {IDLNotebookMagic}\",\"\",\"end\"]},{\"name\":\"as nested properties\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"!null = {OtherStruct, prop:{SecondOtherStruct}}\",\"\",\"end\"]}]}","populate-structures.8.spec.ts":"{\"suiteName\":\"Take first instance we encounter\",\"fileName\":\"populate-structures.8.spec.ts\",\"tests\":[{\"name\":\"with non-full parse\",\"code\":[\"pro my_def__define\",\"compile_opt idl2\",\"fhdr = {WAVFILEHEADER, $\",\" friff: bytarr(4), $ ; A four char string\",\" fsize: 0ul, $\",\" fwave: bytarr(4) $ ; A four char string\",\"}\",\"\",\"if ~_exists then defsysv, '!notebook_magic', {WAVFILEHEADER}\",\"\",\"end\"],\"config\":{\"full\":false}}]}","procedures.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"procedures.spec.ts\",\"tests\":[{\"name\":\"procedures\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","procedure-methods.spec.ts":"{\"suiteName\":\"Correctly extract variables from\",\"fileName\":\"procedure-methods.spec.ts\",\"tests\":[{\"name\":\"procedure methods\",\"code\":[\"pro myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\" KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]}]}","tasks.from-docs.spec.ts":"{\"suiteName\":\"Verify type parsing for\",\"fileName\":\"tasks.from-docs.spec.ts\",\"tests\":[{\"name\":\"ENVI and IDL Tasks in docs\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\"end\"]}]}","tasks.guessing-from-code.spec.ts":"{\"suiteName\":\"Verify behaviors for task types\",\"fileName\":\"tasks.guessing-from-code.spec.ts\",\"tests\":[{\"name\":\"where we determine types from code\",\"code\":[\"compile_opt idl2\",\"\",\"mosaic1 = ENVITask('BuildMosaicRaster')\",\"mosaic2 = ENVITask(routine_dir() + 'buildmosaicraster.task')\",\"\",\"uri = 'buildmosaicraster.task'\",\"mosaic3 = ENVITask(uri)\",\"\",\"envitaskany1 = ENVITask(uri + uri)\",\"\",\"idlmosaic1 = IDLTask('BuildMosaicRaster')\",\"idlmosaic2 = IDLTask(routine_dir() + 'buildmosaicraster.task')\",\"\",\"idlmosaic3 = IDLTask(uri)\",\"\",\"idltaskany1 = IDLTask(uri + uri)\",\"end\"]}]}","types.from-args.spec.ts":"{\"suiteName\":\"Types from output arguments\",\"fileName\":\"types.from-args.spec.ts\",\"tests\":[{\"name\":\"and exclude incorrectly documented parameters\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\"; b: out, required, Long\",\"; Placeholder docs for argument, keyword, or property\",\"; c: out, required, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro auto_doc_example, a, b, c\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"auto_doc_example, arg1, arg2, arg3\",\"end\"]}]}","types.from-assignment-weird.spec.ts":"{\"suiteName\":\"Types from assignment\",\"fileName\":\"types.from-assignment-weird.spec.ts\",\"tests\":[{\"name\":\"where we define vars in-line\",\"code\":[\"; main level\",\"compile_opt idl2\",\"\",\"; any because using var before defined\",\"c = d + (d = 5)\",\"\",\"; number\",\"f = (g = 6) + g\",\"end\"]}]}","types.arrays.brackets.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.arrays.brackets.spec.ts\",\"tests\":[{\"name\":\"array creation using brackets\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\"\",\" ; long\",\" a = [1, 2, 3, 4]\",\"\",\" ; float\",\" b = [1, 2, 3, 4.]\",\"\",\" ; double\",\" c = [1, 2, 3, 4d]\",\"\",\" ; complex double\",\" d = [1, 2, 3, 4di]\",\"\",\" ; invalid\",\" e = [1, 2, 3, plot()]\",\"\",\" ; ignore if element has Null\",\" f = [1, 2, 3, !null, 4, 5]\",\"\",\" ; no nested arrays, just promoted\",\" g = [1, 2, 3, [1, 2, 3, 4d], 4, 5]\",\"\",\" ; array of lists\",\" h = [list(), list()]\",\"\",\" ; array of ENVIRasters\",\" i = [ENVIRaster(), ENVIRaster()]\",\"\",\" ; array of any\",\" j = [ENVIRaster(), plot()]\",\"end\"]}]}","types.arrays.edge-cases.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.arrays.edge-cases.spec.ts\",\"tests\":[{\"name\":\"array creation using edge cases that failed\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\"\",\" ; array of number\",\" a = [where(x)]\",\"end\"]},{\"name\":\"scalars or arrays can be used interchangeably\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\" e = envi()\",\" r = e.openRaster() ; scalar or array ENVIRaster\",\" ; array of ENVIRaster\",\" arr = [r]\",\"end\"]},{\"name\":\"allow all objects as long as no structures or all structures\",\"code\":[\"pro array_creation\",\" compile_opt idl2\",\" arr1 = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster()]\",\" arr2 = [{}, {}]\",\"\",\" bad = [ENVIRaster(), ENVIMetaspectralRaster(), ENVISubsetRaster(), {}, 1]\",\"end\"]}]}","types.array-promotion.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.array-promotion.spec.ts\",\"tests\":[{\"name\":\"array promotion\",\"code\":[\";+\",\"; :Returns: ArrayPromotion\",\";\",\"; :Arguments:\",\"; a: bidirectional, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function test, a\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; scalars\",\"scalar1 = test(1)\",\"\",\"; arrays\",\"array1 = test([1])\",\"array2 = test(bytarr(5))\",\"\",\"; either scalar or array\",\"c = made_up()\",\"either = test(c)\",\"\",\"end\"]}]}","types.from-foreach.spec.ts":"{\"suiteName\":\"Types from foreach loop\",\"fileName\":\"types.from-foreach.spec.ts\",\"tests\":[{\"name\":\"with type args 1\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with type args 2\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with non-index types returning original 1\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, String\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]},{\"name\":\"with non-index types returning original 2\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]}]}","types.from-foreach.regression1.spec.ts":"{\"suiteName\":\"Types from foreach loop regression tests\",\"fileName\":\"types.from-foreach.regression1.spec.ts\",\"tests\":[{\"name\":\"with bad syntax\",\"code\":[\"pro \",\";+\",\"; :Arguments:\",\"; item: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\" ; item is bad\",\" foreach val, item, key do print, val\",\"end\"]}]}","types.from-functions.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-functions.spec.ts\",\"tests\":[{\"name\":\"functions\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVISubsetRaster()\",\"\",\" b = ENVITask('subsetraster')\",\"\",\" c = obj_new('envitask')\",\"\",\" d = keyword_set(5)\",\"\",\" e = dictionary()\",\"\",\" f = ENVITensorFlowModel()\",\"\",\" g = IDLTask('MyTask')\",\"\",\"end\"]},{\"name\":\"functions with other strings\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVITask(\\\"subsetraster\\\")\",\"\",\" b = ENVITask(`subsetraster`)\",\"\",\" c = obj_new(\\\"envitask\\\")\",\"\",\" d = obj_new(`envitask`)\",\"\",\" e = IDLTask(\\\"MyTask\\\")\",\"\",\" f = IDLTask(`MyTask`)\",\"\",\"end\"]}]}","types.from-numbers.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers.spec.ts\",\"tests\":[{\"name\":\"numbers\",\"code\":[\"pro pro4\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0b\",\"byte2 = 0ub\",\"\",\"; integer\",\"int1 = 0s\",\"\",\"; compile option\",\"compOptLong = 0\",\"\",\"; uint\",\"uint1 = 0u\",\"uint2 = 0us\",\"\",\"; long\",\"long1 = 0l\",\"\",\"; ulong\",\"ulong1 = 0ul\",\"\",\"; long64\",\"long641 = 0ll\",\"\",\"; ulong64\",\"ulong641 = 0ull\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"\",\"; double\",\"double0 = 1d\",\"double1 = 1.d\",\"double2 = .1d\",\"double3 = 1.1d\",\"double4 = 10d\",\"double5 = 10d5\",\"double6 = 10.d-3\",\"double7 = .1d+12\",\"double8 = 2.3d12\",\"\",\"; binary\",\"binary1 = '10101'b\",\"binary2 = \\\"10101\\\"b\",\"\",\"; hex\",\"hex1 = '10101'x\",\"hex2 = '7FFF'XS\",\"hex3 = '8FFF'XS\",\"hex4 = \\\"10101\\\"x\",\"hex5 = 0x\",\"hex6 = 0x7FFF\",\"\",\"; octal\",\"octal1 = \\\"36\",\"octal2 = \\\"36b\",\"octal3 = \\\"345ull\",\"octal4 = '10101'o\",\"octal5 = \\\"10101\\\"o\",\"octal6 = 0o\",\"octal7 = 0o7FFF\",\"end\"]},{\"name\":\"numbers with no compile opt\",\"code\":[\"pro pro1\",\"compile_opt\",\"; compile option\",\"compOptInt = 0\",\"end\"]},{\"name\":\"numbers with float64 compile opt\",\"code\":[\"pro pro2\",\"compile_opt float64\",\"; compile option\",\"compOptDouble = 0\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"end\"]},{\"name\":\"numbers with idl3 compile opt\",\"code\":[\"pro pro3\",\"compile_opt idl3\",\"; compile option\",\"compOptDouble = 0\",\"\",\"; float\",\"float1 = 1.\",\"float2 = .1\",\"float3 = 1.1\",\"float4 = 10e\",\"float5 = 10e5\",\"float6 = 10.e-3\",\"float7 = .1e+12\",\"float8 = 2.3e12\",\"end\"]}]}","types.from-numbers-complex1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers-complex1.spec.ts\",\"tests\":[{\"name\":\"complex numbers using \\\"i\\\"\",\"code\":[\"pro pro5\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0bi\",\"byte2 = 0ubi\",\"\",\"; integer\",\"int1 = 0si\",\"\",\"; compile option\",\"compOptLong = 0i\",\"\",\"; uint\",\"uint1 = 0ui\",\"uint2 = 0usi\",\"\",\"; long\",\"long1 = 0li\",\"\",\"; ulong\",\"ulong1 = 0uli\",\"\",\"; long64\",\"long641 = 0lli\",\"\",\"; ulong64\",\"ulong641 = 0ulli\",\"\",\"; float\",\"float1 = 1.i\",\"float2 = .1i\",\"float3 = 1.1i\",\"float4 = 10ei\",\"float5 = 10e5i\",\"float6 = 10.e-3i\",\"float7 = .1e+12i\",\"float8 = 2.3e12i\",\"\",\"; double\",\"double0 = 1di\",\"double1 = 1.di\",\"double2 = .1di\",\"double3 = 1.1di\",\"double4 = 10di\",\"double5 = 10d5i\",\"double6 = 10.d-3i\",\"double7 = .1d+12i\",\"double8 = 2.3d12i\",\"end\"]}]}","types.from-numbers-complex2.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-numbers-complex2.spec.ts\",\"tests\":[{\"name\":\"complex numbers using \\\"j\\\"\",\"code\":[\"pro pro6\",\"compile_opt idl2\",\"\",\"; byte\",\"byte1 = 0bj\",\"byte2 = 0ubj\",\"\",\"; jnteger\",\"jnt1 = 0sj\",\"\",\"; compjle optjon\",\"compOptLong = 0j\",\"\",\"; ujnt\",\"ujnt1 = 0uj\",\"ujnt2 = 0usj\",\"\",\"; long\",\"long1 = 0lj\",\"\",\"; ulong\",\"ulong1 = 0ulj\",\"\",\"; long64\",\"long641 = 0llj\",\"\",\"; ulong64\",\"ulong641 = 0ullj\",\"\",\"; float\",\"float1 = 1.j\",\"float2 = .1j\",\"float3 = 1.1j\",\"float4 = 10ej\",\"float5 = 10e5j\",\"float6 = 10.e-3j\",\"float7 = .1e+12j\",\"float8 = 2.3e12j\",\"\",\"; double\",\"double0 = 1dj\",\"double1 = 1.dj\",\"double2 = .1dj\",\"double3 = 1.1dj\",\"double4 = 10dj\",\"double5 = 10d5j\",\"double6 = 10.d-3j\",\"double7 = .1d+12j\",\"double8 = 2.3d12j\",\"end\"]}]}","types.from-properties.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-properties.spec.ts\",\"tests\":[{\"name\":\"properties\",\"code\":[\";+\",\"; :Arguments:\",\"; a: in, required, ENVIRaster\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4, a\",\" compile_opt idl2\",\"\",\" ; properties\",\" p1 = a.metadata\",\" p2 = p1.count\",\" p3 = (a.metadata)\",\" p4 = a.metadata.count\",\"end\"]}]}","types.from-properties2.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-properties2.spec.ts\",\"tests\":[{\"name\":\"properties of anonymous structures\",\"code\":[\"pro pro4\",\" compile_opt idl2\",\" a = {a: 'string', $\",\" b: `string`}\",\"\",\" ; properties\",\" p1 = a.a\",\" p2 = p1.length\",\" p3 = (a.b)\",\" p4 = a.b\",\"end\"]}]}","types.from-type-of-arg.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-type-of-arg.spec.ts\",\"tests\":[{\"name\":\"type-of-arg case without args (default to first)\",\"code\":[\";+\",\"; :Returns: TypeOfArg\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case specifying arg\",\"code\":[\";+\",\"; :Returns: TypeOfArg<0>\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case invalid arg uses any\",\"code\":[\";+\",\"; :Returns: TypeOfArg<2>\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]},{\"name\":\"type-of-arg case non-number index\",\"code\":[\";+\",\"; :Returns: TypeOfArg\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\"; main level\",\"compile_opt idl2\",\"\",\"string = myfunc('string')\",\"any = myfunc()\",\"float = myfunc(1.0)\",\"array = myfunc([1, 2, 3])\",\"end\"]}]}","types.from-type-args.edge-cases1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.from-type-args.edge-cases1.spec.ts\",\"tests\":[{\"name\":\"type without type args\",\"code\":[\";+\",\"; :Arguments:\",\"; item: in, required, List<>\",\"; Placeholder docs for argument, keyword, or property\",\";-\",\"pro foreach, item\",\" compile_opt idl2\",\"end\"]}]}","types.indexing.arrays.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.arrays.spec.ts\",\"tests\":[{\"name\":\"indexing arrays\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro arrays, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.dictionaries.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.dictionaries.spec.ts\",\"tests\":[{\"name\":\"dictionaries\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Dictionary\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro dictionaries, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.hashes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.hashes.spec.ts\",\"tests\":[{\"name\":\"hashes\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, Hash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro34, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.lists.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.lists.spec.ts\",\"tests\":[{\"name\":\"lists\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, List\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro lists, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.ordered-hashes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.ordered-hashes.spec.ts\",\"tests\":[{\"name\":\"ordered hashes\",\"code\":[\";+\",\"; :Returns:\",\"; Number\",\";\",\";-\",\"function myfunc\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; Array\",\";\",\";-\",\"function myfunc2\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Arguments:\",\"; arg1: in, required, OrderedHash\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, any\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro ordered_hashes, arg1, arg2, arg3, arg4, arg5, arg6\",\" compile_opt idl3\",\"\",\" ; type args\",\" c = arg1[0]\",\"\",\" ; return array of type args\",\" d = arg1[arg2]\",\"\",\" ; return array\",\" e = arg1[*]\",\"\",\" ; return array\",\" f = arg1[0, 1, *]\",\"\",\" ; return type args\",\" g = arg1[myfunc()]\",\"\",\" ; return array\",\" h = arg1[myfunc2()]\",\"\",\" ; type args\",\" i = arg1[0, 1, 2]\",\"\",\" ; return array\",\" j = arg1[0, 1, myfunc2()]\",\"\",\" ; return array\",\" k = arg1[0 : -1 : 1]\",\"\",\" ; return array\",\" l = arg1[0, 1, *]\",\"\",\" ; return type args\",\" m = arg1[-1]\",\"\",\" ; any\",\" n = arg3[0]\",\"\",\" ; array of any\",\" o = arg3[myfunc2()]\",\"\",\" ; return array\",\" p = arg1[0, myfunc2(), 1]\",\"\",\" ; return array\",\" q = arg1[[1, 2, 3]]\",\"\",\" ; return type args\",\" r = arg1[1 + 2]\",\"\",\" ; return array\",\" s = arg1[1 + myfunc2()]\",\"\",\" ; return any\",\" t = arg1[plot()]\",\"\",\" ; return any\",\" u = arg1[1j]\",\"\",\" ; return any\",\" v = arg1[1i]\",\"\",\" ; return any\",\" w = arg1[1di]\",\"\",\" ; return any\",\" x = arg1[1dj]\",\"\",\" ; merge type args\",\" y = arg1 + arg3\",\"\",\" ; merge type args\",\" z = arg1 + arg4 + 1l\",\"\",\" ; merge type args\",\" a2 = arg1 + arg4 + 1\",\"\",\" ; merge type args\",\" b2 = arg1 + arg4 + arg5\",\"\",\" ; any\",\" c2 = arg1[arg6]\",\"\",\" ; any\",\" d2 = arg1 + arg4 + arg6\",\"end\"]}]}","types.indexing.properties.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.properties.spec.ts\",\"tests\":[{\"name\":\"property indexing\",\"code\":[\"pro mypro1\",\" compile_opt idl2\",\" ; number or array of numbers\",\" index = where('5' eq fn)\",\" ; any\",\" x = (!null).(1)[index]\",\"end\",\"\"]}]}","types.indexing.edge-cases.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.indexing.edge-cases.spec.ts\",\"tests\":[{\"name\":\"indexing compound types\",\"code\":[\"compile_opt idl2\",\"; should be number\",\"rb_match = (where(5 eq [1, 2, 3, 4, 5]))[0]\",\"end\",\"\"]},{\"name\":\"scalar with array\",\"code\":[\"compile_opt idl2\",\"polyColors = 5l\",\"array1 = polyColors[idx : nMax]\",\"array2 = polyColors[[5 : 15: 1]]\",\"end\",\"\"]}]}","types.keywords.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.keywords.spec.ts\",\"tests\":[{\"name\":\"output or bidirectional keywords\",\"code\":[\";+\",\"; :Description:\",\"; Constructor\",\";\",\"; :Returns:\",\"; myclass\",\";\",\";-\",\"function myclass::Init\",\" compile_opt idl2\",\"\",\" return, 1\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myclass::method, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, ENVIRaster\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro myclass::method, kw = kw\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; Class definition procedure\",\";\",\";-\",\"pro myclass__define\",\" compile_opt idl2\",\"\",\" struct = {myclass}\",\"end\",\"\",\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Keywords:\",\"; kw: out, optional, Long\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function myfunc, kw = kw\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\";+\",\"; :Keywords:\",\"; kw: out, optional, Byte\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro mypro, kw = kw\",\" compile_opt idl2\",\"\",\"end\",\"\",\"; main level program\",\"compile_opt idl2\",\"\",\"; procedures\",\"mypro, kw = a\",\"\",\"; functions\",\"!null = myfunc(kw = b)\",\"\",\"; make class for methods\",\"var = myclass()\",\"\",\"; procedure methods\",\"var.method, kw = c\",\"\",\"; function methods\",\"!null = var.method(kw = d)\",\"end\"]}]}","types.operations.structures.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.structures.spec.ts\",\"tests\":[{\"name\":\"structure operations\",\"code\":[\"pro struct_checks\",\"compile_opt idl2\",\"\",\"str = {a: 42}\",\"\",\"a = 1 + str\",\"\",\"b = str + {a: 42}\",\"\",\"c = str + list()\",\"\",\"d = str + hash()\",\"\",\"e = str + orderedhash()\",\"\",\"f = str + dictionary()\",\"end\"]}]}","types.operations.list.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.list.spec.ts\",\"tests\":[{\"name\":\"list operations\",\"code\":[\"pro list_checks\",\"compile_opt idl2\",\"\",\"a = 1 + list()\",\"\",\"b = list() + list()\",\"\",\"c = list() + hash()\",\"\",\"d = list() + orderedhash()\",\"\",\"e = list() + dictionary()\",\"end\"]}]}","types.operations.hash.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.hash.spec.ts\",\"tests\":[{\"name\":\"hash operations\",\"code\":[\"pro hash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + hash()\",\"\",\"b = hash() + list()\",\"\",\"c = hash() + hash()\",\"\",\"d = hash() + orderedhash()\",\"\",\"e = hash() + dictionary()\",\"end\"]}]}","types.operations.ordered-hash.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.ordered-hash.spec.ts\",\"tests\":[{\"name\":\"ordered hash operations\",\"code\":[\"pro orderedhash_checks\",\"compile_opt idl2\",\"\",\"a = 1 + orderedhash()\",\"\",\"b = orderedhash() + list()\",\"\",\"c = orderedhash() + hash()\",\"\",\"d = orderedhash() + orderedhash()\",\"\",\"e = orderedhash() + dictionary()\",\"end\"]}]}","types.operations.dictionary.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.operations.dictionary.spec.ts\",\"tests\":[{\"name\":\"dictionary operations\",\"code\":[\"pro dictionary_checks\",\"compile_opt idl2\",\"\",\"a = 1 + dictionary()\",\"\",\"b = dictionary() + list()\",\"\",\"c = dictionary() + hash()\",\"\",\"d = dictionary() + orderedhash()\",\"\",\"e = dictionary() + dictionary()\",\"end\"]}]}","types.parsing-checks.1.spec.ts":"{\"suiteName\":\"Cases to make sure we always parse our types correctly\",\"fileName\":\"types.parsing-checks.1.spec.ts\",\"tests\":[{\"name\":\"for normal cases\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Pointer>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Number | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Hash | List>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg7: in, required, Hash | List | List>\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro type_parsing_test, arg1, arg2, arg3, arg4, arg5, arg6, arg7\",\" compile_opt idl3\",\"\",\"end\"]}]}","types.pointer-de-ref.1.spec.ts":"{\"suiteName\":\"Get types correctly from pointer de-reference\",\"fileName\":\"types.pointer-de-ref.1.spec.ts\",\"tests\":[{\"name\":\"for normal cases\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array>\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, Pointer | String\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg6: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\"; arg7: in, required, Pointer | Pointer\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pointers, arg1, arg2, arg3, arg4, arg5, arg6, arg7\",\" compile_opt idl3\",\"\",\" ; number\",\" a = *arg1\",\"\",\" ; enviraster\",\" b = *arg3[0]\",\"\",\" ; and, unable to index\",\" c = arg1[0]\",\"\",\" ; any, unable to de-reference\",\" d = *5\",\"\",\" ; any, ambiguous de-reference\",\" e = *arg4\",\"\",\" ; any\",\" f = *arg5\",\"\",\" ; union of type args\",\" g = *arg6\",\"\",\" ; union of type args, dont show arg7 more string more than once\",\" g = *arg7\",\"end\"]}]}","types.promotion1.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.promotion1.spec.ts\",\"tests\":[{\"name\":\"type promotion\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\"; :Arguments:\",\"; a: in, required, Number\",\"; Placeholder docs for argument, keyword, or property\",\"; b: in, required, ComplexNumber\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"function most_cases, a, b\",\" compile_opt idl2\",\"\",\" byte = 's' + 1b\",\"\",\" int = 's' + 1s\",\"\",\" uint = 's' + 1us\",\"\",\" long = 's' + 1l\",\"\",\" ulong = 's' + 1ul\",\"\",\" long64 = 's' + 1ll\",\"\",\" ulong64 = 's' + 1ull\",\"\",\" float1 = 's' + 1.\",\" float2 = 's' + 1e\",\"\",\" double = 's' + 1d\",\"\",\" biginteger = 's' + BigInteger(5)\",\"\",\" number = 's' + a\",\"\",\" complexfloat = 's' + 1.i\",\"\",\" complexdouble = 's' + 1di\",\" complexdouble = 's' + 1dj\",\"\",\" complexnumber1 = 's' + a + 1di + 1dj\",\" complexnumber2 = a + b\",\"\",\" return, 1\",\"end\"]}]}","types.strings.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.strings.spec.ts\",\"tests\":[{\"name\":\"strings\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = 'single quote'\",\"\",\" b = \\\"double quote\\\"\",\"\",\" c = `literal string`\",\"\",\"end\"]}]}","types.ternary.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.ternary.spec.ts\",\"tests\":[{\"name\":\"ternary\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" ; long or envi\",\" a = !true ? 5 + 15 : envi()\",\"\",\" ; long or string\",\" b = !true ? 5 + 15 : 'string'\",\"\",\" ; string\",\" c = !true ? 'string' : 'false'\",\"\",\" ; number\",\" d = !true ? 5 : 6\",\"\",\" ; any\",\" e = !true ? 5 \",\"\",\" ; any\",\" f = !true ? 5 :\",\"\",\"end\"]}]}","types.variables.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.variables.spec.ts\",\"tests\":[{\"name\":\"variables\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = ENVISubsetRaster()\",\"\",\" b = a\",\"end\"]}]}","types.static-classes.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.static-classes.spec.ts\",\"tests\":[{\"name\":\"named static classes methods/properties\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = IDL_Number.ndim\",\" b = envi.openRaster()\",\" any1 = image ; nothing\",\"end\"]}]}","types.structure-names.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.structure-names.spec.ts\",\"tests\":[{\"name\":\"named structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = {ENVIRaster}\",\"\",\" b = {!map}\",\"end\"]}]}","types.structure-anonymous.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.structure-anonymous.spec.ts\",\"tests\":[{\"name\":\"anonymous structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = {a: 'string', $\",\" b: `string`}\",\"\",\"end\"]}]}","types.system-variables.spec.ts":"{\"suiteName\":\"Types from\",\"fileName\":\"types.system-variables.spec.ts\",\"tests\":[{\"name\":\"the !null system variable\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = !null\",\"end\"]},{\"name\":\"system variables that are structures\",\"code\":[\"pro myPro\",\" compile_opt idl2\",\"\",\" a = !x\",\"end\"]}]}"},"auto-outline-tests":{"ex-1.spec.ts":"{\"suiteName\":\"Extracts outline\",\"fileName\":\"ex-1.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/awesomerasterintersection.pro\"}]}","ex-2.spec.ts":"{\"suiteName\":\"Extracts outline with main\",\"fileName\":\"ex-2.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens and handle undefined\",\"file\":\"idl/test/hover-help/myfunc.pro\"}]}","ex-3.spec.ts":"{\"suiteName\":\"Extracts outline\",\"fileName\":\"ex-3.spec.ts\",\"tests\":[{\"name\":\"extract correct tokens with multiple parent routines\",\"file\":\"idl/test/hover-help/mypro.pro\"}]}"},"auto-semantic-token-tests":{"basic.spec.ts":"{\"suiteName\":\"Extracts semantic tokens\",\"fileName\":\"basic.spec.ts\",\"tests\":[{\"name\":\"for basic case\",\"code\":[\"compile_opt idl2\",\"a = envi.api_version\",\"!null = envi.openRaster('somefile.dat')\",\"end\"]}]}","complex.spec.ts":"{\"suiteName\":\"Extracts semantic tokens\",\"fileName\":\"complex.spec.ts\",\"tests\":[{\"name\":\"for complex case with out-of order and same ref\",\"code\":[\"compile_opt idl2\",\"IDLgrVolume.AddToNotebookMap\",\"!null = ENVI.displayinnotebookmap + ENVI.api_version\",\"\",\"IDLgrVolume.AddToNotebookMap\",\"ENVI.displayInNotebookMap\",\"end\"]}]}"},"auto-task-parsing-tests":{"envi1.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi1.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/BuildMosaicRaster.task\"}]}","envi2.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi2.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/ExportRasterToCADRG.task\"}]}","envi3.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi3.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/PointCloudFeatureExtraction.task\"}]}","envi4.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"envi4.spec.ts\",\"tests\":[{\"name\":\"envi\",\"file\":\"idl/test/task-parsing/SetRasterMetadata.task\"}]}","idl1.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl1.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/Download_S3_URL.task\"}]}","idl2.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl2.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/QueryAllTasks.task\"}]}","idl3.spec.ts":"{\"suiteName\":\"Correctly parse task file\",\"fileName\":\"idl3.spec.ts\",\"tests\":[{\"name\":\"idl\",\"file\":\"idl/test/task-parsing/QueryTask.task\"}]}"},"auto-assembler-tests":{"auto-doc.args.spec.ts":"{\"suiteName\":\"Verify arg formatting\",\"fileName\":\"auto-doc.args.spec.ts\",\"tests\":[{\"name\":\"matches arg definitions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, Array\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, ARG3\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.basic.spec.ts":"{\"suiteName\":\"Verify doc formatting\",\"fileName\":\"auto-doc.basic.spec.ts\",\"tests\":[{\"name\":\"close and auto populate existing docs block\",\"code\":[\";+\",\";\",\"function myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"capture default content and re-work\",\"code\":[\";+\",\"; Header\",\";-\",\"pro myPro\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for procedures automatically\",\"code\":[\"pro myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for functions automatically\",\"code\":[\"function myPro2, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add docs for multiple routines at once\",\"code\":[\"pro myPro, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\"end\",\"\",\"function myPro2, a, c, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"\",\" return, 42\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"handle, and format correctly, multi-line headers\",\"code\":[\";+\",\"; :Something fancy:\",\"; Really cool information \",\"; sdf\",\";-\",\"pro test_things\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" uses proper external name for keyword in auto-docs\",\"code\":[\"pro test_things2, a, b, kw2 = kw222\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" for only arguments\",\"code\":[\"pro test_things2, a, b\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\" for only keywords\",\"code\":[\"pro test_things2, kw222=kw2, kw3 = kw3\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.below.spec.ts":"{\"suiteName\":\"Verify auto-doc when below\",\"fileName\":\"auto-doc.below.spec.ts\",\"tests\":[{\"name\":\"does not add docs above\",\"code\":[\"pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";-\",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"updates comment blocks right\",\"code\":[\"pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third\",\";+\",\"; :Keywords:\",\"; input_raster: in, optional, ENVIRaster\",\"; Thing 1\",\"; output_raster_uri: in, optional, String\",\"; Thing 2\",\"; third: bidirectional, optional, any\",\"; Thing 3\",\";\",\";-\",\"compile_opt idl2\",\"\",\"; get the current session of ENVI\",\"e = envi(/current)\",\"if (e eq !null) then begin\",\" message, 'ENVI has not started yet, required!'\",\"endif\",\"idltasktest, input_raster = 5\",\"end\",\"\",\"; main level program\",\"compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.example-code.spec.ts":"{\"suiteName\":\"Verify formatting\",\"fileName\":\"auto-doc.example-code.spec.ts\",\"tests\":[{\"name\":\"for example blocks moves\",\"code\":[\"; TODO: something\",\"pro test_things, a, b, c\",\" compile_opt idl2\",\"end\",\"\",\";+\",\"; :Description:\",\"; My favorite procedure\",\"; \",\"; \",\"; \",\"; :Examples:\",\"; \",\"; Open an image in ENVI and display in a notebook:\",\"; \",\"; ```idl\",\"; ; Start the application\",\"; e = envi(/headless)\",\"; \",\"; ; Open an input file\",\"; file = filepath('qb_boulder_msi', subdir = ['data'], $\",\"; root_dir = e.root_dir)\",\"; raster = e.openRaster(File)\",\"; \",\"; ; display in the current notebook cell\",\"; e.displayInNotebook, raster\",\"; ```\",\";-\",\"pro test_things2\",\" compile_opt idl2\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex2.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex2.spec.ts\",\"tests\":[{\"name\":\"moves things correctly\",\"code\":[\"; TODO: something\",\"pro test_things, a, b, c\",\" compile_opt idl2\",\"end\",\"\",\";+\",\";-\",\"pro test_things2\",\" compile_opt idl2\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex3.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex3.spec.ts\",\"tests\":[{\"name\":\"moves main level correctly\",\"code\":[\"; TODO: something\",\"pro test_things\",\"end\",\"\",\"compile_opt idl2\",\"\",\"test_things\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.complex4.spec.ts":"{\"suiteName\":\"Verify complex formatting\",\"fileName\":\"auto-doc.complex4.spec.ts\",\"tests\":[{\"name\":\"moves main level correctly\",\"code\":[\";+\",\"; :Description:\",\"; Function which will initialize the bdige_it object and start all bridges. When bridges are initialized\",\"; they are done so in parallel, but whe function will not return until every bridge is idle again.\",\";\",\"; :Params:\",\"; nbridges: in, required, type=int\",\"; The number of bridges that you want to create\",\";\",\"; :Keywords:\",\"; INIT : in, optional, type=strarr\",\"; Optional argument which allows you to pass in a string array of extra commands\",\"; to have each IDL_IDLBridge object execute upon creation.\",\"; MSG : in, optional, type=string\",\"; Optional argument to show the message prefix when a bridge process has completed for the TIME\",\"; keyword in bridge_it::run and bridge_it::run().\",\"; LOGDIR : in, optional, type=string\",\"; Specify the directory that the log file will be written to. The log file is just a text file with\",\"; all of the IDL Console output from each child process.\",\"; NREFRESH : in, optional, type=long\",\"; Specify the number of bridge processes to execute before closing and re-starting the\",\"; child process. Necessary for some ENVI routines so that we don't have memory fragmentation\",\"; regarding opening lots of small rasters.\",\"; PREFIX : in, optional, type=string, default='_KW_'\",\"; This optional keyword specifies the prefix which is used to differentiate between arguments and\",\"; keywords when it comes time to parse the arguments and keyword that will be passed into a routine.\",\";\",\"; :Author: Zachary Norman - GitHub: [znorman-harris](https://github.com/znorman-harris)\",\";\",\";-\",\"function bridge_it::Init, nbridges, INIT = init, MSG = msg, LOGDIR = logdir, NREFRESH = nrefresh, PREFIX = prefix\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" return, 1\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.non-idl-display-names.spec.ts":"{\"suiteName\":\"Verify type formatting uses display names\",\"fileName\":\"auto-doc.non-idl-display-names.spec.ts\",\"tests\":[{\"name\":\"matches arg definitions\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, enviraster\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idl_variable\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, plot\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.only.spec.ts":"{\"suiteName\":\"Only use AutoDoc\",\"fileName\":\"auto-doc.only.spec.ts\",\"tests\":[{\"name\":\"and leave everything else the same\",\"code\":[\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\";distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\"y = sqrt(x + i^2.) ;Euclidian distance\",\"a[0,i] = y ;Insert the row\",\"if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"],\"config\":{\"autoDoc\":true,\"styleAndFormat\":false}}]}","auto-doc.only2.spec.ts":"{\"suiteName\":\"Only use AutoDoc\",\"fileName\":\"auto-doc.only2.spec.ts\",\"tests\":[{\"name\":\"and dont fix problems\",\"code\":[\"pro test, a, b, c\",\"end\",\"\",\"test\",\"end\"],\"config\":{\"autoDoc\":true,\"styleAndFormat\":false,\"autoFix\":false}}]}","auto-doc.parameters.spec.ts":"{\"suiteName\":\"Verify parameter formatting\",\"fileName\":\"auto-doc.parameters.spec.ts\",\"tests\":[{\"name\":\"sort arguments by appearance and add bad at the end\",\"code\":[\";+\",\"; :Args:\",\"; a: in, required, int, private\",\"; Some cool statement\",\"; b: in, required, string\",\"; Some cool statement\",\"; c: in, required, int, private\",\"; Some cool statement\",\";\",\";-\",\"pro myPro, a, c\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"sort keywords alphabetically and add bad at the end\",\"code\":[\";+\",\"; :Keywords:\",\"; kw2: in, required, int\",\"; Some cool statement\",\"; kw: in, required, string\",\"; Some cool statement across\",\";\",\"; multiple lines\",\"; kw1: in, required, string\",\"; Some cool statement across\",\";\",\";-\",\"pro myPro, kw1 = kw1, kw=kw\",\" compile_opt idl2\",\" print, 'Hello world'\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.order-args.spec.ts":"{\"suiteName\":\"Verify arg ordering\",\"fileName\":\"auto-doc.order-args.spec.ts\",\"tests\":[{\"name\":\"matches the argument definition\",\"code\":[\";+\",\"; :Arguments:\",\"; a01: in, required, any\",\"; Placeholder docs for argument or keyword\",\"; a02: in, required, array\",\"; Placeholder docs for argument or keyword\",\"; a03: in, required, bigint\",\"; Placeholder docs for argument or keyword\",\"; a04: in, required, biginteger\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro my_thing, $\",\" a03, a04, a01, a02\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.task-types.spec.ts":"{\"suiteName\":\"Verify type formatting for\",\"fileName\":\"auto-doc.task-types.spec.ts\",\"tests\":[{\"name\":\"ENVI and IDL Tasks\",\"code\":[\";+\",\"; :Arguments:\",\"; arg1: in, required, envitask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg2: in, required, idltask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg3: in, required, ENVITask | ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg4: in, required, IDLTask\",\"; Placeholder docs for argument, keyword, or property\",\"; arg5: in, required, ENVITask\",\"; Placeholder docs for argument, keyword, or property\",\";\",\";-\",\"pro pro3, arg1, arg2, arg3, arg4, arg5\",\" compile_opt idl3\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.types.spec.ts":"{\"suiteName\":\"Verify type formatting\",\"fileName\":\"auto-doc.types.spec.ts\",\"tests\":[{\"name\":\"parses and gives normalized appearance for all IDL types\",\"code\":[\";+\",\"; :Arguments:\",\"; a01: in, required, any\",\"; Placeholder docs for argument or keyword\",\"; a02: in, required, array\",\"; Placeholder docs for argument or keyword\",\"; a03: in, required, bigint\",\"; Placeholder docs for argument or keyword\",\"; a04: in, required, biginteger\",\"; Placeholder docs for argument or keyword\",\"; a05: in, required, binary\",\"; Placeholder docs for argument or keyword\",\"; a06: in, required, bool\",\"; Placeholder docs for argument or keyword\",\"; a07: in, required, boolean\",\"; Placeholder docs for argument or keyword\",\"; a08: in, required, byte\",\"; Placeholder docs for argument or keyword\",\"; a09: in, required, complex\",\"; Placeholder docs for argument or keyword\",\"; a10: in, required, dcomplex\",\"; Placeholder docs for argument or keyword\",\"; a11: in, required, doublecomplex\",\"; Placeholder docs for argument or keyword\",\"; a12: in, required, dict\",\"; Placeholder docs for argument or keyword\",\"; a13: in, required, dictionary\",\"; Placeholder docs for argument or keyword\",\"; a14: in, required, float64\",\"; Placeholder docs for argument or keyword\",\"; a15: in, required, double\",\"; Placeholder docs for argument or keyword\",\"; a16: in, required, float32\",\"; Placeholder docs for argument or keyword\",\"; a17: in, required, float\",\"; Placeholder docs for argument or keyword\",\"; a18: in, required, hash\",\"; Placeholder docs for argument or keyword\",\"; a19: in, required, hex\",\"; Placeholder docs for argument or keyword\",\"; a20: in, required, int\",\"; Placeholder docs for argument or keyword\",\"; a21: in, required, integer\",\"; Placeholder docs for argument or keyword\",\"; a22: in, required, list\",\"; Placeholder docs for argument or keyword\",\"; a23: in, required, long\",\"; Placeholder docs for argument or keyword\",\"; a24: in, required, long64\",\"; Placeholder docs for argument or keyword\",\"; a25: in, required, null\",\"; Placeholder docs for argument or keyword\",\"; a26: in, required, number\",\"; Placeholder docs for argument or keyword\",\"; a27: in, required, class\",\"; Placeholder docs for argument or keyword\",\"; a28: in, required, object\",\"; Placeholder docs for argument or keyword\",\"; a29: in, required, octal\",\"; Placeholder docs for argument or keyword\",\"; a30: in, required, orderedhash\",\"; Placeholder docs for argument or keyword\",\"; a31: in, required, pointer\",\"; Placeholder docs for argument or keyword\",\"; a32: in, required, string\",\"; Placeholder docs for argument or keyword\",\"; a33: in, required, structure\",\"; Placeholder docs for argument or keyword\",\"; a34: in, required, uint\",\"; Placeholder docs for argument or keyword\",\"; a35: in, required, unsignedint\",\"; Placeholder docs for argument or keyword\",\"; a36: in, required, unsignedinteger\",\"; Placeholder docs for argument or keyword\",\"; a37: in, required, ulong\",\"; Placeholder docs for argument or keyword\",\"; a38: in, required, unsignedlong\",\"; Placeholder docs for argument or keyword\",\"; a39: in, required, ulong64\",\"; Placeholder docs for argument or keyword\",\"; a40: in, required, unsignedlong64\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro my_thing, $\",\" a01, a02, a03, a04, a05, a06, a07, a08, a09, a10, $\",\" a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, $\",\" a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, $\",\" a31, a32, a33, a34, a35, a36, a37, a38, a39, a40\",\" compile_opt idl2\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.non-idl-doc.spec.ts":"{\"suiteName\":\"Verify doc formatting\",\"fileName\":\"auto-doc.non-idl-doc.spec.ts\",\"tests\":[{\"name\":\"for non IDL Doc styled docs\",\"code\":[\";+\",\"; NAME:\",\"; DIST\",\";\",\"; PURPOSE:\",\"; Create a rectangular array in which each element is proportional\",\"; to its frequency. This array may be used for a variety\",\"; of purposes, including frequency-domain filtering and\",\"; making pretty pictures.\",\";\",\"; CATEGORY:\",\"; Signal Processing.\",\";\",\"; CALLING SEQUENCE:\",\"; Result = DIST(N [, M])\",\";\",\"; INPUTS:\",\"; N = number of columns in result.\",\"; M = number of rows in result. If omitted, N is used to return\",\"; a square array.\",\";\",\"; OUTPUTS:\",\"; Returns an (N,M) floating array in which:\",\";\",\"; R(i,j) = SQRT(F(i)^2 + G(j)^2) where:\",\"; F(i) = i IF 0 <= i <= n/2\",\"; = n-i IF i > n/2\",\"; G(i) = i IF 0 <= i <= m/2\",\"; = m-i IF i > m/2\",\";\",\"; SIDE EFFECTS:\",\"; None.\",\";\",\"; RESTRICTIONS:\",\"; None.\",\";\",\"; PROCEDURE:\",\"; Straightforward. The computation is done a row at a time.\",\";\",\"; MODIFICATION HISTORY:\",\"; Very Old.\",\"; SMR, March 27, 1991 - Added the NOZERO keyword to increase efficiency.\",\"; (Recomended by Wayne Landsman)\",\"; DMS, July, 1992. - Added M parameter to make non-square arrays.\",\"; CT, RSI, March 2000: Changed i^2 to i^2. to avoid overflow.\",\";-\",\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\" ;distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\" y = sqrt(x + i^2.) ;Euclidian distance\",\" a[0,i] = y ;Insert the row\",\" if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.format-keywords.spec.ts":"{\"suiteName\":\"Apply keyword formatting\",\"fileName\":\"auto-doc.format-keywords.spec.ts\",\"tests\":[{\"name\":\"so docs match code style\",\"code\":[\";+\",\"; :Description:\",\"; My sample procedure with default \\\"modern\\\" formatting\",\";\",\"; :Arguments:\",\"; arg1: in, required, Boolean\",\"; My favorite argument\",\"; arg2: in, optional, Boolean\",\"; My second favorite argument\",\";\",\"; :Keywords:\",\"; KW1: in, required, Boolean\",\"; My favorite keyword\",\"; KW2: in, optional, Boolean\",\"; My second favorite keyword\",\";\",\";-\",\"pro mypro_modern, arg1, arg2, kw1 = kw1, kw2 = kw2\",\" compile_opt idl2, hidden\",\"\",\" ;+ reference to our super cool and awesome plot\",\" a = plot(/test)\",\"\",\" ; sample if statement\",\" if !true then begin\",\" print, 42\",\" endif else begin\",\" print, 84\",\" endelse\",\"\",\" ; sample for loop\",\" foreach val, var, key do begin\",\"\",\" endforeach\",\"\",\" ; sample ENVI routine\",\" e = envi()\",\" r = ENVIRaster(metadata = meta) ; formatting matches docs\",\"\",\"end\"],\"config\":{\"autoDoc\":true,\"style\":{\"keywords\":\"lower\"}}}]}","auto-doc.structures.spec.ts":"{\"suiteName\":\"Generate structure docs\",\"fileName\":\"auto-doc.structures.spec.ts\",\"tests\":[{\"name\":\"to automatically add them\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"to do nothing without a class/structure definition routine\",\"code\":[\"pro pro4\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\" !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"add missing properties and sort alphabetically with bad at the end\",\"code\":[\";+\",\"; :MyStruct:\",\"; propFake: any\",\"; Placeholder docs for argument or keyword\",\"; prop2: any\",\"; Placeholder docs for argument or keyword\",\";\",\";-\",\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}},{\"name\":\"with no properties\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {MyStruct}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","auto-doc.structures.2.spec.ts":"{\"suiteName\":\"Generate structure docs\",\"fileName\":\"auto-doc.structures.2.spec.ts\",\"tests\":[{\"name\":\"and verify spacing for empty structures\",\"code\":[\"pro pro4__define\",\" compile_opt idl2\",\"\",\" !null = {struct1}\",\"\",\" !null = {struct2}\",\"\",\" !null = {struct3, prop: 'socool'}\",\"\",\"end\"],\"config\":{\"autoDoc\":true}}]}","format.after-main.spec.ts":"{\"suiteName\":\"Keep tokens after main level programs\",\"fileName\":\"format.after-main.spec.ts\",\"tests\":[{\"name\":\"example 1\",\"code\":[\"compile_opt idl2\",\"\",\"a = 5\",\"end\",\"; comment\",\"b = 17\"]}]}","format.after-line-continuation.spec.ts":"{\"suiteName\":\"Keep tokens after line continuations\",\"fileName\":\"format.after-line-continuation.spec.ts\",\"tests\":[{\"name\":\"example 1\",\"code\":[\"\",\"compile_opt idl2\",\"; thing\",\"a = $ something bad ;\",\" 5\",\"end\"]}]}","format.arrays.1.spec.ts":"{\"suiteName\":\"Verify array formatting\",\"fileName\":\"format.arrays.1.spec.ts\",\"tests\":[{\"name\":\"basic formatting\",\"code\":[\"compile_opt idl2\",\"\",\"a = [1,2,3,4,5]\",\"end\"]},{\"name\":\"line continuation 1\",\"code\":[\"compile_opt idl2\",\"\",\"a = [ $\",\" 1, $\",\" 2,$\",\" 3, $\",\" 4, $\",\" 5 $\",\"]\",\"end\"]},{\"name\":\"indexing and properties\",\"code\":[\"compile_opt idl2\",\"\",\"for xx = 0, numRows-1 do begin\",\"xRows[xx].Index = xCobs[xx].Index\",\"xRows[xx].Name = xCobs[xx].Name\",\"xRows[xx].Label = xCobs[xx].Label\",\"xRows[xx].SRS_Name = xCobs[xx].SRS_Name\",\"xRows[xx].Pos1 = xCobs[xx].Pos1\",\"xRows[xx].Dims1 = xCobs[xx].Dims1\",\"xRows[xx].Pos2 = xCobs[xx].Pos2\",\"xRows[xx].Dims2 = xCobs[xx].Dims2\",\"xRows[xx].Tm_Pos1 = xCobs[xx].Tm_Pos1\",\"xRows[xx].Tm_Pos2 = xCobs[xx].Tm_Pos2\",\"endfor\",\"\",\"end\"]},{\"name\":\"array indexing spacing\",\"code\":[\"overlaps.LOWER[sIdx] = ptr_new(segs[tSub[0] : tSub[2], tSub[3]])\"]},{\"name\":\"brackets for access (via overload)\",\"code\":[\"meta['band names'] = 'Awesome Label Regions'\"]},{\"name\":\"array after comma as argument\",\"code\":[\"compile_opt idl2\",\"\",\" inputValidator, hash( $\",\"'buffer', ['number', 'required'])\",\"\",\"end\"]}]}","format.assignment.1.spec.ts":"{\"suiteName\":\"Verify assignment formatting\",\"fileName\":\"format.assignment.1.spec.ts\",\"tests\":[{\"name\":\"multi-multi line assignment with operators looking correct\",\"code\":[\"compile_opt idl2\",\"\",\"a = 1 + $\",\" 2+ $\",\" 3 + $\",\" 4+ $\",\" 5\",\"end\"]}]}","format.comments.1.spec.ts":"{\"suiteName\":\"Verify comment\",\"fileName\":\"format.comments.1.spec.ts\",\"tests\":[{\"name\":\"all flavors of comments\",\"code\":[\"a = 42 ; comment OK\",\" ;; comment bad, now fixed \",\"; TODO: something super crazy \",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"limit formatting for routine comments\",\"code\":[\";+\",\"; My procedure\",\";\",\";; Preserve spacing in routine docs\",\" ; fix left alignment though\",\"; And trim the right side of the comment blocks \",\"; :Args:\",\"; var1: in, required, unknown\",\"; My favorite thing\",\"; :Keywords:\",\"; kw1: in, optional, type=boolean\",\"; Super Cool flag\",\";\",\";-\",\"pro mypro, var1, var2, KW1=kw1, KW2=kw2\",\" compile_opt idl2\",\" if !true then begin\",\" print, 'yes'\",\" endif\",\"end\"]},{\"name\":\"add placeholder case for variable docs\",\"code\":[\" compile_opt idl2\",\"\",\" ;+ comment for variable\",\" ; leave indent formatting alone for now\",\" ;- stopped here\",\" a = 'something'\",\"end\"]},{\"name\":\" do not trim string before comment after line continuation\",\"code\":[\"compile_opt idl2\",\" ; left align\",\" a = 5 ; trim\",\"MESSAGE, $ ; keep my space!\",\"'baaaad'\",\"end\",\"\"]}]}","format.executive-commands.1.spec.ts":"{\"suiteName\":\"Executive command formatting\",\"fileName\":\"format.executive-commands.1.spec.ts\",\"tests\":[{\"name\":\"works without main end\",\"code\":[\"compile_opt idl2\",\"\",\".run something\",\" .compile myfile.pro \",\" .reset \",\"\"]}]}","format.line-separators.1.spec.ts":"{\"suiteName\":\"Line separator formatting\",\"fileName\":\"format.line-separators.1.spec.ts\",\"tests\":[{\"name\":\"always remove line separators, never allow them\",\"code\":[\"\",\"\",\"compile_opt idl2\",\"\",\"if !true then begin & a = b & b = c & c = d & endif\",\"\",\"end\",\"\"]}]}","format.line-separators.2.spec.ts":"{\"suiteName\":\"Line separators (&)\",\"fileName\":\"format.line-separators.2.spec.ts\",\"tests\":[{\"name\":\"Another example from docs\",\"code\":[\"compile_opt idl2\",\"\",\"if rtol lt ftol then begin ;Done?\",\"t = y[0] & y[0] = y[ilo] & y[ilo] = t ;Sort so fcn min is 0th elem\",\"t = p[*,ilo] & p[*,ilo] = p[*,0] & p[*,0] = t\",\"return, t ;params for fcn min\",\"endif\",\"\",\"end\"]}]}","format.new-lines.1.spec.ts":"{\"suiteName\":\"Verify new lines\",\"fileName\":\"format.new-lines.1.spec.ts\",\"tests\":[{\"name\":\"cannot have more than one empty line\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"\",\"\",\"return\",\"\",\"\",\"end\"]}]}","format.python.1.spec.ts":"{\"suiteName\":\"Format python code\",\"fileName\":\"format.python.1.spec.ts\",\"tests\":[{\"name\":\"for consistent spacing\",\"code\":[\"compile_opt idl2\",\"\",\">>>from idlpy import *\",\">>> arr = IDL.randomu(None, 10000)\",\">>> spec = IDL.fft_powerspectrum(arr, 0.1)\",\"end\",\"\"]}]}","format.respect-errors.1.spec.ts":"{\"suiteName\":\"Verify we do not format when we have bad syntax errors\",\"fileName\":\"format.respect-errors.1.spec.ts\",\"tests\":[{\"name\":\"unclosed tokens are ignored\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3 \",\" compile_opt idl2 \",\" \",\" a = myfunc(\",\"end \"]},{\"name\":\"unclosed main level is ignored\",\"code\":[\" compile_opt idl2 \",\" \",\"a = 5 \"]}]}","format.routines.1.spec.ts":"{\"suiteName\":\"Verify we format routines\",\"fileName\":\"format.routines.1.spec.ts\",\"tests\":[{\"name\":\"formats basic routine\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"\",\"end\"]},{\"name\":\"formats basic method\",\"code\":[\"function myclass::mymethod, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3\",\" compile_opt idl2\",\"return, 1\",\"\",\"end\"]}]}","format.snap.1.spec.ts":"{\"suiteName\":\"Verify snapping branches to remove leading and trailing spaces\",\"fileName\":\"format.snap.1.spec.ts\",\"tests\":[{\"name\":\"all snap cases\",\"code\":[\"function test, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" return, 1\",\"end\",\"\",\"function test::class, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" return, 1\",\"end\",\"\",\"pro test::class, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\"end\",\"\",\"pro test, a, $\",\" b\",\"\",\" compile_opt idl2\",\"\",\" wait, 0.5\",\"\",\" if !true then begin\",\"\",\" print, 5\",\"\",\" print, 6\",\" \",\" endif\",\"\",\" switch (!true) of\",\"\",\" (42 eq 42): begin\",\"\",\" end\",\"\",\" else: begin\",\"\",\" ; do nothing\",\"\",\" end\",\"\",\" endswitch\",\"\",\"end\",\"\",\"\",\"compile_opt idl2\",\"\",\"print, 5\",\"\",\"wait, 2\",\"\",\"test\",\"\",\"print, 'Finished'\",\"\",\"end\"]}]}","format.trimming.1.spec.ts":"{\"suiteName\":\"Verify trimming lines\",\"fileName\":\"format.trimming.1.spec.ts\",\"tests\":[{\"name\":\"all lines should be trimmed from the right\",\"code\":[\"pro mypro, arg1, arg2, arg3, KW1=kw1,$ ; commment\",\"KW2 = kw2, KW3 = kw3 \",\" compile_opt idl2 \",\" \",\"end \"]}]}","style.control.spec.ts":"{\"suiteName\":\"Control statement styling\",\"fileName\":\"style.control.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" continue\",\" break\",\" forward_function\",\" common block, var1, var2, etc\",\" goto, myjump\",\" myjump:\",\"end\",\"\",\"function myfuncfunc\",\" compile_opt idl2\",\" return, 1\",\"end\",\"\",\"compile_opt idl2\",\"\",\"; for loop\",\"for i=0,100,3 do begin\",\"\",\"endfor\",\"\",\"; foreach loop\",\"foreach val, var, key, do begin\",\"\",\"endforeach\",\"\",\"; while loop\",\"while !true do begin\",\"\",\"endwhile\",\"\",\"; repeat loop\",\"repeat print, !true until !false\",\"\",\"; switch statement\",\"switch !true of\",\" else: ; something\",\"endswitch\",\"\",\"; case statement\",\"case !true of\",\" else: ; something\",\"endcase\",\"\",\"; if statement\",\"if !true then begin\",\"\",\"endif else begin\",\"\",\"endelse\",\"\",\"; structure inheritance\",\"mystruct = {myname, INHerits plot}\",\"\",\"; executive command\",\".reset\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"control\":\"none\"}}}]}","style.internal-routines.spec.ts":"{\"suiteName\":\"Style internal routines\",\"fileName\":\"style.internal-routines.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"match\"}}},{\"name\":\"pascal\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"pascal\"}}},{\"name\":\"camel\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"camel\"}}},{\"name\":\"upper\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"lower\"}}},{\"name\":\"none\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\" Return\",\"end\",\"\",\"compile_opt idl2\",\"\",\"PRINT\",\"Openr\",\"\",\"p = PLOT()\",\"\",\"r = enviraster()\",\"\",\"o = idlneturl()\",\"\",\"s = IDLFFSHAPE()\",\"\",\"!null = STRTOK('something')\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"none\"}}}]}","style.user-routines.spec.ts":"{\"suiteName\":\"Style user routines\",\"fileName\":\"style.user-routines.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"match\"}}},{\"name\":\"pascal\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"pascal\"}}},{\"name\":\"camel\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"camel\"}}},{\"name\":\"upper\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"lower\"}}},{\"name\":\"none\",\"code\":[\"pro test_things\",\" compile_opt idl2\",\"end\",\"\",\"function test_THINGS\",\" compile_opt idl2\",\" return, 42\",\"end\",\"\",\"compile_opt idl2\",\"\",\"TEST_THINGS\",\"!null = test_things()\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routines\":\"none\"}}}]}","style.keywords.1.spec.ts":"{\"suiteName\":\"Verify keywords\",\"fileName\":\"style.keywords.1.spec.ts\",\"tests\":[{\"name\":\"basic formatting\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(KW1=kw2, /KW3)\",\"end\"]},{\"name\":\"with line continuation\",\"code\":[\"compile_opt idl2\",\"\",\"Graphic, name, arg1, arg2, $\",\"/AUTO_CROSSHAIR, COLOR=color, LINESTYLE=linestyle, $\",\"SYMBOL=SYMBOL, THICK=thick, LAYOUT=layout, TEST=test, _EXTRA=ex, $\",\"GRAPHIC=graphic\",\"\",\"end\"]},{\"name\":\"solo keyword\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(KW1=kw2)\",\"end\"]},{\"name\":\"solo binary keyword\",\"code\":[\"compile_opt idl2\",\"\",\"a = myfunc(/KW2)\",\"end\"]},{\"name\":\"preserve other children after keyword when we format\",\"code\":[\"compile_opt idl2\",\"tvcrs,x,y,/dev $ ;Restore cursor\",\" kw=2\",\"\",\"end\"]}]}","style.methods.spec.ts":"{\"suiteName\":\"Method styling\",\"fileName\":\"style.methods.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"dot\"}}},{\"name\":\"using dated format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"arrow\"}}},{\"name\":\"using no format\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"methods\":\"none\"}}}]}","style.methods-call.spec.ts":"{\"suiteName\":\"Method styling\",\"fileName\":\"style.methods-call.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"match\"}}},{\"name\":\"pascal\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"pascal\"}}},{\"name\":\"camel\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"camel\"}}},{\"name\":\"upper\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"lower\"}}},{\"name\":\"none\",\"code\":[\"function myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"!null = self.myMethod()\",\"\",\"return, 1\",\"end\",\"\",\"pro myclass::MYMETHOD\",\"compile_opt idl2\",\"\",\"self.myMethod\",\"end\",\"\",\"pro auto_doc_example\",\"compile_opt idl2\",\"\",\"p = IDLgrSurface()\",\"!null = p.getFullIdentifier()\",\"p.SETVERTEXATTRIBUTEDATA\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"routineMethods\":\"none\"}}}]}","style.prompts.spec.ts":"{\"suiteName\":\"Prompt styling\",\"fileName\":\"style.prompts.spec.ts\",\"tests\":[{\"name\":\"format ENVI and IDL\",\"code\":[\"\",\"\",\"compile_opt idl2\",\"\",\"idl> print, 17\",\"\",\" envi>a = 5 + 6\",\"\",\"end\",\"\"]}]}","style.numbers.spec.ts":"{\"suiteName\":\"Number styling\",\"fileName\":\"style.numbers.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 45Ll\",\"\",\"a = \\\"101010\\\"bll\",\"\",\"a = \\\"777\\\"oS\",\"\",\"a = \\\"fFf\\\"xlL\",\"\",\"a = '101010'bll\",\"\",\"a = '777'oS\",\"\",\"a = 'fFf'xlL\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"numbers\":\"none\"}}}]}","style.hex.spec.ts":"{\"suiteName\":\"Hex number styling\",\"fileName\":\"style.hex.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0XaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"hex\":\"none\"}}}]}","style.octal.spec.ts":"{\"suiteName\":\"Octal number styling\",\"fileName\":\"style.octal.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0OaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"octal\":\"none\"}}}]}","style.binary.spec.ts":"{\"suiteName\":\"Binary number styling\",\"fileName\":\"style.binary.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = 0BaEf\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"binary\":\"none\"}}}]}","style.properties.spec.ts":"{\"suiteName\":\"Property styling\",\"fileName\":\"style.properties.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"match\"}}},{\"name\":\"pascal\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"pascal\"}}},{\"name\":\"camel\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"camel\"}}},{\"name\":\"lower\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"lower\"}}},{\"name\":\"upper\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"upper\"}}},{\"name\":\"none\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = myvar.myPROP\",\"b = {SomeThing:'cool'}\",\"!null = b.SomeThing\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"properties\":\"none\"}}}]}","style.variables.1.spec.ts":"{\"suiteName\":\"Verify variable styling\",\"fileName\":\"style.variables.1.spec.ts\",\"tests\":[{\"name\":\"in procedures with modern formatting\",\"code\":[\"pro test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in procedures with no formatting\",\"code\":[\"pro test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}},{\"name\":\"in functions with modern formatting\",\"code\":[\"function test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\" return, task\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in functions with no formatting\",\"code\":[\"function test_things, a, someTHING, c, KW1 = kw11\",\" compile_opt idl2\",\" A = something + C + keyword_set(KW11)\",\" taSK = ENVITask('Something')\",\" TASK = !null\",\" !null = enVi.openRaster()\",\" !null = enviTask.parameter()\",\" return, task\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}},{\"name\":\"in main level with modern formatting\",\"code\":[\"compile_opt idl2\",\"A = something + C + keyword_set(KW11)\",\"taSK = ENVITask('Something')\",\"TASK = !null\",\"!null = enVi.openRaster()\",\"!null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"match\"}}},{\"name\":\"in main level with no formatting\",\"code\":[\"compile_opt idl2\",\"A = something + C + keyword_set(KW11)\",\"taSK = ENVITask('Something')\",\"TASK = !null\",\"!null = enVi.openRaster()\",\"!null = enviTask.parameter()\",\"end\"],\"config\":{\"style\":{\"localVariables\":\"none\"}}}]}","style.system-variables.spec.ts":"{\"suiteName\":\"System variable styling\",\"fileName\":\"style.system-variables.spec.ts\",\"tests\":[{\"name\":\"using modern format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"lower\"}}},{\"name\":\"using dated format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"upper\"}}},{\"name\":\"using no format\",\"code\":[\"compile_opt idl2, hidden\",\"\",\"a = !SYSTEM_variable\",\"\",\"b = {!CPu, hw_vector: 0l, vector_enable: 0l, hw_ncpu: 0l,$\",\" tpool_nthreads: 0l, tpool_min_elts: 0l, tpool_max_elts: 0l}\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"systemVariables\":\"none\"}}}]}","format.indent.1.spec.ts":"{\"suiteName\":\"Verify adjusting indent adjusts spacing\",\"fileName\":\"format.indent.1.spec.ts\",\"tests\":[{\"name\":\"set indent to 3\",\"code\":[\"pro mypro\",\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"tabWidth\":3,\"style\":{\"quotes\":\"single\"}}}]}","lib-examples.1.spec.ts":"{\"suiteName\":\"Verify code snippets from the lib folder\",\"fileName\":\"lib-examples.1.spec.ts\",\"tests\":[{\"name\":\"cw_ogc_wcs_cap.pro 1\",\"code\":[\"compile_opt idl2\",\"subsel = make_array(2, numRows, /byte) ; an array to hold the unique values\",\"subsel[0,0] = sel[*,1]\",\"lastRow = sel[1,0]\",\"ri = 1\",\"\",\";filter out all the rows that repeat\",\"for i=1, cnt-1 do begin\",\" if (lastRow ne sel[1,i]) then begin\",\" sel[0,i] = 1\",\" subsel[*,ri] = sel[*,i]\",\" lastRow = sel[1,i]\",\" ri++\",\" endif\",\"endfor\",\"\",\"end\"]},{\"name\":\"cw_ogc_wcs_cap.pro 2\",\"code\":[\"\",\"if ((*pstate).mouseState eq 1) then begin\",\"\",\" if (totCOBs gt rows) then begin\",\" if ((*pstate).scrollUp eq 0) then begin ; scroll down\",\" if ((*pstate).cobIndex lt totCOBs) then begin\",\"\",\"\",\" (*pstate).cobIndex = (*pstate).cobIndex + (*pstate).pageScrlInc\",\"\",\" idx = (*pstate).cobIndex\",\" skip = idx-rows\",\" if (skip gt (totCOBs - rows)) then begin\",\" skip = totCOBs - rows\",\" ;(*pstate).cobIndex = totCOBs-rows\",\" (*pstate).cobIndex = totCOBs\",\" endif\",\"\",\" res = (*pstate).owcs->GetCoverageOfferingBriefs(index=skip, number=rows)\",\" cw_ogc_wcs_cap_display_cap_table, ev, res\",\"\",\" endif\",\" endif else begin ; scroll up\",\" if ((*pstate).cobIndex gt rows) then begin\",\"\",\"\",\" (*pstate).cobIndex = (*pstate).cobIndex - (*pstate).pageScrlInc\",\"\",\" idx = (*pstate).cobIndex\",\" skip = idx-rows\",\"\",\" if (skip lt 0) then begin\",\" skip = 0\",\" (*pstate).cobIndex = rows\",\" endif\",\"\",\" res = (*pstate).owcs->GetCoverageOfferingBriefs(index=skip, number=rows)\",\" cw_ogc_wcs_cap_display_cap_table, ev, res\",\"\",\" endif\",\" endelse\",\" endif\",\"endif\",\"\",\"end\"]}]}","lib-examples.2.spec.ts":"{\"suiteName\":\"Lib examples 2\",\"fileName\":\"lib-examples.2.spec.ts\",\"tests\":[{\"name\":\"dist.pro\",\"code\":[\"function dist,n,m ;Return a rectangular array in which each pixel = euclidian\",\" ;distance from the origin.\",\"compile_opt idl2\",\"\",\"on_error,2 ;Return to caller if an error occurs\",\"\",\"n1 = n[0]\",\"m1 = (n_elements(m) le 0) ? n1 : m[0]\",\"x=findgen(n1) ;Make a row\",\"x = (x < (n1-x)) ^ 2 ;column squares\",\"\",\"a = FLTARR(n1,m1,/NOZERO) ;Make array\",\"\",\"for i=0L, m1/2 do begin ;Row loop\",\" y = sqrt(x + i^2.) ;Euclidian distance\",\" a[0,i] = y ;Insert the row\",\" if i ne 0 then a[0, m1-i] = y ;Symmetrical\",\"endfor\",\"return,a\",\"end\"]}]}","style.logic-case.1.spec.ts":"{\"suiteName\":\"Verify we style case\",\"fileName\":\"style.logic-case.1.spec.ts\",\"tests\":[{\"name\":\"formats messy case\",\"code\":[\"CASE x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\" 2 $\",\" : $\",\" PRINT, 'one' + func()\",\" ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\",\"end\"]},{\"name\":\"formats nested case\",\"code\":[\"CASE x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" CASE x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\",\"end\"]},{\"name\":\"Properly format indents for case without line continuation\",\"code\":[\"compile_opt idl2\",\" ; determine how to proceed\",\" case !true of\",\" ; only have positive values\",\" negative eq !null: begin\",\" ranges[*, i] = [0, positive]\",\" end\",\"\",\" ; only have negative values\",\" positive eq !null: begin\",\" ranges[*, i] = [-negative, 0]\",\" end\",\"\",\" ; have positive and negative values\",\" else: begin\",\" ; get our bounds\",\" maxVal = negative > positive\",\"\",\" ; populate range\",\" ranges[*, i] = [-maxVal, maxVal]\",\" end\",\" endcase\",\"end\"]},{\"name\":\"removes spaces in logical default\",\"code\":[\"compile_opt idl2\",\"case N_PARAMS() of\",\"else : ; remove my space to the left after \\\"else\\\"\",\"endcase\",\"end\"]},{\"name\":\"properly formats this case/switch style\",\"code\":[\"compile_opt idl2\",\"\",\"; Just determine what to do and register.\",\"case 1 of\",\"\",\" keyword_set(visualization): $\",\" oSystem->RegisterVisualization, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(annotation): $\",\" oSystem->RegisterAnnotation, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(user_interface): $\",\"oSystem->RegisterUserInterface, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(ui_panel): $\",\"oSystem->RegisterUIPanel, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(ui_service): $\",\"oSystem->RegisterUIService, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(file_reader): $\",\"oSystem->RegisterFileReader, strName, strClassName, _EXTRA = _extra\",\"\",\"keyword_set(file_writer): $\",\"oSystem->RegisterFileWriter, strName, strClassName, _EXTRA = _extra\",\"\",\"else: $\",\"oSystem->RegisterTool, strName, strClassName, _EXTRA = _extra\",\"\",\"endcase\",\"end\"]}]}","style.logic-if-then.1.spec.ts":"{\"suiteName\":\"Verify we style if-then\",\"fileName\":\"style.logic-if-then.1.spec.ts\",\"tests\":[{\"name\":\"complex scenarios for if-then-else\",\"code\":[\" COMPILE_OPT idl2\",\"\",\" IF (n_elements(useDicomexIn) EQ 1) THEN $\",\" useDicomex = keyword_set(useDicomexIn) $\",\" ELSE $\",\" useDicomex = 1\",\"\",\" if !true then print, 'true' else print, 'false'\",\"\",\" IF (n_elements(useDicomexIn) EQ 1) $\",\"THEN $\",\" useDicomex = keyword_set(useDicomexIn) $\",\" ELSE $\",\" useDicomex = 1\",\"\",\" if !true then begin\",\"print, 'no'\",\" endif else begin\",\" b = 42\",\" endelse\",\"\",\"end\"]},{\"name\":\"keep on indenting with line continuations\",\"code\":[\"compile_opt idl2\",\"; when in paren, not as pretty\",\"if (!true $\",\" ) then $\",\"imageFFT = FFT(image, -1)\",\"\",\";;outside of paren, looks much nicer as long as enclosed\",\"if (!true)$\",\" then $\",\"imageFFT = FFT(image, -1)\",\"\",\"a = 5\",\"end\"]},{\"name\":\"complex indentation for if statement\",\"code\":[\"compile_opt idl2\",\"if ((imageSz.N_DIMENSIONS ne 2) || $\",\"((imageSz.TYPE ne 6) && (imageSz.TYPE ne 9)) || $\",\" MAX(imageSz.DIMENSIONS[0 : 1] ne imageDims[0] * 2)) then begin\",\" ; Double the image size and pad with zeros\",\" bigImage = dblarr(imageDims[0] * 2, imageDims[1] * 2)\",\" bigImage[0 : imageDims[0] - 1, 0 : imageDims[1] - 1] = image\",\" imageFFT = FFT(bigImage, -1)\",\" imageNElts = N_ELEMENTS(bigImage)\",\" endif\",\"end\"]},{\"name\":\"very complex if statement for regression test\",\"code\":[\"compile_opt idl2\",\"\",\" ;; Check to see if texture map was passed in as 3 or 4 separate 2D\",\" ;; arrays. textureRed, textureGreen, and textureBlue must all\",\" ;; be 2D arrays of the same size and type and textureImage must\",\" ;; not be set.\",\" IF keyword_set(textureRed) && keyword_set(textureGreen) && $\",\" keyword_set(textureBlue) && ~keyword_set(textureImage) && $\",\" (size(reform(textureRed),/n_dimensions) EQ 2) && $\",\" (size(reform(textureGreen),/n_dimensions) EQ 2) && $\",\" (size(reform(textureBlue),/n_dimensions) EQ 2) && $\",\" ( ((textmap_x=(size(reform(textureRed),/dimensions))[0])) EQ $\",\" (size(reform(textureGreen),/dimensions))[0] ) && $\",\" ( textmap_x EQ (size(reform(textureBlue),/dimensions))[0] ) && $\",\" ( ((textmap_y=(size(reform(textureRed),/dimensions))[1])) EQ $\",\" (size(reform(textureGreen),/dimensions))[1] ) && $\",\" ( textmap_y EQ (size(reform(textureBlue),/dimensions))[1] ) && $\",\" ( ((textmap_type=(size(reform(textureRed),/type))[0])) EQ $\",\" (size(reform(textureGreen),/type))[0] ) && $\",\" ( textmap_type EQ (size(reform(textureBlue),/type))[0] ) && $\",\" ( where(textmap_type EQ [0l,6,7,8,9,10,11]) EQ -1 ) THEN BEGIN\",\" ;; textureAlpha, if set, must match TEXTURE_* in size and type\",\" IF keyword_set(textureAlpha) && $\",\" (size(reform(textureAlpha),/n_dimensions) EQ 2) && $\",\" ( textmap_x EQ (size(reform(textureAlpha),/dimensions))[0]) && $\",\" ( textmap_y EQ (size(reform(textureAlpha),/dimensions))[1]) && $\",\" ( textmap_type EQ (size(reform(textureAlpha),/type))[0]) $\",\" THEN BEGIN\",\" textData = make_array(4,textmap_x,textmap_y,type=textmap_type)\",\" textData[0,*,*] = textureRed\",\" textData[1,*,*] = textureGreen\",\" textData[2,*,*] = textureBlue\",\" textData[3,*,*] = textureAlpha\",\" ENDIF ELSE BEGIN\",\" textData = make_array(3,textmap_x,textmap_y,type=textmap_type)\",\" textData[0,*,*] = textureRed\",\" textData[1,*,*] = textureGreen\",\" textData[2,*,*] = textureBlue\",\" ENDELSE\",\" oTextMap = obj_new('idlitDataIDLArray3d', textData, $\",\" NAME='TEXTURE')\",\" oParmSet->add, oTextMap, PARAMETER_NAME= \\\"TEXTURE\\\"\",\" ENDIF\",\"\",\"end\"]}]}","style.logic-switch.1.spec.ts":"{\"suiteName\":\"Verify we style switch\",\"fileName\":\"style.logic-switch.1.spec.ts\",\"tests\":[{\"name\":\"formats messy switch\",\"code\":[\"SWITCH x OF\",\" ; something cool\",\"1 $\",\" : $\",\" PRINT, 'one' + func()\",\" 2 $\",\" : $\",\" PRINT, 'one' + func()\",\" ELSE: BEGIN\",\" dat = {myStruct}\",\" PRINT, 'Please enter a value between 1 and 4'\",\" END\",\"ENDCASE\",\"end\"]},{\"name\":\"formats nested switch\",\"code\":[\"SWITCH x OF\",\"1: PRINT, 'one'\",\"ELSE: BEGIN\",\" switch x OF\",\" 2: PRINT, 'two'\",\" ELSE: BEGIN\",\" END\",\" ENDCASE\",\"END\",\"ENDCASE\",\"end\"]}]}","style.logic-ternary.1.spec.ts":"{\"suiteName\":\"Verify we style ternary operators well\",\"fileName\":\"style.logic-ternary.1.spec.ts\",\"tests\":[{\"name\":\"simple case with spacing\",\"code\":[\"nPrint = (nTiles lt 100) ? 1:ceil(nTiles / 100.0)\"]},{\"name\":\"Case to preserve spacing before else\",\"code\":[\"oWorld = OBJ_VALID(oLayer) ? oLayer->GetWorld(): OBJ_NEW()\"]}]}","style.methods.1.spec.ts":"{\"suiteName\":\"Verify style for methods\",\"fileName\":\"style.methods.1.spec.ts\",\"tests\":[{\"name\":\"remove excess spaces\",\"code\":[\" compile_opt idl2\",\"\",\"a = myclass . mymethod()\",\"myclass . mymethod\",\"a = myclass -> mymethod()\",\"myclass -> mymethod\",\"\",\"end\"]}]}","style.operators.1.spec.ts":"{\"suiteName\":\"Verify operators\",\"fileName\":\"style.operators.1.spec.ts\",\"tests\":[{\"name\":\"pointers\",\"code\":[\"compile_opt idl2\",\"\",\"; complex pointers\",\"(*pstate).coDesCovIdArr[(*pstate).coDesCovIdArrIdx++] = ogc_wcs_descov(ev.top, (*pstate).owcs, covNames, '')\",\"\",\"end\"]},{\"name\":\"pointers\",\"code\":[\"compile_opt idl2\",\"\",\"*ptr = 42\",\"end\"]},{\"name\":\"operators that should not have spaces\",\"code\":[\"compile_opt idl2\",\"\",\"a++\",\"b--\",\"++c\",\"--d\",\"a += 6\",\"y -= 42\",\"m = --6\",\"n = ++4\",\"end\"]},{\"name\":\"handle tilde\",\"code\":[\"if ~keyword_set(difference_raster_uri) then difference_raster_uri = e.GetTemporaryFilename()\"]},{\"name\":\"pointer dereference and multiplication\",\"code\":[\"compile_opt idl2\",\"a = 5*10\",\"(*ptr).prop = 5\",\"b = *ptr\",\"segsUpper.Add, * overlaps.LOWER[mapXY[0], mapXY[1] - 1], /EXTRACT\",\"end\"]},{\"name\":\"remove spaces before operators where we do not need then\",\"code\":[\" compile_opt idl2\",\"\",\" a = - 1\",\" mypro, - 1\",\"\",\" ; create a struture to store information about our tile overlaps\",\" overlaps = { $\",\" IDX_X: - 0l $\",\" }\",\"deltas = ranges[1, *]-ranges[0, *]\",\"idxMin = [0 : - 2]\",\"end\"]},{\"name\":\"preserve spacing here\",\"code\":[\"a = ['Anomaly Detection: ' + task.MEAN_CALCULATION_METHOD]\"]},{\"name\":\"preserve spacing here too\",\"code\":[\"cs = !dpi *[0d : num_period - 1]\"]},{\"name\":\"operators by paren get properly ignored for trimming\",\"code\":[\"compile_opt idl2\",\" if (and filtMask and igMask) then filters = 'Image Files'\",\" if (eq filtMask and igMask) then filters = 'Image Files'\",\" if (ge filtMask and igMask) then filters = 'Image Files'\",\" if (gt filtMask and igMask) then filters = 'Image Files'\",\" if (le filtMask and igMask) then filters = 'Image Files'\",\" if (lt filtMask and igMask) then filters = 'Image Files'\",\" if (mod filtMask and igMask) then filters = 'Image Files'\",\" if (ne filtMask and igMask) then filters = 'Image Files'\",\" if (not filtMask and igMask) then filters = 'Image Files'\",\" if (or filtMask and igMask) then filters = 'Image Files'\",\" if (xor filtMask and igMask) then filters = 'Image Files'\",\"end\"]}]}","style.quotes-double.1.spec.ts":"{\"suiteName\":\"Verify double quote styling\",\"fileName\":\"style.quotes-double.1.spec.ts\",\"tests\":[{\"name\":\"convert double to single quote\",\"code\":[\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}},{\"name\":\"keep formatting when double quotes is preference\",\"code\":[\" compile_opt idl2\",\"\",\" ; double quote\",\" a = \\\"something\\\"\",\"\",\" ; double quote with single quote\",\" a = '\\\"'\",\"\",\" ; escaped double quote\",\" a = \\\"escaped\\\"\\\"formatting\\\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}}]}","style.quotes-none.1.spec.ts":"{\"suiteName\":\"Verify no formatting of quotes\",\"fileName\":\"style.quotes-none.1.spec.ts\",\"tests\":[{\"name\":\"preserve all quotes\",\"code\":[\"compile_opt idl2\",\"\",\"message, 'Each dimension must be greater than 1.\\\"'\",\"\",\"a = \\\"5\\\"\",\"\",\"a = 'fourty two'\",\"\",\"; for chris and doug\",\"a = '1'\",\"\",\"\",\" ; number strings\",\" a = \\\"010101\\\"b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"none\"}}}]}","style.quotes-nested.1.spec.ts":"{\"suiteName\":\"Verify double quote parsing\",\"fileName\":\"style.quotes-nested.1.spec.ts\",\"tests\":[{\"name\":\"preserve nested double quote when we use single\",\"code\":[\"compile_opt idl2\",\"\",\"message, 'Each dimension must be greater than 1.\\\"'\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}},{\"name\":\"preserve nested single quote when we use double\",\"code\":[\"compile_opt idl2\",\"\",\"message, \\\"Each dimension must be greater than 1.'\\\"\",\"\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}}]}","style.quotes-single.1.spec.ts":"{\"suiteName\":\"Verify single quote parsing\",\"fileName\":\"style.quotes-single.1.spec.ts\",\"tests\":[{\"name\":\"convert single to double quote\",\"code\":[\" compile_opt idl2\",\"\",\" ; single quote\",\" a = 'something'\",\"\",\" ; double quote with single quote\",\" a = '\\\"'\",\"\",\" ; escaped single quote\",\" a = 'escaped''formatting'\",\"\",\" ; number strings\",\" a = '010101'b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"double\"}}},{\"name\":\"keep formatting when single quotes is preference\",\"code\":[\" compile_opt idl2\",\"\",\" ; single quote\",\" a = 'something'\",\"\",\" ; double quote with single quote\",\" a = \\\"'\\\"\",\"\",\" ; escaped single quote\",\" a = 'escaped''formatting'\",\"\",\" ; number strings\",\" a = '010101'b\",\"end\"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"quotes\":\"single\"}}}]}","style.string-literal.1.spec.ts":"{\"suiteName\":\"Verify string literal styling\",\"fileName\":\"style.string-literal.1.spec.ts\",\"tests\":[{\"name\":\"simple\",\"code\":[\" compile_opt idl2 \",\"a = `my string with${expression}`\",\"b = `something ${5 + 6*12}`\",\" c = ` preserve as string`\",\";preserve interior spacing\",\"a = `with ${expression()} else`\",\" \",\"end \"]},{\"name\":\"multi-line\",\"code\":[\"compile_opt idl2\",\"; thing\",\"a = ` first\",\" second\",\" third\",\"`\",\"end\"]}]}","style.structures.1.spec.ts":"{\"suiteName\":\"Verify structures\",\"fileName\":\"style.structures.1.spec.ts\",\"tests\":[{\"name\":\"simple\",\"code\":[\" compile_opt idl2 \",\"fourty2 = { mystruct }\",\" \",\"end \"]},{\"name\":\"structure\",\"code\":[\"pro folderwatch__define\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" void = { $\",\" FOLDERWATCH, $\",\" inherits idl_object, $\",\" _folder: '', $\",\" _callback: '', $\",\" _userdata: ptr_new(), $\",\" _added: 0b, $\",\" _modified: 0b, $\",\" _removed: 0b, $\",\" _frequency: 0d, $\",\" _timerid: 0l, $\",\" _fileinfo: ptr_new(), $\",\" _recursive: 0b, $\",\" _active: 0b, $\",\" _incallback: 0b $\",\" }\",\"\",\"end\"]},{\"name\":\"structure with arrays\",\"code\":[\"pro folderwatch__define\",\" compile_opt idl2, hidden\",\" on_error, 2\",\"\",\" void = { $\",\" IDX_XY: [0l, 0l], $\",\" RIGHT_MEANS: ptrarr(mapDims) $\",\" }\",\"\",\"end\"]},{\"name\":\"structure with line continuations regression\",\"code\":[\" compile_opt idl2, hidden\",\"!null = {IDLNotebook, $\",\" _foo: 5}\",\"\",\" !null = $\",\" {IDLNotebook, $\",\" _foo: 5}\",\"\",\" !null = { $\",\" _foo: 5}\",\"\",\" !null = $\",\" { $\",\" _foo: 5}\",\"end\"]}]}","style.structure-names.1.spec.ts":"{\"suiteName\":\"Verify structure names\",\"fileName\":\"style.structure-names.1.spec.ts\",\"tests\":[{\"name\":\"match\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"match\"}}},{\"name\":\"pascal\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"pascal\"}}},{\"name\":\"camel\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"camel\"}}},{\"name\":\"upper\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"lower\"}}},{\"name\":\"none\",\"code\":[\" compile_opt idl2 \",\"!null = { IDLnetURl }\",\"!null = { enviRaster }\",\"!null = { idlNotebook }\",\"!null = { !map } ; special case, handled by sys var\",\"end \"],\"config\":{\"formatter\":\"fiddle\",\"style\":{\"structureNames\":\"none\"}}}]}","style.template-escape.spec.ts":"{\"suiteName\":\"Verify auto-fix/format of template escape characters\",\"fileName\":\"style.template-escape.spec.ts\",\"tests\":[{\"name\":\" only changes the last line with modern\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"lower\"}}},{\"name\":\" only changes the last line with dated\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"upper\"}}},{\"name\":\" only changes the last line with none\",\"code\":[\"compile_opt idl2\",\"a = `\\\\``\",\"a = `\\\\$`\",\"a = `\\\\\\\\`\",\"a = `\\\\b`\",\"a = `\\\\f`\",\"a = `\\\\n`\",\"a = `\\\\r`\",\"a = `\\\\t`\",\"a = `\\\\v`\",\"a = `\\\\x00 \\\\XaF`\",\"end\"],\"config\":{\"style\":{\"hex\":\"none\"}}}]}"},"auto-task-assembler-tests":{"envitask.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for ENVITasks\",\"fileName\":\"envitask.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_raster\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_raster_uri\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_raster\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_RASTER_uri\\\",\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","envitask.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for ENVI Tasks\",\"fileName\":\"envitask.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster \\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" output_raster_uri \\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_RASTER \\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","envitask.direction1.spec.ts":"{\"suiteName\":\"Verify direction formatting for ENVI Tasks\",\"fileName\":\"envitask.direction1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\" ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster_uri\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_raster\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower case\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection \\\",\",\" \\\"description\\\": \\\" Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER_URI\\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_RASTER\\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"ATAnomalyDetection\\\",\",\" \\\"schema\\\": \\\"envitask_3.3\\\",\",\" \\\"base_class\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"atAnomalyDetection\\\",\",\" \\\"display_name\\\": \\\"AT Anomaly Detection\\\",\",\" \\\"description\\\": \\\"Runs an automated anomaly detection using the Anomaly Detection workflow from ENVI Desktop.\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster \\\",\",\" \\\"display_name\\\": \\\"Input Raster\\\",\",\" \\\"description\\\": \\\"The raster to run anomaly detection on.\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" output_raster_uri \\\",\",\" \\\"display_name\\\": \\\"Output Raster URI\\\",\",\" \\\"description\\\": \\\"Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": false,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIURI\\\",\",\" \\\"auto_extension\\\": \\\".dat\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_RASTER \\\",\",\" \\\"display_name\\\": \\\"Output Raster\\\",\",\" \\\"description\\\": \\\"This is a reference to an ENVIRaster object.\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"hidden\\\": false,\",\" \\\"type\\\": \\\"ENVIRaster\\\",\",\" \\\"uri_param\\\": \\\"OUTPUT_RASTER_URI\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}","envitask-legacy.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_raster\\\",\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"name\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"output_roi\\\",\",\" \\\"name\\\": \\\"output_roi\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"INPUT_RASTER\\\",\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"input_RASTER\\\",\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","envitask-legacy.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"input_raster\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"input_ecf_report_uri\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_roi\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\" mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\" ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\" This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\" ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"output_roi \\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","envitask-legacy.direction-and-req1.spec.ts":"{\"suiteName\":\"Verify direction formatting for ENVI Task Legacy\",\"fileName\":\"envitask-legacy.direction-and-req1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\" OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\" ENVIROI\\\",\",\" \\\"direction\\\": \\\"output\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\" ,\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"MLEFCReportToROI\\\",\",\" \\\"baseClass\\\": \\\"ENVITaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"mlEFCReportToROI\\\",\",\" \\\"displayName\\\": \\\"ML EFC Report to ROI\\\",\",\" \\\"description\\\": \\\"This task will convert an ENVI Feature Counting (EFC) report file to an ROI for use with the new and improved chip to points. The class anmes must start with positive or negative (case insensitive). You don't have to have both present, but you cannot have mor than two classes.\\\",\",\" \\\"version\\\": \\\"5.3\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"INPUT_RASTER\\\",\",\" \\\"displayName\\\": \\\"Training Data Source Raster\\\",\",\" \\\"dataType\\\": \\\"ENVIRASTER\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"Specify the original raster that was used to find training data.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"INPUT_EFC_REPORT_FILE\\\",\",\" \\\"displayName\\\": \\\"EFC Report File\\\",\",\" \\\"dataType\\\": \\\"ENVIURI\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"parameterType\\\": \\\"required\\\",\",\" \\\"description\\\": \\\"Specify the ENVI Feature Counting report file (must have a .txt extension).\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"OUTPUT_ROI\\\",\",\" \\\"displayName\\\": \\\"Output ROI\\\",\",\" \\\"dataType\\\": \\\"ENVIROI\\\",\",\" \\\"direction\\\": \\\"OUTPUT\\\",\",\" \\\"parameterType\\\": \\\"REQUIRED\\\",\",\" \\\"description\\\": \\\"The output ROI file that will contain the pixel locations of our training data.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}","idltask.keywords1.spec.ts":"{\"suiteName\":\"Verify keyword formatting for IDL Tasks\",\"fileName\":\"idltask.keywords1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"s3_url\\\",\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"local_file\\\",\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"S3_URL\\\",\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"LOCAL_FILE\\\",\",\" \\\"name\\\": \\\"LOCAL_FILE\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"keyword\\\": \\\"S3_url\\\",\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"keyword\\\": \\\"local_FILE\\\",\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"keywords\":\"none\"}}}]}","idltask.parameters1.spec.ts":"{\"suiteName\":\"Verify parameter formatting for IDL Tasks\",\"fileName\":\"idltask.parameters1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"LOCAL_FILE\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"S3_URL\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"properties\":\"none\"}}}]}","idltask.direction1.spec.ts":"{\"suiteName\":\"Verify direction formatting for IDL Tasks\",\"fileName\":\"idltask.direction1.spec.ts\",\"tests\":[{\"name\":\"upper case\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"upper\"}}},{\"name\":\"lower\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"lower\"}}},{\"name\":\"ignore\",\"code\":[\"{\",\" \\\"name\\\": \\\"Download_S3_URL\\\",\",\" \\\"base_class\\\": \\\"IDLTaskFromProcedure\\\",\",\" \\\"routine\\\": \\\"download_S3_URL\\\",\",\" \\\"display_name\\\": \\\"Download S3 URL\\\",\",\" \\\"description\\\": \\\"This task downloads a resource specified by an S3 URL into a local file.\\\",\",\" \\\"revision\\\": \\\"1.0.0\\\",\",\" \\\"schema\\\": \\\"idltask_1.1\\\",\",\" \\\"parameters\\\": [\",\" {\",\" \\\"name\\\": \\\"s3_url\\\",\",\" \\\"display_name\\\": \\\"S3 URL\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"INPUT\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.\\\"\",\" },\",\" {\",\" \\\"name\\\": \\\"local_file\\\",\",\" \\\"display_name\\\": \\\"Local Filename\\\",\",\" \\\"type\\\": \\\"String\\\",\",\" \\\"direction\\\": \\\"input\\\",\",\" \\\"required\\\": true,\",\" \\\"description\\\": \\\"The local file in which to download the S3 resource.\\\"\",\" }\",\" ]\",\"}\"],\"config\":{\"style\":{\"control\":\"none\"}}}]}"},"auto-problem-fixing-tests":{"code.3.after-main.spec.ts":"{\"suiteName\":\"Verify tokens after main get removed on formatting\",\"fileName\":\"code.3.after-main.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = $ ; comment\",\" 5\",\"end\",\"\",\"; bad\",\" worse = not 42\"]}]}","code.14.colon-in-func.spec.ts":"{\"suiteName\":\"Verify function to array for\",\"fileName\":\"code.14.colon-in-func.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"coefs = coefs_spc(*, 0 : junk - 1)\",\"end\"]}]}","code.15.colon-in-func-method.spec.ts":"{\"suiteName\":\"Verify function method to array for\",\"fileName\":\"code.15.colon-in-func-method.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = objOrStruct.var(0 : -1)\",\"end\"]}]}","code.20.return-vals-pro.spec.ts":"{\"suiteName\":\"Verify we remove excess args\",\"fileName\":\"code.20.return-vals-pro.spec.ts\",\"tests\":[{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro myname\",\" compile_opt idl2\",\"\",\" ; comment\",\" return, 42\",\"\",\"end\"]},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\" return, 42\",\"end\"]},{\"name\":\"for main level programs\",\"code\":[\"; main\",\"compile_opt idl2\",\"\",\"return, 42\",\"\",\"end\"]}]}","code.21.return-vals-func.spec.ts":"{\"suiteName\":\"Verify we remove excess args\",\"fileName\":\"code.21.return-vals-func.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myname\",\" compile_opt idl2\",\"\",\" ;comment\",\" ; comment\",\" return, !null, $\",\" 2, myfunc()\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\" return, !null, 2\",\"end\"]}]}","code.31.return-missing.spec.ts":"{\"suiteName\":\"Verify we add missing return statement\",\"fileName\":\"code.31.return-missing.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myname\",\" compile_opt idl2\",\"\",\" ;comment\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myname\",\" compile_opt idl2\",\"\",\" a = 5\",\"end\"]}]}","code.35.after-continuation.spec.ts":"{\"suiteName\":\"Verify tokens after line continuation get removed on formatting\",\"fileName\":\"code.35.after-continuation.spec.ts\",\"tests\":[{\"name\":\"basic case\",\"code\":[\"compile_opt idl2\",\"a = $ 5 * bad ; comment\",\" 5\",\"end\"]}]}","code.38.no-comp-opt.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myfunc\",\"\",\" return, 1\",\"end\"]},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myfunc\",\"\",\" return, 1\",\"end\"]},{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro mypro\",\"\",\"end\"]},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::mypro\",\"\",\"end\"]},{\"name\":\"for main case 1\",\"code\":[\"; comment\",\"\",\"end\"]},{\"name\":\"for main case 2\",\"code\":[\"a = 5\",\"\",\"end\"]},{\"name\":\"for main case 3\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"]},{\"name\":\"for main case 4\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"]},{\"name\":\"with args and keywords\",\"code\":[\"function myfunc,$\",\"a, b, $\",\"kw2 = kw2\",\"\",\" return, 1\",\"end\"]}]}","code.38.no-comp-opt.edge-cases.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.edge-cases.spec.ts\",\"tests\":[{\"name\":\"for functions without names\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function\",\"\",\"end\"]},{\"name\":\"for procedures without names\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"pro\",\"\",\"end\"]}]}","code.38.no-comp-opt.notebooks.spec.ts":"{\"suiteName\":\"Verify we add compile opt idl2\",\"fileName\":\"code.38.no-comp-opt.notebooks.spec.ts\",\"tests\":[{\"name\":\"for functions\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myfunc\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for function methods\",\"code\":[\";+\",\"; :Returns:\",\"; any\",\";\",\";-\",\"function myclass::myfunc\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for procedures\",\"code\":[\";+\",\";-\",\"pro mypro\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for procedure methods\",\"code\":[\";+\",\";-\",\"pro myclass::mypro\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 1\",\"code\":[\"; comment\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 2\",\"code\":[\"a = 5\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 3\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"for main case 4\",\"code\":[\"\",\"; comment\",\"\",\"a = 42\",\"\",\"end\"],\"parseConfig\":{\"isNotebook\":true}},{\"name\":\"with args and keywords\",\"code\":[\"function myfunc,$\",\"a, b, $\",\"kw2 = kw2\",\"\",\" return, 1\",\"end\"],\"parseConfig\":{\"isNotebook\":true}}]}","code.76.init-method-pro.spec.ts":"{\"suiteName\":\"Verify we change procedure init methods to function methods\",\"fileName\":\"code.76.init-method-pro.spec.ts\",\"tests\":[{\"name\":\"without return statements\",\"code\":[\"PRO myclass2::init\",\" compile_opt idl2\",\"\",\"end\",\"\",\"\",\"pro myclass::init\",\" compile_opt idl2\",\"\",\" ; comment\",\"end\"]},{\"name\":\"with return statements\",\"code\":[\"pro myclass::init\",\" compile_opt idl2\",\"\",\" ; comment\",\" return, !null\",\"end\",\"\",\"PRO myclass2::init\",\" compile_opt idl2\",\" return\",\"end\",\"\",\"\",\"pro myclass::init\",\" compile_opt idl2\",\" return\",\"end\"]}]}","code.105.illegal-var-index.spec.ts":"{\"suiteName\":\"Verify we correctly fix brackets for indexing\",\"fileName\":\"code.105.illegal-var-index.spec.ts\",\"tests\":[{\"name\":\"for simple case\",\"code\":[\";+ my var\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt strictarr\",\"code\":[\"compile_opt strictarr\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl2\",\"code\":[\"compile_opt idl2\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]},{\"name\":\"do no change when compile opt idl3\",\"code\":[\"compile_opt idl3\",\"a = 5\",\"\",\"!null = a()\",\"\",\"end\"]}]}"},"auto-global-problem-tests":{"duplicates.spec.ts":"{\"suiteName\":\"Correctly identify duplicate problems\",\"fileName\":\"duplicates.spec.ts\",\"tests\":[{\"name\":\"while adding and removing files\",\"workspace\":\"idl/test/global-problems\",\"actions\":[{\"action\":\"add\",\"file\":\"file1.pro\"},{\"action\":\"add\",\"file\":\"file2.pro\"},{\"action\":\"add\",\"file\":\"file3.pro\"},{\"action\":\"remove\",\"file\":\"file1.pro\"},{\"action\":\"remove\",\"file\":\"file2.pro\"}]}]}","no-duplicate-main.spec.ts":"{\"suiteName\":\"Correctly ignore main level programs as duplicates\",\"fileName\":\"no-duplicate-main.spec.ts\",\"tests\":[{\"name\":\"with multiple files in the same workspace\",\"workspace\":\"idl/test/global-main-problems\",\"actions\":[{\"action\":\"add\",\"file\":\"file1.pro\"},{\"action\":\"add\",\"file\":\"file2.pro\"}]}]}"},"auto-config-resolution-tests":{"resolution.spec.ts":"{\"suiteName\":\"Correctly identify parses and returns config files\",\"fileName\":\"resolution.spec.ts\",\"tests\":[{\"name\":\"based on their folders\",\"workspace\":\"idl/test/configs\",\"actions\":[{\"action\":\"add\",\"file\":\"subdir1/idl.json\"},{\"action\":\"add\",\"file\":\"subdir2/idl.json\"},{\"action\":\"add\",\"file\":\"subdir3/idl.json\"},{\"action\":\"get\",\"file\":\"subdir1/idl.pro\"},{\"action\":\"get\",\"file\":\"subdir2/idl.pro\"},{\"action\":\"get\",\"file\":\"subdir3/idl.pro\"}]}]}","bad-file.spec.ts":"{\"suiteName\":\"Parse invalid config files\",\"fileName\":\"bad-file.spec.ts\",\"tests\":[{\"name\":\"and load default config for bad file\",\"workspace\":\"idl/test/configs\",\"actions\":[{\"action\":\"add\",\"file\":\"subdir4/idl.json\"},{\"action\":\"get\",\"file\":\"subdir4/idl.pro\"}]}]}"},"auto-task-generation-tests":{"envi.basic.spec.ts":"{\"suiteName\":\"Make basic ENVI task\",\"fileName\":\"envi.basic.spec.ts\",\"tests\":[{\"name\":\"from PRO\",\"file\":\"idl/test/task-generation/envitasktest.pro\",\"type\":\"envi\"}]}","envi.failure1.spec.ts":"{\"suiteName\":\"Don't make ENVI Task\",\"fileName\":\"envi.failure1.spec.ts\",\"tests\":[{\"name\":\"because of missing PRO definition\",\"file\":\"idl/test/task-generation/empty_envi.pro\",\"type\":\"envi\"}]}","idl.basic.spec.ts":"{\"suiteName\":\"Make basic IDL task\",\"fileName\":\"idl.basic.spec.ts\",\"tests\":[{\"name\":\"from PRO\",\"file\":\"idl/test/task-generation/idltasktest.pro\",\"type\":\"idl\"}]}","idl.failure1.spec.ts":"{\"suiteName\":\"Don't make IDL Task\",\"fileName\":\"idl.failure1.spec.ts\",\"tests\":[{\"name\":\"because of missing PRO definition\",\"file\":\"idl/test/task-generation/empty_idl.pro\",\"type\":\"idl\"}]}"}} \ No newline at end of file diff --git a/apps/test-tokenizer/src/test-maker/tests/auto-assembler-tests.interface.ts b/apps/test-tokenizer/src/test-maker/tests/auto-assembler-tests.interface.ts index 06614da33..0be100501 100644 --- a/apps/test-tokenizer/src/test-maker/tests/auto-assembler-tests.interface.ts +++ b/apps/test-tokenizer/src/test-maker/tests/auto-assembler-tests.interface.ts @@ -169,6 +169,73 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, ], }, + { + suiteName: `Verify auto-doc when below`, + fileName: `auto-doc.below.spec.ts`, + tests: [ + { + name: `does not add docs above`, + code: [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ], + config: { + autoDoc: true, + }, + }, + { + name: `updates comment blocks right`, + code: [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ``, + `; main level program`, + `compile_opt idl2`, + ``, + `end`, + ], + config: { + autoDoc: true, + }, + }, + ], + }, { suiteName: `Verify formatting`, fileName: `auto-doc.example-code.spec.ts`, @@ -1486,7 +1553,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ fileName: `style.internal-routines.spec.ts`, tests: [ { - name: `using modern format`, + name: `match`, code: [ `pro mypro`, ` compile_opt idl2`, @@ -1518,7 +1585,135 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, }, { - name: `using no format`, + name: `pascal`, + code: [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.PASCAL, + }, + }, + }, + { + name: `camel`, + code: [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.CAMEL, + }, + }, + }, + { + name: `upper`, + code: [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.UPPER, + }, + }, + }, + { + name: `lower`, + code: [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.LOWER, + }, + }, + }, + { + name: `none`, code: [ `pro mypro`, ` compile_opt idl2`, @@ -1556,7 +1751,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ fileName: `style.user-routines.spec.ts`, tests: [ { - name: `using modern format`, + name: `match`, code: [ `pro test_things`, ` compile_opt idl2`, @@ -1581,7 +1776,107 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, }, { - name: `using no format`, + name: `pascal`, + code: [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.PASCAL, + }, + }, + }, + { + name: `camel`, + code: [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.CAMEL, + }, + }, + }, + { + name: `upper`, + code: [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.UPPER, + }, + }, + }, + { + name: `lower`, + code: [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routines: STYLE_FLAG_LOOKUP.LOWER, + }, + }, + }, + { + name: `none`, code: [ `pro test_things`, ` compile_opt idl2`, @@ -1783,7 +2078,135 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ config: { formatter: 'fiddle', style: { - routines: STYLE_FLAG_LOOKUP.MATCH, + routineMethods: STYLE_FLAG_LOOKUP.MATCH, + }, + }, + }, + { + name: `pascal`, + code: [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routineMethods: STYLE_FLAG_LOOKUP.PASCAL, + }, + }, + }, + { + name: `camel`, + code: [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routineMethods: STYLE_FLAG_LOOKUP.CAMEL, + }, + }, + }, + { + name: `upper`, + code: [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routineMethods: STYLE_FLAG_LOOKUP.UPPER, + }, + }, + }, + { + name: `lower`, + code: [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + routineMethods: STYLE_FLAG_LOOKUP.LOWER, }, }, }, @@ -1815,7 +2238,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ config: { formatter: 'fiddle', style: { - routines: STYLE_FLAG_LOOKUP.NONE, + routineMethods: STYLE_FLAG_LOOKUP.NONE, }, }, }, @@ -2045,7 +2468,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ fileName: `style.properties.spec.ts`, tests: [ { - name: `using modern format`, + name: `match`, code: [ `compile_opt idl2, hidden`, ``, @@ -2063,7 +2486,43 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, }, { - name: `using modern format`, + name: `pascal`, + code: [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.myPROP`, + `b = {SomeThing:'cool'}`, + `!null = b.SomeThing`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + properties: STYLE_FLAG_LOOKUP.PASCAL, + }, + }, + }, + { + name: `camel`, + code: [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.myPROP`, + `b = {SomeThing:'cool'}`, + `!null = b.SomeThing`, + ``, + `end`, + ], + config: { + formatter: 'fiddle', + style: { + properties: STYLE_FLAG_LOOKUP.CAMEL, + }, + }, + }, + { + name: `lower`, code: [ `compile_opt idl2, hidden`, ``, @@ -2081,7 +2540,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, }, { - name: `using dated format`, + name: `upper`, code: [ `compile_opt idl2, hidden`, ``, @@ -2099,7 +2558,7 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, }, { - name: `using no format`, + name: `none`, code: [ `compile_opt idl2, hidden`, ``, @@ -3168,6 +3627,114 @@ export const AUTO_ASSEMBLER_TESTS: IAutoAssemblerTest[] = [ }, ], }, + { + suiteName: `Verify structure names`, + fileName: `style.structure-names.1.spec.ts`, + tests: [ + { + name: `match`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.MATCH, + }, + }, + }, + { + name: `pascal`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.PASCAL, + }, + }, + }, + { + name: `camel`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.CAMEL, + }, + }, + }, + { + name: `upper`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.UPPER, + }, + }, + }, + { + name: `lower`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.LOWER, + }, + }, + }, + { + name: `none`, + code: [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ], + config: { + formatter: 'fiddle', + style: { + structureNames: STYLE_FLAG_LOOKUP.NONE, + }, + }, + }, + ], + }, { suiteName: `Verify auto-fix/format of template escape characters`, fileName: `style.template-escape.spec.ts`, diff --git a/apps/test-tokenizer/src/test-maker/tests/auto-auto-complete-tests.interface.ts b/apps/test-tokenizer/src/test-maker/tests/auto-auto-complete-tests.interface.ts index 0a86861d2..74a517f01 100644 --- a/apps/test-tokenizer/src/test-maker/tests/auto-auto-complete-tests.interface.ts +++ b/apps/test-tokenizer/src/test-maker/tests/auto-auto-complete-tests.interface.ts @@ -166,6 +166,14 @@ export const AUTO_AUTO_COMPLETE_TESTS: IAutoCompleteTests[] = [ line: 21, character: 47, }, + { + line: 24, + character: 27, + }, + { + line: 24, + character: 28, + }, ], }, ], diff --git a/apps/test-tokenizer/src/test-maker/tests/auto-local-global-scope-compile-and-types-tests.interface.ts b/apps/test-tokenizer/src/test-maker/tests/auto-local-global-scope-compile-and-types-tests.interface.ts index 58b020a9e..2d983f8dc 100644 --- a/apps/test-tokenizer/src/test-maker/tests/auto-local-global-scope-compile-and-types-tests.interface.ts +++ b/apps/test-tokenizer/src/test-maker/tests/auto-local-global-scope-compile-and-types-tests.interface.ts @@ -220,6 +220,63 @@ export const AUTO_LOCAL_GLOBAL_SCOPE_COMPILE_AND_TYPES_TESTS: IAutoLocalGlobalSc }, ], }, + { + suiteName: `Extract docs below routines`, + fileName: `docs-below-1.spec.ts`, + tests: [ + { + name: 'for procedure', + code: [ + `pro parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;- `, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ], + }, + { + name: 'for function', + code: [ + `function parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;- `, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `return, 1`, + `end`, + ], + }, + ], + }, { suiteName: `Correctly extract docs for`, fileName: `document-vars.spec.ts`, diff --git a/apps/test-tokenizer/src/test-maker/tests/auto-syntax-post-processor-tests.interface.ts b/apps/test-tokenizer/src/test-maker/tests/auto-syntax-post-processor-tests.interface.ts index 3aaf03c8f..9b56213c5 100644 --- a/apps/test-tokenizer/src/test-maker/tests/auto-syntax-post-processor-tests.interface.ts +++ b/apps/test-tokenizer/src/test-maker/tests/auto-syntax-post-processor-tests.interface.ts @@ -416,14 +416,25 @@ export const AUTO_POST_PROCESSOR_TESTS: IAutoTest[] = [ ], }, { - name: `ignore only comments`, + name: `ignore only comments 1`, code: [ `function myfunc`, ` compile_opt idl2`, ` return,1`, `end`, ``, - `compile_opt idl2`, + `; main level`, + `; another comment`, + ], + }, + { + name: `ignore only comments 2`, + code: [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, `; main level`, `; another comment`, ], diff --git a/apps/test-tokenizer/src/test-maker/tests/auto-syntax-validator-tests.interface.ts b/apps/test-tokenizer/src/test-maker/tests/auto-syntax-validator-tests.interface.ts index 88a610074..aaf6826e4 100644 --- a/apps/test-tokenizer/src/test-maker/tests/auto-syntax-validator-tests.interface.ts +++ b/apps/test-tokenizer/src/test-maker/tests/auto-syntax-validator-tests.interface.ts @@ -741,6 +741,18 @@ export const AUTO_SYNTAX_TESTS: IAutoSyntaxValidatorTest[] = [ `a = 17`, ], }, + { + name: `not problem`, + code: [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ], + }, ], }, { @@ -812,6 +824,18 @@ export const AUTO_SYNTAX_TESTS: IAutoSyntaxValidatorTest[] = [ name: `also problems`, code: [``, `end`], }, + { + name: `not problem`, + code: [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ], + }, ], }, { @@ -907,6 +931,18 @@ export const AUTO_SYNTAX_TESTS: IAutoSyntaxValidatorTest[] = [ name: `bad main`, code: [`; main level program`, ` a = 5`, `end`], }, + { + name: `ok main`, + code: [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ], + }, ], }, { @@ -4073,4 +4109,92 @@ export const AUTO_SYNTAX_TESTS: IAutoSyntaxValidatorTest[] = [ }, ], }, + { + suiteName: `Properly reports problems for docs`, + fileName: `docs-problems-when-docs-below.spec.ts`, + tests: [ + { + name: `when blocks are inside procedures`, + code: [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ], + }, + { + name: `when blocks are inside functions`, + code: [ + `function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `rturn, 1`, + `end`, + ], + }, + { + name: `when blocks are inside functions`, + code: [ + `;+`, + `; No problems for me!!! Im care free!!!`, + `;-`, + ``, + ``, + `function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `rturn, 1`, + `end`, + ], + }, + ], + }, ]; diff --git a/apps/tmlang-maker/project.json b/apps/tmlang-maker/project.json index c07d5ea87..c33373add 100644 --- a/apps/tmlang-maker/project.json +++ b/apps/tmlang-maker/project.json @@ -48,7 +48,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/tmlang-maker/**/*.ts"] diff --git a/apps/vscode-e2e-runner/project.json b/apps/vscode-e2e-runner/project.json index 65750bbb2..f15002cab 100644 --- a/apps/vscode-e2e-runner/project.json +++ b/apps/vscode-e2e-runner/project.json @@ -41,7 +41,7 @@ } }, "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["apps/vscode-e2e-runner/**/*.ts"] diff --git a/compliance/3rdparty.json b/compliance/3rdparty.json index 3cb9cc521..5ff9df2c3 100644 --- a/compliance/3rdparty.json +++ b/compliance/3rdparty.json @@ -51,6 +51,10 @@ "notes": "Required library for Angular front end applications", "encryption": "no" }, + "@angular/elements": { + "notes": "Required library for Angular front end applications", + "encryption": "no" + }, "@angular/forms": { "notes": "Required library for Angular front end applications", "encryption": "no" @@ -75,6 +79,26 @@ "notes": "Required library for Angular front end applications", "encryption": "no" }, + "@deck.gl/core": { + "notes": "For development, ", + "encryption": "no" + }, + "@deck.gl/geo-layers": { + "notes": "For development, ", + "encryption": "no" + }, + "@deck.gl/layers": { + "notes": "For development, ", + "encryption": "no" + }, + "@deck.gl/mesh-layers": { + "notes": "For development, ", + "encryption": "no" + }, + "@mapbox/geojson-extent": { + "notes": "For development, ", + "encryption": "no" + }, "@mdi/js": { "notes": "Additional Material Design Icons for web applications. See https://github.com/Templarian/MaterialDesign", "encryption": "no" @@ -99,6 +123,10 @@ "notes": "For development, plugins/libraries for monorepo management using Nx", "encryption": "no" }, + "@nx/eslint": { + "notes": "For development, plugins/libraries for monorepo management using Nx", + "encryption": "no" + }, "@nx/eslint-plugin": { "notes": "For development, plugins/libraries for monorepo management using Nx", "encryption": "no" @@ -111,12 +139,12 @@ "notes": "For development, ", "encryption": "no" }, - "@nx/linter": { + "@nx/node": { "notes": "For development, plugins/libraries for monorepo management using Nx", "encryption": "no" }, - "@nx/node": { - "notes": "For development, plugins/libraries for monorepo management using Nx", + "@nx/web": { + "notes": "For development, ", "encryption": "no" }, "@nx/workspace": { @@ -131,6 +159,10 @@ "notes": "For development, type definitions for jest library", "encryption": "no" }, + "@types/mapbox__geojson-extent": { + "notes": "For development, type definitions for mapbox__geojson-extent library", + "encryption": "no" + }, "@types/minilog": { "notes": "For development, type definitions for minilog library", "encryption": "no" @@ -151,6 +183,10 @@ "notes": "For development, type definitions for vscode library", "encryption": "no" }, + "@types/vscode-notebook-renderer": { + "notes": "For development, type definitions for vscode-notebook-renderer library", + "encryption": "no" + }, "@types/web": { "notes": "For development, type definitions for web library", "encryption": "no" @@ -183,6 +219,10 @@ "notes": "For development, ", "encryption": "no" }, + "@webcomponents/webcomponentsjs": { + "notes": "For development, ", + "encryption": "no" + }, "ajv": { "notes": "", "encryption": "no" @@ -203,10 +243,22 @@ "notes": "For development and not included in the built extension, HTTP/HTTPS communication", "encryption": "yes" }, + "case-anything": { + "notes": "", + "encryption": "no" + }, "chalk": { "notes": "", "encryption": "no" }, + "chart.js": { + "notes": "For development, ", + "encryption": "no" + }, + "compare-versions": { + "notes": "", + "encryption": "no" + }, "cypress": { "notes": "For development, test running library", "encryption": "no" diff --git a/compliance/3rdpartylicenses.md b/compliance/3rdpartylicenses.md index c4eea9275..d1b6a5f98 100644 --- a/compliance/3rdpartylicenses.md +++ b/compliance/3rdpartylicenses.md @@ -2,7 +2,7 @@ This file contains third party libraries/dependencies and their copyright and license information. -## @angular-devkit/build-angular - 16.0.2 +## @angular-devkit/build-angular - 16.2.3 Copyright (c) 2017 Google, Inc. @@ -31,7 +31,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular-devkit/core - 16.0.2 +## @angular-devkit/core - 16.2.3 Copyright (c) 2017 Google, Inc. @@ -60,7 +60,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular-devkit/schematics - 16.0.2 +## @angular-devkit/schematics - 16.2.3 Copyright (c) 2017 Google, Inc. @@ -89,7 +89,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular-eslint/eslint-plugin - 16.0.2 +## @angular-eslint/eslint-plugin - 16.0.3 Copyright (c) 2020 James Henry @@ -118,7 +118,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular-eslint/eslint-plugin-template - 16.0.2 +## @angular-eslint/eslint-plugin-template - 16.0.3 Copyright (c) 2020 James Henry @@ -147,7 +147,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular-eslint/template-parser - 16.0.2 +## @angular-eslint/template-parser - 16.0.3 Copyright (c) 2020 James Henry @@ -176,7 +176,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular/animations - 16.0.3 +## @angular/animations - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -206,7 +206,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/cdk - 16.0.1 +## @angular/cdk - 16.2.5 Copyright (c) 2023 Google LLC. @@ -235,7 +235,7 @@ THE SOFTWARE. ------------------ End License ------------------ -## @angular/cli - 16.0.2 +## @angular/cli - 16.2.3 Copyright (c) 2017 Google, Inc. @@ -264,7 +264,7 @@ SOFTWARE. ------------------ End License ------------------ -## @angular/common - 16.0.3 +## @angular/common - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -294,7 +294,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/compiler - 16.0.3 +## @angular/compiler - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -324,7 +324,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/compiler-cli - 16.0.3 +## @angular/compiler-cli - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -354,7 +354,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/core - 16.0.3 +## @angular/core - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -384,7 +384,34 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/forms - 16.0.3 +## @angular/elements - 16.2.6 + +Copyright (c) 2010-2022 Google LLC. https://angular.io/license + +----------------- License: "MIT" ---------------- +Source: https://opensource.org/licenses/MIT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------ End License ------------------ + +## @angular/forms - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -414,7 +441,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/language-service - 16.0.3 +## @angular/language-service - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -444,7 +471,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/material - 16.0.1 +## @angular/material - 16.2.5 Copyright (c) 2023 Google LLC. @@ -473,7 +500,7 @@ THE SOFTWARE. ------------------ End License ------------------ -## @angular/platform-browser - 16.0.3 +## @angular/platform-browser - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -503,7 +530,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/platform-browser-dynamic - 16.0.3 +## @angular/platform-browser-dynamic - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -533,7 +560,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @angular/router - 16.0.3 +## @angular/router - 16.2.6 Copyright (c) 2010-2022 Google LLC. https://angular.io/license @@ -563,40 +590,66 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @mdi/js - 7.2.96 +## @deck.gl/core - 8.9.32 -Copyright (c) @mdi/js +Copyright Vis.gl contributors. ------------------ License: "Apache-2.0" ---------------- -Pictogrammers Free License --------------------------- +----------------- License: "MIT" ---------------- +Copyright Vis.gl contributors. -This icon collection is released as free, open source, and GPL friendly by -the [Pictogrammers](http://pictogrammers.com/) icon group. You may use it -for commercial projects, open source projects, or anything really. +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: -# Icons: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) -Some of the icons are redistributed under the Apache 2.0 license. All other -icons are either redistributed under their respective licenses or are -distributed under the Apache 2.0 license. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. -# Fonts: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) -All web and desktop fonts are distributed under the Apache 2.0 license. Web -and desktop fonts contain some icons that are redistributed under the Apache -2.0 license. All other icons are either redistributed under their respective -licenses or are distributed under the Apache 2.0 license. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +------------------ End License ------------------ + +## @deck.gl/geo-layers - 8.9.32 -# Code: MIT (https://opensource.org/licenses/MIT) -The MIT license applies to all non-font and non-icon files. +Copyright Vis.gl contributors. + +----------------- License: "MIT" ---------------- +Copyright Vis.gl contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ------------------ End License ------------------ -## @ngbracket/ngx-layout - 16.0.0 +## @deck.gl/layers - 8.9.32 -Copyright (c) @ngbracket/ngx-layout +Copyright Vis.gl contributors. ----------------- License: "MIT" ---------------- -Source: https://opensource.org/licenses/MIT +Copyright Vis.gl contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -605,20 +658,126 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +------------------ End License ------------------ + +## @deck.gl/mesh-layers - 8.9.32 + +Copyright Vis.gl contributors. + +----------------- License: "MIT" ---------------- +Copyright Vis.gl contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ------------------ End License ------------------ -## @ngneat/transloco - 4.2.7 +## @mapbox/geojson-extent - 1.0.1 + +Copyright (c) 2017, Mapbox + +----------------- License: "ISC" ---------------- + +ISC License + +Copyright (c) 2017, Mapbox + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +------------------ End License ------------------ + +## @mdi/js - 7.3.67 + +Copyright (c) @mdi/js + +----------------- License: "Apache-2.0" ---------------- +Pictogrammers Free License +-------------------------- + +This icon collection is released as free, open source, and GPL friendly by +the [Pictogrammers](http://pictogrammers.com/) icon group. You may use it +for commercial projects, open source projects, or anything really. + +# Icons: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) +Some of the icons are redistributed under the Apache 2.0 license. All other +icons are either redistributed under their respective licenses or are +distributed under the Apache 2.0 license. + +# Fonts: Apache 2.0 (https://www.apache.org/licenses/LICENSE-2.0) +All web and desktop fonts are distributed under the Apache 2.0 license. Web +and desktop fonts contain some icons that are redistributed under the Apache +2.0 license. All other icons are either redistributed under their respective +licenses or are distributed under the Apache 2.0 license. + +# Code: MIT (https://opensource.org/licenses/MIT) +The MIT license applies to all non-font and non-icon files. + +------------------ End License ------------------ + +## @ngbracket/ngx-layout - 16.1.3 + +Copyright (c) @ngbracket/ngx-layout + +----------------- License: "MIT" ---------------- +Source: https://opensource.org/licenses/MIT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------ End License ------------------ + +## @ngneat/transloco - 4.3.0 Copyright (c) 2019-2021 Netanel Basal, Shahar Kazaz, and Itay Oded. @@ -648,7 +807,37 @@ THE SOFTWARE. ------------------ End License ------------------ -## @nx/angular - 16.3.0 +## @nx/angular - 17.0.2 + +Copyright (c) 2017-2023 Narwhal Technologies Inc. + +----------------- License: "MIT" ---------------- +(The MIT License) + +Copyright (c) 2017-2023 Narwhal Technologies Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +------------------ End License ------------------ + +## @nx/cypress - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -678,7 +867,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/cypress - 16.3.0 +## @nx/esbuild - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -708,7 +897,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/esbuild - 16.3.0 +## @nx/eslint - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -738,7 +927,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/eslint-plugin - 16.3.0 +## @nx/eslint-plugin - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -768,7 +957,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/jest - 16.3.0 +## @nx/jest - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -798,7 +987,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/js - 16.3.0 +## @nx/js - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -828,7 +1017,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/linter - 16.3.0 +## @nx/node - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -858,7 +1047,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/node - 16.3.0 +## @nx/web - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -888,7 +1077,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @nx/workspace - 16.3.0 +## @nx/workspace - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -918,7 +1107,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @schematics/angular - 16.0.2 +## @schematics/angular - 16.2.3 Copyright (c) 2017 Google, Inc. @@ -976,34 +1165,65 @@ Copyright (c) Microsoft Corporation. ------------------ End License ------------------ -## @types/minilog - 2.0.29 +## @types/mapbox__geojson-extent - 1.0.2 + +Copyright (c) Microsoft Corporation. + +----------------- License: "MIT" ---------------- + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + +------------------ End License ------------------ + +## @types/minilog - 2.0.31 Copyright (c) @types/minilog ----------------- License: "MIT" ---------------- -Source: https://opensource.org/licenses/MIT + MIT License -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + Copyright (c) Microsoft Corporation. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE ------------------ End License ------------------ -## @types/node - 20.2.3 +## @types/node - 20.6.3 Copyright (c) Microsoft Corporation. @@ -1032,14 +1252,14 @@ Copyright (c) Microsoft Corporation. ------------------ End License ------------------ -## @types/plist - 3.0.2 +## @types/plist - 3.0.4 -Copyright (c) Microsoft Corporation. All rights reserved. +Copyright (c) Microsoft Corporation. ----------------- License: "MIT" ---------------- MIT License - Copyright (c) Microsoft Corporation. All rights reserved. + Copyright (c) Microsoft Corporation. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1061,7 +1281,7 @@ Copyright (c) Microsoft Corporation. All rights reserved. ------------------ End License ------------------ -## @types/progress - 2.0.5 +## @types/progress - 2.0.6 Copyright (c) Microsoft Corporation. @@ -1090,7 +1310,7 @@ Copyright (c) Microsoft Corporation. ------------------ End License ------------------ -## @types/vscode - 1.78.0 +## @types/vscode - 1.82.0 Copyright (c) Microsoft Corporation. @@ -1119,7 +1339,36 @@ Copyright (c) Microsoft Corporation. ------------------ End License ------------------ -## @types/web - 0.0.99 +## @types/vscode-notebook-renderer - 1.72.0 + +Copyright (c) Microsoft Corporation. + +----------------- License: "MIT" ---------------- + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE + +------------------ End License ------------------ + +## @types/web - 0.0.119 Copyright (c) @types/web @@ -1182,7 +1431,7 @@ END OF TERMS AND CONDITIONS ------------------ End License ------------------ -## @typescript-eslint/eslint-plugin - 5.58.0 +## @typescript-eslint/eslint-plugin - 5.60.1 Copyright (c) 2019 typescript-eslint and other contributors @@ -1211,7 +1460,7 @@ SOFTWARE. ------------------ End License ------------------ -## @typescript-eslint/parser - 5.58.0 +## @typescript-eslint/parser - 5.60.1 Copyright JS Foundation and other contributors, https://js.foundation @@ -1241,45 +1490,45 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ------------------ End License ------------------ -## @vscode/debugadapter - 1.59.0 +## @vscode/debugadapter - 1.64.0 Copyright (c) Microsoft Corporation ----------------- License: "MIT" ---------------- -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @vscode/debugprotocol - 1.59.0 +## @vscode/debugprotocol - 1.64.0 Copyright (c) Microsoft Corporation ----------------- License: "MIT" ---------------- -Copyright (c) Microsoft Corporation - -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +Copyright (c) Microsoft Corporation + +All rights reserved. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## @vscode/test-electron - 2.3.2 +## @vscode/test-electron - 2.3.6 Copyright (c) Microsoft Corporation. All rights reserved. @@ -1307,7 +1556,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE ------------------ End License ------------------ -## @vscode/vsce - 2.19.0 +## @vscode/vsce - 2.21.1 Copyright (c) Microsoft Corporation @@ -1361,6 +1610,32 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ +## @webcomponents/webcomponentsjs - 2.8.0 + +Copyright (c) 2015 The Polymer Authors. All rights reserved. + +----------------- License: "BSD-3-Clause" ---------------- +# License + +Everything in this repo is BSD style license unless otherwise specified. + +Copyright (c) 2015 The Polymer Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. +* Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +------------------ End License ------------------ + ## ajv - 8.12.0 Copyright (c) 2015-2021 Evgeny Poberezkin @@ -1391,7 +1666,7 @@ SOFTWARE. ------------------ End License ------------------ -## angular-material-css-vars - 5.0.2 +## angular-material-css-vars - 5.0.3 Copyright (c) 2019 Johannes Millan @@ -1442,23 +1717,23 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI Copyright (c) await-notify ----------------- License: "ISC" ---------------- -Source: https://opensource.org/licenses/ISC - -Permission to use, copy, modify, and/or distribute this software for any purpose -with or without fee is hereby granted, provided that the above copyright notice -and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. +Source: https://opensource.org/licenses/ISC + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF +THIS SOFTWARE. ------------------ End License ------------------ -## axios - 1.4.0 +## axios - 1.6.0 Copyright (c) 2014-present Matt Zabriskie & Collaborators @@ -1473,6 +1748,35 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ------------------ End License ------------------ +## case-anything - 2.1.13 + +Copyright (c) 2019 Luca Ban - Mesqueeb + +----------------- License: "MIT" ---------------- +MIT License + +Copyright (c) 2019 Luca Ban - Mesqueeb + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------ End License ------------------ + ## chalk - 4.1.2 Copyright (c) Sindre Sorhus (sindresorhus.com) @@ -1490,7 +1794,53 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ------------------ End License ------------------ -## cypress - 12.11.0 +## chart.js - 4.4.0 + +Copyright (c) 2014-2022 Chart.js Contributors + +----------------- License: "MIT" ---------------- +The MIT License (MIT) + +Copyright (c) 2014-2022 Chart.js Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +------------------ End License ------------------ + +## compare-versions - 6.1.0 + +Copyright (c) 2015-2021 Ole Michelsen + +----------------- License: "MIT" ---------------- +The MIT License (MIT) + +Copyright (c) 2015-2021 Ole Michelsen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------ End License ------------------ + +## cypress - 13.2.0 Copyright (c) 2022 Cypress.io @@ -1547,7 +1897,7 @@ THE SOFTWARE. ------------------ End License ------------------ -## esbuild - 0.17.17 +## esbuild - 0.19.2 Copyright (c) 2020 Evan Wallace @@ -1576,7 +1926,7 @@ SOFTWARE. ------------------ End License ------------------ -## eslint - 8.15.0 +## eslint - 8.46.0 Copyright OpenJS Foundation and other contributors, @@ -1603,14 +1953,14 @@ THE SOFTWARE. ------------------ End License ------------------ -## eslint-config-prettier - 8.1.0 +## eslint-config-prettier - 9.0.0 -Copyright (c) 2017, 2018, 2019, 2020, 2021 Simon Lydell and contributors +Copyright (c) 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell and contributors ----------------- License: "MIT" ---------------- The MIT License (MIT) -Copyright (c) 2017, 2018, 2019, 2020, 2021 Simon Lydell and contributors +Copyright (c) 2017, 2018, 2019, 2020, 2021, 2022, 2023 Simon Lydell and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1632,7 +1982,7 @@ THE SOFTWARE. ------------------ End License ------------------ -## eslint-plugin-cypress - 2.13.3 +## eslint-plugin-cypress - 2.13.4 Copyright (c) 2019 Cypress.io @@ -1661,14 +2011,14 @@ SOFTWARE. ------------------ End License ------------------ -## eslint-plugin-simple-import-sort - 7.0.0 +## eslint-plugin-simple-import-sort - 10.0.0 -Copyright (c) 2018, 2019, 2020 Simon Lydell +Copyright (c) 2018, 2019, 2020, 2022, 2023 Simon Lydell ----------------- License: "MIT" ---------------- MIT License -Copyright (c) 2018, 2019, 2020 Simon Lydell +Copyright (c) 2018, 2019, 2020, 2022, 2023 Simon Lydell Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal @@ -1695,29 +2045,29 @@ SOFTWARE. Copyright (c) eslint-plugin-unused-imports ----------------- License: "MIT" ---------------- -Source: https://opensource.org/licenses/MIT - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Source: https://opensource.org/licenses/MIT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ------------------ End License ------------------ -## expect - 29.5.0 +## expect - 29.7.0 Copyright (c) Meta Platforms, Inc. and affiliates. @@ -1804,7 +2154,7 @@ SOFTWARE. ------------------ End License ------------------ -## fast-glob - 3.2.12 +## fast-glob - 3.3.1 Copyright (c) Denis Malinochkin @@ -1838,27 +2188,27 @@ SOFTWARE. Copyright (c) 2018 Stephen Kamenar ----------------- License: "MIT" ---------------- -MIT License - -Copyright (c) 2018 Stephen Kamenar - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2018 Stephen Kamenar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ------------------ End License ------------------ @@ -1884,7 +2234,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ------------------ End License ------------------ -## jest - 29.5.0 +## jest - 29.7.0 Copyright (c) Meta Platforms, Inc. and affiliates. @@ -1913,7 +2263,7 @@ SOFTWARE. ------------------ End License ------------------ -## jest-environment-jsdom - 29.5.0 +## jest-environment-jsdom - 29.7.0 Copyright (c) Meta Platforms, Inc. and affiliates. @@ -1942,7 +2292,7 @@ SOFTWARE. ------------------ End License ------------------ -## jest-environment-node - 29.5.0 +## jest-environment-node - 29.7.0 Copyright (c) Meta Platforms, Inc. and affiliates. @@ -2058,7 +2408,7 @@ THE SOFTWARE. ------------------ End License ------------------ -## material-icons - 1.13.7 +## material-icons - 1.13.12 Copyright (c) material-icons @@ -2327,25 +2677,25 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Copyright (c) node-html-markdow ----------------- License: "MIT" ---------------- -Source: https://opensource.org/licenses/MIT - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +Source: https://opensource.org/licenses/MIT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ------------------ End License ------------------ @@ -2379,7 +2729,7 @@ SOFTWARE. ------------------ End License ------------------ -## nx - 16.3.0 +## nx - 17.0.2 Copyright (c) 2017-2023 Narwhal Technologies Inc. @@ -2409,7 +2759,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## plist - 3.0.6 +## plist - 3.1.0 Copyright (c) 2010-2017 Nathan Rajlich @@ -3485,13 +3835,13 @@ License: MIT By: DY Repository: -> The MIT License (MIT) -> Copyright (c) 2015 Dmitry Ivanov -> -> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -> +> The MIT License (MIT) +> Copyright (c) 2015 Dmitry Ivanov +> +> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +> > THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ---------------------------------------- @@ -7756,17 +8106,17 @@ License: 0BSD By: Microsoft Corp. Repository: -> Copyright (c) Microsoft Corporation. -> -> Permission to use, copy, modify, and/or distribute this software for any -> purpose with or without fee is hereby granted. -> -> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -> OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +> Copyright (c) Microsoft Corporation. +> +> Permission to use, copy, modify, and/or distribute this software for any +> purpose with or without fee is hereby granted. +> +> THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +> AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +> INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +> LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +> OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR > PERFORMANCE OF THIS SOFTWARE. ---------------------------------------- @@ -7777,26 +8127,26 @@ License: MIT By: Klaus Meinhardt Repository: -> The MIT License (MIT) -> -> Copyright (c) 2017 Klaus Meinhardt -> -> Permission is hereby granted, free of charge, to any person obtaining a copy -> of this software and associated documentation files (the "Software"), to deal -> in the Software without restriction, including without limitation the rights -> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -> copies of the Software, and to permit persons to whom the Software is -> furnished to do so, subject to the following conditions: -> -> The above copyright notice and this permission notice shall be included in all -> copies or substantial portions of the Software. -> -> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +> The MIT License (MIT) +> +> Copyright (c) 2017 Klaus Meinhardt +> +> Permission is hereby granted, free of charge, to any person obtaining a copy +> of this software and associated documentation files (the "Software"), to deal +> in the Software without restriction, including without limitation the rights +> to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +> copies of the Software, and to permit persons to whom the Software is +> furnished to do so, subject to the following conditions: +> +> The above copyright notice and this permission notice shall be included in all +> copies or substantial portions of the Software. +> +> THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE > SOFTWARE. ---------------------------------------- @@ -7807,60 +8157,60 @@ License: Apache-2.0 By: Microsoft Corp. Repository: -> Apache License -> -> Version 2.0, January 2004 -> -> http://www.apache.org/licenses/ -> -> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -> -> 1. Definitions. -> -> "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. -> -> "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. -> -> "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. -> -> "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. -> -> "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. -> -> "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. -> -> "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). -> -> "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. -> -> "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." -> -> "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. -> -> 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. -> -> 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. -> -> 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: -> -> You must give any other recipients of the Work or Derivative Works a copy of this License; and -> -> You must cause any modified files to carry prominent notices stating that You changed the files; and -> -> You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and -> -> If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. -> -> 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. -> -> 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. -> -> 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. -> -> 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. -> -> 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. -> +> Apache License +> +> Version 2.0, January 2004 +> +> http://www.apache.org/licenses/ +> +> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +> +> 1. Definitions. +> +> "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. +> +> "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. +> +> "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. +> +> "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. +> +> "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. +> +> "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. +> +> "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). +> +> "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. +> +> "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." +> +> "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. +> +> 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. +> +> 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. +> +> 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: +> +> You must give any other recipients of the Work or Derivative Works a copy of this License; and +> +> You must cause any modified files to carry prominent notices stating that You changed the files; and +> +> You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and +> +> If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. +> +> 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. +> +> 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. +> +> 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. +> +> 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. +> +> 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. +> > END OF TERMS AND CONDITIONS ---------------------------------------- @@ -8480,7 +8830,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## rimraf - 5.0.1 +## rimraf - 5.0.5 Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors @@ -8799,89 +9149,89 @@ THE SOFTWARE. ------------------ End License ------------------ -## tslib - 2.5.2 +## tslib - 2.6.2 Copyright (c) Microsoft Corporation. ----------------- License: "0BSD" ---------------- -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ------------------ End License ------------------ -## typescript - 5.0.4 +## typescript - 5.1.6 Copyright (c) Microsoft Corporation. All rights reserved. ----------------- License: "Apache-2.0" ---------------- -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS ------------------ End License ------------------ -## vscode-languageclient - 8.1.0 +## vscode-languageclient - 9.0.1 Copyright (c) Microsoft Corporation @@ -8900,7 +9250,7 @@ THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ------------------ End License ------------------ -## vscode-languageserver - 8.1.0 +## vscode-languageserver - 9.0.1 Copyright (c) Microsoft Corporation @@ -8919,7 +9269,7 @@ THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ------------------ End License ------------------ -## vscode-languageserver-textdocument - 1.0.8 +## vscode-languageserver-textdocument - 1.0.11 Copyright (c) Microsoft Corporation @@ -8938,7 +9288,7 @@ THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI ------------------ End License ------------------ -## vscode-oniguruma - 1.7.0 +## vscode-oniguruma - 2.0.1 Copyright (c) Microsoft Corporation. @@ -8998,7 +9348,7 @@ SOFTWARE. ------------------ End License ------------------ -## vscode-uri - 3.0.7 +## vscode-uri - 3.0.8 Copyright (c) Microsoft @@ -9014,7 +9364,7 @@ The above copyright notice and this permission notice shall be included in all c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------ End License ------------------ -## yaml - 2.3.0 +## yaml - 2.3.3 Copyright Eemeli Aro diff --git a/compliance/IMAGES.md b/compliance/IMAGES.md index 01d43bf77..78f09e9d5 100644 --- a/compliance/IMAGES.md +++ b/compliance/IMAGES.md @@ -47,4 +47,6 @@ Updated as we go, but here is the source for the images that we use in the exten - post.svg https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Apost%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4024 - quick-reference-all.svg - https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Aquick_reference_all%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4024 \ No newline at end of file + https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Aquick_reference_all%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4024 +- transform.svg + https://fonts.google.com/icons?selected=Material%20Symbols%20Outlined%3Atransform%3AFILL%400%3Bwght%40400%3BGRAD%400%3Bopsz%4024 \ No newline at end of file diff --git a/compliance/copyrights.json b/compliance/copyrights.json index 8e600c9ae..0a5a0cf4b 100644 --- a/compliance/copyrights.json +++ b/compliance/copyrights.json @@ -1,4 +1,5 @@ { + "@angular/elements": ["Copyright (c) 2010-2022 Google LLC. https://angular.io/license"], "@mdi/js": ["Copyright (c) @mdi/js"], "@ngbracket/ngx-layout": ["Copyright (c) @ngbracket/ngx-layout"], "@types/minilog": ["Copyright (c) @types/minilog"], diff --git a/extension/docs/README.md b/extension/docs/README.md index 9d2127bcc..9bdaa4955 100644 --- a/extension/docs/README.md +++ b/extension/docs/README.md @@ -8,6 +8,8 @@ This README is the main entry point for the extension documentation for the IDL - [**Disable ENVI Opening Files**](./general/DISABLE_ENVI_FILE_ASSOCIATIONS.md) +- [**Known Issues and Fixes**](./general/KNOWN_ISSUES.md) + ## Content - [**AutoDoc**](./general/AUTO_DOC.md): High-level overview of AutoDoc and the IDL Docs docs style diff --git a/extension/docs/general/FORMATTING.md b/extension/docs/general/FORMATTING.md index 63ac3e882..3f04f649d 100644 --- a/extension/docs/general/FORMATTING.md +++ b/extension/docs/general/FORMATTING.md @@ -19,10 +19,10 @@ If not, or you are having problems, then you'll need to manually update your use "[idl]": { // use the IDL extension as the formatter for PRO code "editor.defaultFormatter": "idl.idl-for-vscode", - // format on save for PRO files, nothing else, this can be at the root level too + // format on save for PRO files, nothing else, this can be at the root level too or language-scoped "editor.formatOnSave": true }, - // format on save for notebooks needs to be enabled at the root level + // OPTIONAL - format on save for notebooks needs to be enabled at the root level "notebook.formatOnSave.enabled": true } ``` @@ -41,14 +41,16 @@ Here's a JSON view of all settings for formatting code in the extension: "quotes": "single", "methods": "dot", "keywords": "lower", - "properties": "lower", + "properties": "camel", "control": "lower", "numbers": "lower", "hex": "lower", "octal": "lower", "binary": "lower", "routines": "match", + "routineMethods": "camel", "systemVariables": "lower", + "structureNames": "pascal", "localVariables": "match" } } @@ -56,24 +58,45 @@ Here's a JSON view of all settings for formatting code in the extension: You can manage settings for formatting code directly from the VSCode Settings UI. All of the "style" options also allow you to specify `"none"` to turn that off. -| Setting | Description | Example | -| ----------------------- | ------------------------------------------------------------------------------- | -------------------------------- | -| `autoFix` | If there is a problem we can fix, when you save/format a file, fix them | | -| `autoDoc` | When we format/save a file, add or update documentation for routines | | -| `styleAndFormat` | When we format/save a file, do we apply our styles and format? | | -| `tabWidth` | Number of spaces per level of indentation, default is 2 | | -| `style.quotes ` | Single or double quotes for strings. Also applies to numbers made using strings | `'this'`, `"that"` | -| `style.methods` | Arrow (->) or dot (.) when invoking class methods | `obj->method`, `obj.method` | -| `style.keywords` | Upper or lower case for keywords | `myfunc(kw1 = 5, /kw2)` | -| `style.properties` | Upper or lower case | `!null = var.prop` | -| `style.control` | Upper or lower case control statements | `for`, `begin`, `pro` | -| `style.numbers` | Accents for numbers to specify type, upper or lower case | `5l`, `42ull` | -| `style.hex` | Upper or lower case for hex numbers | `0xaef` | -| `style.octal` | Upper or lower case for octal numbers | `0o0123` | -| `style.binary` | Upper or lower case for binary numbers | `0b010101` | -| `style.routines` | Do we match the case/style of routine definitions | `ENVIRaster()` vs `enviraster()` | -| `style.systemVariables` | Upper or lower case | `!NULL`, `!x`, `!y` | -| `style.localVariables` | Do we match the case/style of the first instance of a variable | | +| Setting | Description | Example | +| ----------------------- | ------------------------------------------------------------------------------- | ------------------------------------- | +| `autoFix` | If there is a problem we can fix, when you save/format a file, fix them | | +| `autoDoc` | When we format/save a file, add or update documentation for routines | | +| `styleAndFormat` | When we format/save a file, do we apply our styles and format? | | +| `tabWidth` | Number of spaces per level of indentation, default is 2 | | +| `style.quotes ` | Single or double quotes for strings. Also applies to numbers made using strings | `'this'`, `"that"` | +| `style.methods` | Arrow (->) or dot (.) when invoking class methods | `obj->method`, `obj.method` | +| `style.keywords` | Upper or lower case for keywords | `myfunc(kw1 = 5, /kw2)` | +| `style.properties` | Upper, lower, pascal, camel, or match case for properties | `!null = var.prop` | +| `style.control` | Upper or lower case control statements | `for`, `begin`, `pro` | +| `style.numbers` | Accents for numbers to specify type, upper or lower case | `5l`, `42ull` | +| `style.hex` | Upper or lower case for hex numbers | `0xaef` | +| `style.octal` | Upper or lower case for octal numbers | `0o0123` | +| `style.binary` | Upper or lower case for binary numbers | `0b010101` | +| `style.routines` | Pascal, camel, match, or no formatting for functions and procedures? | `ENVIRaster()` or `myPro` | +| `style.routineMethods` | Pascal, camel, match, or no formatting for procedure and function methods? | `obj.myMethod()` vs `obj.fooBar` | +| `style.systemVariables` | Upper or lower case | `!NULL`, `!x`, `!y` | +| `style.structureNames` | Pascal, camel, match, or no formatting for structure names | `a = {MyStruct, inherits StyleMeToo}` | +| `style.localVariables` | Do we match the case/style of the first instance of a variable? | | + +## Case Rules + +Here's a small table with examples and definitions of each type of case transform: + +| Case Style | Description/Example | +| ---------- | ---------------------------------------------------------- | +| Upper | UPPERCASETEXT | +| Lower | lowercasetext | +| Pascal | PascalCaseText | +| Camel | camelCaseText | +| Match | Matches the source definition or leaves alone if no source | +| None | Do not change the case of the text | + +When applying our case transforms above, we have a few special rules we follow: + +- When you have any style set to `match`, we only match the source if we can identify the type and it is a known routine, property, structure etc. If we don't know what the formatted item is, then we leave the text as-is. + +- When we don't know what a property, routine, structure, etc. is, then we give you the benefit-of-the-doubt and format the text that you have written out. This means the case transform will be based on what you type in some cases, and your mileage may vary, but it helps make sure that your code is more consistently formatted for methods and properties. ## Spacing Rules @@ -103,11 +126,11 @@ We re-use some of the style parameters for task file formatting as there is some Below you will find which properties are used and how they control the formatting in tasks. -| Setting | Description | Example | -| ------------------ | --------------------------------------------------------------- | --------------------------- | -| `style.keywords` | Upper or lower case for value of "keyword" | `"keyword": "keyword_name"` | -| `style.properties` | Upper or lower case for the value of "name" | `"name": "my_parameter"` | -| `style.control` | Upper or lower case for the value of "direction" and "required" | `"direction": "input"` | +| Setting | Description | Example | +| ---------------- | --------------------------------------------------------------- | --------------------------- | +| `style.keywords` | Upper or lower case for value of "keyword" | `"keyword": "keyword_name"` | +| `style.keywords` | Upper or lower case for the value of "name" | `"name": "my_parameter"` | +| `style.control` | Upper or lower case for the value of "direction" and "required" | `"direction": "input"` | Here's some context for why we chose those style options: diff --git a/extension/docs/general/KNOWN_ISSUES.md b/extension/docs/general/KNOWN_ISSUES.md new file mode 100644 index 000000000..99371b0e2 --- /dev/null +++ b/extension/docs/general/KNOWN_ISSUES.md @@ -0,0 +1,13 @@ +# Known Issues + +This document covers some of the known issues with the extension and how to work around them. + +## Notebooks + +- **Unable to resolve text model content** when viewing cell outputs in text editor + + If you try to view the output from a notebook cell in a text editor, and see an error along the lines of "unable to resolve text editor content", you'll need to enable scrolling to view the content. + + There's an issue in VSCode where, when you have this error, you can't view the cell output in it's entirety nor can you automatically turn it into a scrollable area. + + To display this output, it is recommended to turn on the setting "Notebook: Output Scrolling" so you can easily view everything that a notebook cell generates. If you do change this, you'll need to re-run the cell for the changes to take effect. diff --git a/extension/docs/notebooks/hello-world-envi.idlnb b/extension/docs/notebooks/hello-world-envi.idlnb new file mode 100644 index 000000000..bacb1b14f --- /dev/null +++ b/extension/docs/notebooks/hello-world-envi.idlnb @@ -0,0 +1,559 @@ +{ + "version": "2.0.0", + "cells": [ + { + "type": "markdown", + "content": [ + "## Hello World: ENVI!", + "", + "> Note: You need IDL **and** ENVI to use the examples shown below. If you want to try it out, but don't have ENVI, reach out to your account manager to get a license", + "", + "This notebook walks through how to use ENVI within an IDL Notebook.", + "", + "If you are new to notebooks, it is recommended to check out the example IDL notebook first. From the sidebar in VSCode, under \"Notebooks\", select \"Open IDL Notebook Example\" for a brief introduction.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Starting ENVI", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "While you can start ENVI with the UI present, we are going to use headless ENVI to show you how you can work with raster data in notebooks without needing to click or interact with the application itself.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; start ENVI headlessly", + "e = envi(/headless)" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Once ENVI is open, we can run task processing, embed progress, and easily visualize data.", + "", + "In order to to that, we need to open some datasets that we can process and work with.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; open a sample raster", + "msiFile = filepath('qb_boulder_msi', subdir = ['data'], $", + " root_dir = e.root_dir)", + "raster = e.openRaster(msiFile)", + "", + "; open HSI dataset", + "hsiRaster = filepath('AVIRISReflectanceSubset.dat', subdir = ['data', 'hyperspectral'], $", + " root_dir = e.root_dir)", + "hsiRaster = e.openRaster(hsiRaster)", + "", + "; raster series file", + "seriesFile = filepath('AirTemp.series', subdir = ['data', 'time_series'], $", + " root_dir = e.root_dir)", + "series = ENVIRasterSeries(seriesFile)", + "", + "; open some ROIs", + "roiFile = filepath('qb_boulder_roi.xml', subdir = ['data'], $", + " root_dir = e.root_dir)", + "rois = e.openROI(roiFile)", + "", + "; open a shapefile", + "vectorFile = filepath('lakes.shp', root_dir = e.root_dir, $", + " subdirectory = ['data', 'natural_earth_vectors'])", + "vector = e.openVector(vectorFile)" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Raster: Display", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "The root entry point for data visualization within IDL Notebooks is the `ENVINotebook::Display` method.", + "", + "Once we have an open dataset, we can use `ENVINotebook.Display` to embed a nice, pretty picture of our raster dataset.", + "", + "Note that this will automatically pick the bands for display and apply a basic stretch. It will use RGB or the first three bands if no wavelength metadata is present.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "ENVINotebook.display, raster" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "To manually pick bands for display that are not an RGB combination, use the ENVISubsetRaster function and manually specify the bands in an RGB combination.", + "", + "Here we can make a CIR (Color Infra Red) representation of the data by removing the blue band (first band) and changing the order.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "ENVINotebook.display, ENVISubsetRaster(raster, bands = [3, 2, 1])" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "If you don't want the data to be automatically stretched, or manually apply a stretch before display, use the `no_stretch` keyword.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; manually stretch the raster", + "stretched = ENVIOptimizedLinearStretchRaster(raster)", + "", + "; display a subset with our nice stretch over a subset of the image", + "ENVINotebook.display, ENVISubsetRaster(stretched, sub_rect = [700, 450, 850, 600])" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "If we run the same command, but with stretching enabled, you can see how the water throws off our default stretch and makes it hard to see what is in the subset of our image.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; ddisplay a subset of our image and show why manually stretching the raster helps", + "ENVINotebook.display, ENVISubsetRaster(raster, sub_rect = [700, 450, 850, 600])" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "We can also run image processing routines and embed the outputs inside of notebooks as well.", + "", + "Let's use an ENVI Task to perform clustering on the spectral information captured in our dataset.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + ";+", + "; Run an ENVI Task for unsupervicsed classification", + ";-", + "isoTask = ENVITask('ISODATAClassification')", + "isoTask.input_raster = raster", + "isoTask.execute", + "", + "; display our result", + "ENVINotebook.display, isoTask.output_raster" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Raster: Spectral Cube", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "If you have raster datasets with many bands (hyperspectral), you can create a 3d-like visualization of the image.", + "", + "This style of visualization features an RGB pretty-picture of the visual bands and then adds a spectral overlay for pixels along the edge.", + "", + "To create this graphic, set the `cube` keyword when displaying a raster.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; create a spectral data cube and display", + "ENVINotebook.display, hsiRaster, /cube" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "This method also works with multispectral data, but without many bands, it has a little less panache.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; create a spectral data cube and display", + "ENVINotebook.display, raster, /cube" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Raster: Animations", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "In addition to being able to display a single image, we can create animations of image bands and raster series.", + "", + "> Important Note! Animations fail if you have more than 12 bands or images in a given dataset. That's because we have to create and embed PNGs in your notebook cell.", + ">", + "> If you try to animate through a 100 band image, that means a new PNG is added for each band which will make notebooks excessively large.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "There are several ways to create an animation within ENVI Notebook. We can tell `ENVINotebook.Display` that we want to view more than one raster at a time. This will create a dialog that will toggle back and forth between each raster that was specified.", + "", + "This is a nice way to quickly visualize data and see image processing results.", + "", + "> Pro tip: Each raster should have the same number of columns and rows, otherwise the datasets won't line up.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + ";+", + "; Display input and output in same cell", + ";-", + "ENVINotebook.display, [raster, isoTask.output_raster]" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "We can also create simple animations that play through the bands of a given dataset. As mentioned up above, we have a default limit of 12 bands that you can display at once.", + "", + "If you have more than 12 bands, an error will be thrown without the `allow_many` keyword set.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "To animate a dataset, use the `animate` keyword when displaying raster data.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "ENVINotebook.display, raster, /animate" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Lastly, we can also create animations for raster series datasets.", + "", + "This has the same API as basic display of a raster and embeds an animation within our notebook." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + ";+", + "; Display raster series in notebook", + ";", + "; WARNING: this can result in large notebooks so be cautious about series with many rasters", + ";", + "; All rasters in your raster series should line up with one another. If not, use RegridRasterSeries before", + "; calling this.", + ";-", + "ENVINotebook.display, series" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Embedding Progress Messages", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "When you are using ENVI, most of the time you will have some sort of automated processing that needs to happen.", + "", + "When ENVI is in headless mode and the UI is not present, we can embed the progress messages from ENVI Tasks directly within our notebook.", + "", + "To do with, we use the `ENVINotebook.embedProgress` method to enable and disable." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; embed progress messages", + "ENVINotebook.embedProgress" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + ";+", + "; Run a rask and see progress as we run", + ";-", + "", + "; create a task and display", + "mnfTask = ENVITask('ForwardMNFTransform')", + "mnfTask.input_raster = raster", + "mnfTask.execute" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Lastly, if you don't like the progress messages, we can turn them off and we won't see any output.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "ENVINotebook.embedProgress, /stop" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + ";+", + "; Run processing to show that progress messages arent embedded.", + ";-", + "", + "; create a task and display", + "mnfTask = ENVITask('ForwardMNFTransform')", + "mnfTask.input_raster = raster", + "mnfTask.execute" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### Maps: Raster and Vector", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "One of the coolest ways that we can visualize data from ENVI within notebooks is using maps!", + "", + "This is enabled because, within VSCode, we are using JavaScript and HTML to display outputs, so we can use one of the many open source web maps.", + "", + "> Important note: All datasets that you view on a map **must** be georeferenced. If your data is not, then you need to use the basic visualizations listed above.", + "", + "> Important note: Maps require an internet connection to load the basemap.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Let's create a simple map of the same raster we were displaying above.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "ENVINotebook.displayInMap, raster" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "When a map is created, any calls to `ENVINotebook.DisplayInMap` within a single cell specify the datasets that we add in the same map.", + "", + "Let's show this in action by displaying the same raster as above with a few ROIs as well. You'll notice a blue polygon over the water is one of the three ROIs added to the map.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; display raster", + "ENVINotebook.displayInMap, raster", + "", + "; add ROIs to the same map", + "ENVINotebook.displayInMap, rois" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Unlike our normal notebook visualizations of rasters, we can display vector data within the context of a map.", + "", + "Let's display a vector of the lakes across the world and customize the color by specifying a property for the dataset.", + "", + "> Pro tip: The color property is an RGBA array (red, green, blue, and alpha) between 0 and 255", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; add vector and specify color", + "ENVINotebook.displayInMap, vector, orderedhash('color', [255, 0, 0, 125])" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Displaying in maps also natively supports GeoJSON. We can use the `ENVIRaster::GetOutline` method (from the extension) to get the physical area that an image covers as a GeoJSON string.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; display geojson from a string", + "geojsonOutline = raster.getOutline(3857)", + "ENVINotebook.displayInMap, geojsonOutline" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Alternatively, if you have a GeoJSON file on disk, you can use that as well with the `is_geojson_uri` keyword set.", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; write our GeoJSON outline to disak", + "tmpUri = e.getTemporaryFilename('.json', /cleanup_on_exit)", + "openw, lun, tmpUri, /get_lun", + "printf, lun, geojsonOutline", + "free_lun, lun", + "", + "; add our temp file to a map", + "ENVINotebook.displayInMap, tmpUri, /is_geojson_uri" + ], + "metadata": {}, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/extension/docs/notebooks/hello-world-idl.idlnb b/extension/docs/notebooks/hello-world-idl.idlnb index 4bb005dd4..30b2f4074 100644 --- a/extension/docs/notebooks/hello-world-idl.idlnb +++ b/extension/docs/notebooks/hello-world-idl.idlnb @@ -14,7 +14,16 @@ "content": [ "This notebook walks through the basics of how IDL Notebooks work.", "", - "At a high level it covers: how cells are executed, behaviors for accessing variables, embedding graphics, and what happens when you encounter errors." + "At a high level it covers: ", + "", + "- IDL Notebook Toolbar", + "- IDL's Path", + "- How cells are executed", + "- Behaviors for accessing variables", + "- Embedding graphics", + "- What happens when you encounter errors", + "", + "If you have other questions about notebook behavior, feel free to start a discussion on our [GitHub](https://github.com/interactive-data-language/vscode-idl/discussions) page. We are happy to update the content in our example notebooks based on user feedback, so let us know if you have thoughts or ideas!" ], "metadata": {}, "outputs": [] @@ -22,7 +31,7 @@ { "type": "markdown", "content": [ - "### Toolbar" + "### Notebook Toolbar" ], "metadata": {}, "outputs": [] @@ -54,7 +63,59 @@ "content": [ "If your session gets a little goofy, you can press reset which will give you a brand new notebook session of IDL (it stops and restarts IDL to make sure it is good as new!).", "", - "Stop will simply stop the IDL process which will restart the next time you run a cell." + "Stop will simply stop the IDL process which will restart automatically the next time you run a cell." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "### IDL's Path" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "When you start IDL in a notebook, we follow the same pattern for the path as true debug sessions of IDL.", + "", + "This means we:", + "", + "- Automatically add all open workspaces to IDL's search path (recursively, not just the root folder)", + "- Use the VSCode setting for search path", + "", + "That way you can easily use routines that you have defined elsewhere within the context of an IDL Notebook." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Let's inspect the current path and see what our local environment looks like:" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; print out each folder on IDL's search path", + "print, strsplit(!path, path_sep(/search_path), /extract), /implied_print" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "> Pro tip: For the output above, you might notice that the printed path is too long to view the entire output within the notebook.", + ">", + "> To display this output, it is recommended to turn on the setting \"Notebook: Output Scrolling\" so you can easily view everything that a notebook cell generates. If you do change this, you'll need to re-run the cell for the changes to take effect.", + ">", + "> You can also try to view the output in a text editor, which is a button at the bottom of the truncated output, but VSCode doesn't always display the results correctly. View the extension docs \"Known Issues\" section for how to fix this within VSCode" ], "metadata": {}, "outputs": [] @@ -70,7 +131,9 @@ { "type": "markdown", "content": [ - "Cells with only routine definitions are compiled, but not executed." + "Cells with only routine definitions are compiled, but not executed.", + "", + "If you execute the following cell, it will be compiled and that is it." ], "metadata": {}, "outputs": [] @@ -166,7 +229,9 @@ "content": [ "All markdown cells are executed in the folder where they exist.", "", - "You can see this my looking at the filepath to the routine:" + "You can see this my looking at the output from `routine_filepath()`.", + "", + "This makes it easy to create notebooks next to data that lives on disk and use relative filepaths to access external information." ], "metadata": {}, "outputs": [] @@ -190,9 +255,9 @@ { "type": "markdown", "content": [ - "All cells are executed as main level programs.", + "Because the main way cells are executed is through main level programs, any variables you define can be accessed anywhere.", "", - "This means that, after you define variables, you can access them in any cell." + "Here we will define a variable and create a second variable using the first." ], "metadata": {}, "outputs": [] @@ -200,7 +265,8 @@ { "type": "code", "content": [ - "firstVar = 42" + "firstVar = 42", + "help, firstVar" ], "metadata": {}, "outputs": [] @@ -208,7 +274,8 @@ { "type": "code", "content": [ - "secondVar = firstVar" + "secondVar = firstVar", + "help, secondVar" ], "metadata": {}, "outputs": [] @@ -216,9 +283,11 @@ { "type": "markdown", "content": [ - "You'll note that the editor is smart enough to give you auto-complete (you may need to trigger with ctrl + space) and it detects if a variable is defined but not used in any cell.", + "You'll note that the editor is smart enough to give you auto-complete and it detects if a variable is defined but not used in any cell.", + "", + "We also let you know if you use a variable from a lower cell before it gets defined.", "", - "We also let you know if you use a variable from a lower cell before it gets defined." + "> Pro tip: If auto-complete is acting weird, you may need to press escape and manually trigger auto-complete where your cursor is located using `Ctrl + Space`." ], "metadata": {}, "outputs": [] @@ -242,7 +311,24 @@ { "type": "markdown", "content": [ - "If you \"Ctrl + Click\" on a variable, it will take you to the cell and location within that cell where it is defined." + "> Pro tip: You should not use variables created in later cells before their definition. This makes notebooks harder for other users to follow and errors will be reported." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "If you can't find where a variable is defined, you can \"Ctrl + Click\" on a variable and it will take you to the cell and location within that cell where it is defined or first encountered." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; Ctrl + Click on \"thirdVar\" to find my source!", + "help, thirdVar" ], "metadata": {}, "outputs": [] @@ -258,11 +344,11 @@ { "type": "markdown", "content": [ - "Graphics are embedded within notebook cells as you go.", + "Following the patterns of other notebooks, by default graphics are embedded within notebook cells as you go.", "", - "If you are using direct graphics, we can only embed one image per cell. If you are using anything else we accept one or more embedded graphics items.", + "If you are using direct graphics, we can only embed one visual per cell. If you are using object or function graphics we embed all visuals within the outputs of each cell.", "", - "The embedded graphics persist when you save and can be viewed at a later time.", + "The embedded graphics are saved within the notebook and can be viewed later.", "", "There is an extension preference that allows you to disable embedding of graphics if you prefer the windows to appear as they normally would with the workbench." ], @@ -270,20 +356,22 @@ "outputs": [] }, { - "type": "code", + "type": "markdown", "content": [ - "; make some plots!", - "p1 = plot(/test)", - "p2 = surface(/test)", - "p4 = barplot(/test)" + "> Pro tip: Because the graphics are embedded, do be aware that notebooks may grow in size depending on how many images are embedded.", + "", + "> Important note: When ENVI is running, direct graphics are not embedded" ], "metadata": {}, "outputs": [] }, { - "type": "markdown", + "type": "code", "content": [ - "" + "; make some plots!", + "p1 = plot(/test)", + "p2 = surface(/test)", + "p4 = barplot(/test)" ], "metadata": {}, "outputs": [] @@ -337,7 +425,7 @@ "content": [ "Here is another example where we have a stop within our routine.", "", - "In this case, we mark the cell execution as failing because we didn't complete without being stopped." + "In this case, the cell with the routine definition compiles correctly, but we encounter problems when we try to run it:" ], "metadata": {}, "outputs": [] @@ -361,6 +449,24 @@ ], "metadata": {}, "outputs": [] + }, + { + "type": "markdown", + "content": [ + "After each cell is executed, we force a return to the main level.", + "", + "We can use `scope_traceback()` to verify that we are back at the main level and not where the stop was in the previous cell." + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "print, scope_traceback(), /implied_print" + ], + "metadata": {}, + "outputs": [] } ] } \ No newline at end of file diff --git a/extension/icon-theme/vs-seti-icon-theme.json b/extension/icon-theme/vs-seti-icon-theme.json index e7fc86dc0..144a1fed6 100644 --- a/extension/icon-theme/vs-seti-icon-theme.json +++ b/extension/icon-theme/vs-seti-icon-theme.json @@ -1546,10 +1546,16 @@ "fontColor": "#6d8086" }, "_idl": { - "iconPath": "./../images/dark/idlicon.png" + "iconPath": "./../images/dark/idlicon-color.svg" }, "_idl_light": { - "iconPath": "./../images/light/idlicon.png" + "iconPath": "./../images/light/idlicon-color.svg" + }, + "_envi": { + "iconPath": "./../images/dark/enviicon-color.svg" + }, + "_envi_light": { + "iconPath": "./../images/light/enviicon-color.svg" } }, "file": "_default", @@ -1788,7 +1794,14 @@ "ds_store": "_ignored", "sav": "_idl", "idllog": "_idl", - "idlnb": "_idl" + "idlnb": "_idl", + "dat": "_envi", + "hdr": "_envi", + "enp": "_envi", + "evs": "_envi", + "ept": "_envi", + "model": "_envi", + "style": "_envi" }, "fileNames": { "mix": "_hex", @@ -2194,7 +2207,14 @@ "ds_store": "_ignored_light", "sav": "_idl_light", "idllog": "_idl_light", - "idlnb": "_idl_light" + "idlnb": "_idl_light", + "dat": "_envi_light", + "hdr": "_envi_light", + "enp": "_envi_light", + "evs": "_envi_light", + "ept": "_envi_light", + "model": "_envi_light", + "style": "_envi_light" }, "languageIds": { "bat": "_windows_light", diff --git a/extension/images/dark/enviicon-color.svg b/extension/images/dark/enviicon-color.svg new file mode 100644 index 000000000..9f0b10e67 --- /dev/null +++ b/extension/images/dark/enviicon-color.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/dark/enviicon.svg b/extension/images/dark/enviicon.svg new file mode 100644 index 000000000..a8ab9f07a --- /dev/null +++ b/extension/images/dark/enviicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/dark/idlicon-color.svg b/extension/images/dark/idlicon-color.svg new file mode 100644 index 000000000..82b1b970b --- /dev/null +++ b/extension/images/dark/idlicon-color.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/dark/idlicon.png b/extension/images/dark/idlicon.png deleted file mode 100644 index 9f1532885..000000000 Binary files a/extension/images/dark/idlicon.png and /dev/null differ diff --git a/extension/images/dark/idlicon.svg b/extension/images/dark/idlicon.svg new file mode 100644 index 000000000..871ae4715 --- /dev/null +++ b/extension/images/dark/idlicon.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/dark/transform.svg b/extension/images/dark/transform.svg new file mode 100644 index 000000000..95e1d5dad --- /dev/null +++ b/extension/images/dark/transform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension/images/enviicon.png b/extension/images/enviicon.png index b144dc27f..ee342388b 100644 Binary files a/extension/images/enviicon.png and b/extension/images/enviicon.png differ diff --git a/extension/images/enviicon.svg b/extension/images/enviicon.svg new file mode 100644 index 000000000..9f0b10e67 --- /dev/null +++ b/extension/images/enviicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/idlicon-color.svg b/extension/images/idlicon-color.svg new file mode 100644 index 000000000..82b1b970b --- /dev/null +++ b/extension/images/idlicon-color.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/idlicon.png b/extension/images/idlicon.png index e0520a3bb..7b63f8cba 100644 Binary files a/extension/images/idlicon.png and b/extension/images/idlicon.png differ diff --git a/extension/images/idlicon.svg b/extension/images/idlicon.svg index a7be3a606..871ae4715 100644 --- a/extension/images/idlicon.svg +++ b/extension/images/idlicon.svg @@ -1,10 +1,25 @@ - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/light/enviicon-color.svg b/extension/images/light/enviicon-color.svg new file mode 100644 index 000000000..4afb4ff0c --- /dev/null +++ b/extension/images/light/enviicon-color.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/light/enviicon.svg b/extension/images/light/enviicon.svg new file mode 100644 index 000000000..b909b9806 --- /dev/null +++ b/extension/images/light/enviicon.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/light/idlicon-color.svg b/extension/images/light/idlicon-color.svg new file mode 100644 index 000000000..566328a3d --- /dev/null +++ b/extension/images/light/idlicon-color.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/light/idlicon.png b/extension/images/light/idlicon.png deleted file mode 100644 index cca90cb36..000000000 Binary files a/extension/images/light/idlicon.png and /dev/null differ diff --git a/extension/images/light/idlicon.svg b/extension/images/light/idlicon.svg new file mode 100644 index 000000000..91dc31c12 --- /dev/null +++ b/extension/images/light/idlicon.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extension/images/light/transform.svg b/extension/images/light/transform.svg new file mode 100644 index 000000000..72cd5fd59 --- /dev/null +++ b/extension/images/light/transform.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension/language/schemas/config/v1.schema.json b/extension/language/schemas/config/v1.schema.json index 243bd2906..218283b65 100644 --- a/extension/language/schemas/config/v1.schema.json +++ b/extension/language/schemas/config/v1.schema.json @@ -30,9 +30,9 @@ "properties": { "type": "string", "title": "Property Formatting", - "description": "Controls if properties are upper or lower case", - "enum": ["lower", "upper", "none"], - "default": "lower" + "description": "Controls the case style of properties", + "enum": ["lower", "upper", "match", "camel", "pascal", "none"], + "default": "camel" }, "control": { "type": "string", @@ -72,10 +72,17 @@ "routines": { "type": "string", "title": "Routine Formatting", - "description": "When we encounter a known routine (function, procedure, and method), how do we format it with respect to the definition", - "enum": ["match", "none"], + "description": "When we encounter a known routine (functions and procedures), how do we format it with respect to the definition", + "enum": ["match", "camel", "pascal", "none"], "default": "match" }, + "routineMethods": { + "type": "string", + "title": "Routine Method Formatting", + "description": "When we encounter a known routine method (function methods and procedure methods), how do we format it with respect to the definition?", + "enum": ["match", "camel", "pascal", "none"], + "default": "camel" + }, "systemVariables": { "type": "string", "title": "System Variable Formatting", @@ -83,6 +90,13 @@ "enum": ["lower", "upper", "none"], "default": "lower" }, + "structureNames": { + "type": "string", + "title": "Structure Name Formatting", + "description": "When we have a known named structure, how do we format the name?", + "enum": ["match", "camel", "pascal", "none"], + "default": "pascal" + }, "localVariables": { "type": "string", "title": "Local Variable Formatting", diff --git a/idl/helpers/vscode_buildworkspace.pro b/idl/helpers/vscode_buildworkspace.pro index 9b7aa38de..3ee9a6b16 100644 --- a/idl/helpers/vscode_buildworkspace.pro +++ b/idl/helpers/vscode_buildworkspace.pro @@ -17,8 +17,8 @@ ; to limit recursion. ; ;- -pro build_recursive_resolve, bdg, routines, processed, skip - compile_opt idl2 +pro vscode_BuildWorkspace_resolve, bdg, routines, processed, skip + compile_opt idl2, hidden ; track routines that we have processed if ~keyword_set(processed) then processed = hash(/fold_case) @@ -28,7 +28,7 @@ pro build_recursive_resolve, bdg, routines, processed, skip changes = !false ; reset bridge - bdg.execute, '.reset' + bdg.Execute, '.reset' ; reset path in child process - weird thing with resolving objects called as functions ; when they are on your path @@ -37,7 +37,7 @@ pro build_recursive_resolve, bdg, routines, processed, skip ; compile all routines that we are aware of foreach routine, routines do begin ; skip if we have processed a routine or not - if skip.hasKey(routine) or processed.hasKey(routine) or strtrim(routine, 2) eq '' then continue + if skip.HasKey(routine) or processed.HasKey(routine) or strtrim(routine, 2) eq '' then continue ; nicely handle errors catch, err @@ -50,7 +50,7 @@ pro build_recursive_resolve, bdg, routines, processed, skip ; compile file ; bdg.execute, '.compile "' + routine + '"' - bdg.execute, 'resolve_routine, "' + routine + '", /COMPILE_FULL_FILE, /EITHER' + bdg.Execute, 'resolve_routine, "' + routine + '", /COMPILE_FULL_FILE, /EITHER' catch, /cancel ; check for source location @@ -63,17 +63,17 @@ pro build_recursive_resolve, bdg, routines, processed, skip catch, /cancel continue endif - bdg.execute, 'info = json_serialize(routine_info("' + routine + '", /source, /function))' + bdg.Execute, 'info = json_serialize(routine_info("' + routine + '", /source, /function))' endif else begin - bdg.execute, 'info = json_serialize(routine_info("' + routine + '", /source))' + bdg.Execute, 'info = json_serialize(routine_info("' + routine + '", /source))' catch, /cancel endelse ; get and parse the source struct - src = json_parse(bdg.getVar('info'), /fold_case) + src = json_parse(bdg.GetVar('info'), /fold_case) ; skip internal routines - if src['path'].startsWith(!dir) or ~keyword_set(src['path']) then begin + if src['path'].StartsWith(!dir) or ~keyword_set(src['path']) then begin skip[routine] = !true continue endif @@ -86,17 +86,66 @@ pro build_recursive_resolve, bdg, routines, processed, skip ; check if we have changes if changes then begin ; get the unresolved routines - bdg.execute, 'info = json_serialize(orderedhash("procedures", routine_info(/UNRESOLVED), "functions", routine_info(/FUNCTIONS, /UNRESOLVED)))' - allRoutines = json_parse(bdg.getVar('info')) + bdg.Execute, 'info = json_serialize(orderedhash("procedures", routine_info(/UNRESOLVED), "functions", routine_info(/FUNCTIONS, /UNRESOLVED)))' + allRoutines = json_parse(bdg.GetVar('info')) ; concat together toProcess = list() - if isa(allRoutines['procedures'], 'list') then toProcess.add, allRoutines['procedures'], /extract - if isa(allRoutines['functions'], 'list') then toProcess.add, allRoutines['functions'], /extract + if isa(allRoutines['procedures'], 'list') then toProcess.Add, allRoutines['procedures'], /extract + if isa(allRoutines['functions'], 'list') then toProcess.Add, allRoutines['functions'], /extract ; recurse - build_recursive_resolve, bdg, toProcess, processed, skip + vscode_BuildWorkspace_resolve, bdg, toProcess, processed, skip endif + + s = {myProp: 5, otherProp: 6} +end + +;+ +; :Arguments: +; workspace: in, required, String +; Workspace we are searching for files +; destination: in, required, String +; Location we copy to +; types: in, required, Array +; File extensions that we copy as part of the build +; +;- +pro vscode_BuildWorkspace_CopyFiles, workspace, destination, types + compile_opt idl2, hidden + + ; search for files + files = file_search(workspace, '*', count = nfiles, /test_regular) + + ; make sure we found files + if (nfiles eq 0) then $ + message, 'No files found to build', level = -1 + + ; get locations of file extensions + dot = strpos(files, '.') + + ; get files with extensions to check + idxCheck = where(dot ne -1, countCheck) + + ; make sure we have file extensions to check + if (countCheck eq 0) then $ + message, 'No files found to build', level = -1 + + ; pluck the file extensions + extensions = strlowcase(files[idxCheck].Substring(dot)) + + ; make hash of allowed types + okExtensions = hash(types, replicate(!true, n_elements(types))) + + ; get extensions we keep + idxOk = where(okExtensions.HasKey(extensions), countKeep) + + ; make sure that we have files + if (countKeep eq 0) then $ + message, 'No files found to build', level = -1 + + ; copy files + file_copy, files[idxCheck[idxOk]], destination end ;+ @@ -112,9 +161,22 @@ end ; 6. Any dependency not located in the !dir folder we attempt to ; compile and save ; +; :Arguments: +; workspace: in, required, String +; Fully-qualified path to the workspace that we want to build/compile +; ;- -pro build - compile_opt idl2 +pro vscode_BuildWorkspace, workspace + compile_opt idl2, hidden + on_error, 2 + + ; make sure we have a workspace to build + if (workspace eq !null) then $ + message, 'Workspace not specified, required!', level = -1 + + ; make sure the folder exists + if ~file_test(workspace, /directory) then $ + message, 'Workspace specified, but folder does not exist!', level = -1 ;+ get current folder thisDir = file_dirname(routine_filepath()) @@ -124,11 +186,14 @@ pro build if ~file_test(srcDir, /directory) then message, 'Source folder not found where expected' ;+ specify the output folder - outDir = thisDir + path_sep() + 'dist' + outDir = workspace + path_sep() + 'dist' - ; make folder if it doesnt exist + ; clean up if the output folder exists already if file_test(outDir, /directory) then file_delete, outDir, /recursive + ; make our output folder + file_mkdir, outDir + ; copy source to dist file_copy, srcDir, outDir, /recursive @@ -144,7 +209,7 @@ pro build skipThese['tic'] = !true skipThese['toc'] = !true - ;+ Track files to delete and not include int he builds + ;+ Track files to delete and not include in the builds delete = hash() delete['atcorrectimagery.pro'] = !true delete['atcorrectimagerywithflaash.task'] = !true @@ -155,7 +220,7 @@ pro build if (nCleanup gt 0) then begin foreach file, files do begin case (!true) of - delete.hasKey(file_basename(file)): file_delete, file + delete.HasKey(file_basename(file)): file_delete, file else: ; do nothing endcase endforeach @@ -166,9 +231,9 @@ pro build if (nCleanup gt 0) then begin foreach file, files do begin case (!true) of - file.endsWith('.spec.pro'): file_delete, file - file.endsWith('.spec.pro.log'): file_delete, file - delete.hasKey(file_basename(file)): file_delete, file + file.EndsWith('.spec.pro'): file_delete, file + file.EndsWith('.spec.pro.log'): file_delete, file + delete.HasKey(file_basename(file)): file_delete, file else: ; do nothing endcase endforeach @@ -186,57 +251,57 @@ pro build ; create process to build files bdg = IDL_IDLBridge() - bdg.setVar, 'path', byte(newPath) ; goofy to avoid strings that are too long - bdg.execute, 'path = string(path)' - bdg.execute, 'pref_set, "IDL_PATH", path, /COMMIT & path_cache, /REBUILD' + bdg.SetVar, 'path', byte(newPath) ; goofy to avoid strings that are too long + bdg.Execute, 'path = string(path)' + bdg.Execute, 'pref_set, "IDL_PATH", path, /commit & path_cache, /rebuild' ; compile and save all of our PRO files foreach file, files do begin - bdg.execute, '.reset' - bdg.execute, '.compile "' + file + '"' - bdg.execute, 'save, /ROUTINES, FILENAME = "' + file.replace('.pro', '.sav') + '", /COMPRESS' + bdg.Execute, '.reset' + bdg.Execute, '.compile "' + file + '"' + bdg.Execute, 'save, /routines, filename = "' + file.Replace('.pro', '.sav') + '", /compress' endforeach ; reset bridge - bdg.execute, '.reset' + bdg.Execute, '.reset' ; compile all routines that we are aware of foreach file, files do begin ; compile file - bdg.execute, '.compile "' + file + '"' + bdg.Execute, '.compile "' + file + '"' ; clean up PRO file file_delete, file endforeach ; get the routines in our files - bdg.execute, 'info = json_serialize(orderedhash("procedures", routine_info(/UNRESOLVED), "functions", routine_info(/FUNCTIONS, /UNRESOLVED)))' - allRoutines = json_parse(bdg.getVar('info')) + bdg.Execute, 'info = json_serialize(orderedhash("procedures", routine_info(/UNRESOLVED), "functions", routine_info(/FUNCTIONS, /UNRESOLVED)))' + allRoutines = json_parse(bdg.GetVar('info')) ; reset bridge - bdg.execute, '.reset' + bdg.Execute, '.reset' ; initialize routines that we have processed processed = hash(/fold_case) ; concat unresolved functions and procedures ttogether toProcess = list() - if isa(allRoutines['procedures'], 'list') then toProcess.add, allRoutines['procedures'], /extract - if isa(allRoutines['functions'], 'list') then toProcess.add, allRoutines['functions'], /extract + if isa(allRoutines['procedures'], 'list') then toProcess.Add, allRoutines['procedures'], /extract + if isa(allRoutines['functions'], 'list') then toProcess.Add, allRoutines['functions'], /extract ; recurse - build_recursive_resolve, bdg, toProcess, processed + vscode_BuildWorkspace_resolve, bdg, toProcess, processed ; add object classes for resolving processed['awesomeenviprogress__define'] = !true ; process each dependency - foreach routine, processed.keys() do begin + foreach routine, processed.Keys() do begin ; return if we should be skipping - if skipThese.hasKey(routine) then continue + if skipThese.HasKey(routine) then continue ; reset bridge - bdg.execute, '.reset' + bdg.Execute, '.reset' ; nicely handle errors catch, err @@ -247,13 +312,13 @@ pro build endif ; attempt to resolve our routine - bdg.execute, 'resolve_routine, "' + routine + '", /COMPILE_FULL_FILE, /EITHER' + bdg.Execute, 'resolve_routine, "' + routine + '", /compile_full_file, /either' ; dont catch catch, /cancel ; we found it, so save - bdg.execute, 'save, /ROUTINES, FILENAME="' + depDir + path_sep() + strlowcase(routine) + '.sav"' + bdg.Execute, 'save, /routines, filename="' + depDir + path_sep() + strlowcase(routine) + '.sav"' endforeach ; clean up diff --git a/idl/test/auto-complete/in_structures.pro b/idl/test/auto-complete/in_structures.pro index 175d8b6e3..6ff45d8b2 100644 --- a/idl/test/auto-complete/in_structures.pro +++ b/idl/test/auto-complete/in_structures.pro @@ -21,5 +21,7 @@ b = {NYStruct, prop1: } !null = {NYStruct,prop1:something,prop2: byte1.} +; structure inheritance +!null = {mystruct, inherits } end \ No newline at end of file diff --git a/idl/test/client-e2e/notebooks/notebook-to-pro-code/test-notebook.idlnb b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test-notebook.idlnb new file mode 100644 index 000000000..996b95a9f --- /dev/null +++ b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test-notebook.idlnb @@ -0,0 +1,245 @@ +{ + "version": "2.0.0", + "cells": [ + { + "type": "markdown", + "content": [ + "First three cells are empty and should not run or generate eny output", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "", + "", + "", + " ", + "", + "", + "" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; do nothing" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; run when we dont have compile opt or main level", + "arr = findgen(42)", + "help, arr" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; we have compile_opt idl2, so we should have a long", + "a = 15", + "help, a" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; no output from running this cell", + ";+", + ";-", + "pro test1", + " compile_opt idl2", + "", + " print, 42", + "end" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; run our procedure from above", + "test1" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; run when we have compile opt and main level end", + "", + "compile_opt idl2", + "", + "print, 5", + "", + "end" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Some" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "markdown", + "content": [ + "Markdown" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; if we have a main level, then run it", + ";+", + "; :Returns: any", + ";", + ";-", + "function foo1", + " compile_opt idl2", + " return, 42", + "end", + "", + "; we have compile_opt idl2, so we should have a long", + "a = 15", + "help, a", + "", + "end" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; main level programs dont need to have an end", + ";+", + "; :Returns: any", + ";", + ";-", + "function foo2", + " compile_opt idl2", + " return, 42", + "end", + "", + "; we have compile_opt idl2, so we should have a long", + "a = 15", + "help, a" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; embed graphics", + "p = plot(/test)" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; run cell and dont capture image output (or any output)", + "!null = 42" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; embed more than one graphic", + "p1 = plot(/test)", + "p2 = surface(/test)", + "p3 = barplot(/test)" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; when we have a stop or syntax error, dont stop at it", + ";+", + ";-", + "pro mypro", + " compile_opt idl2", + " stop", + "end" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; run routine with a stop", + "mypro" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; verify we are at the main level (one item in stack trace)", + "print, n_elements(scope_traceback()), /implied_print" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; dont execute when we have syntax errors 1", + "a =" + ], + "metadata": {}, + "outputs": [] + }, + { + "type": "code", + "content": [ + "; dont execute when we have syntax errors 2", + ";+", + ";-", + "pro syntax_error", + " compile_opt idl2", + "", + " a =", + "end" + ], + "metadata": {}, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_all_cells.pro b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_all_cells.pro new file mode 100644 index 000000000..ebfe8c27b --- /dev/null +++ b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_all_cells.pro @@ -0,0 +1,103 @@ +; First three cells are empty and should not run or generate eny output +; + +; do nothing + +; no output from running this cell +;+ +;- +pro test1 + compile_opt idl2 + + print, 42 +end + +; Some + +; Markdown + +; if we have a main level, then run it +;+ +; :Returns: any +; +;- +function foo1 + compile_opt idl2 + return, 42 +end + +; main level programs dont need to have an end +;+ +; :Returns: any +; +;- +function foo2 + compile_opt idl2 + return, 42 +end + +; when we have a stop or syntax error, dont stop at it +;+ +;- +pro mypro + compile_opt idl2 + stop +end + +; dont execute when we have syntax errors 2 +;+ +;- +pro syntax_error + compile_opt idl2 + + a = +end + +; main level program +compile_opt idl2 + +; run when we dont have compile opt or main level +arr = findgen(42) +help, arr + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; run our procedure from above +test1 + +; run when we have compile opt and main level end + +compile_opt idl2 + +print, 5 + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; embed graphics +p = plot(/test) + +; run cell and dont capture image output (or any output) +!null = 42 + +; embed more than one graphic +p1 = plot(/test) +p2 = surface(/test) +p3 = barplot(/test) + +; run routine with a stop +mypro + +; verify we are at the main level (one item in stack trace) +print, n_elements(scope_traceback()), /implied_print + +; dont execute when we have syntax errors 1 +a = +end \ No newline at end of file diff --git a/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_only_code.pro b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_only_code.pro new file mode 100644 index 000000000..9251ea05a --- /dev/null +++ b/idl/test/client-e2e/notebooks/notebook-to-pro-code/test_notebook_only_code.pro @@ -0,0 +1,96 @@ +; do nothing + +; no output from running this cell +;+ +;- +pro test1 + compile_opt idl2 + + print, 42 +end + +; if we have a main level, then run it +;+ +; :Returns: any +; +;- +function foo1 + compile_opt idl2 + return, 42 +end + +; main level programs dont need to have an end +;+ +; :Returns: any +; +;- +function foo2 + compile_opt idl2 + return, 42 +end + +; when we have a stop or syntax error, dont stop at it +;+ +;- +pro mypro + compile_opt idl2 + stop +end + +; dont execute when we have syntax errors 2 +;+ +;- +pro syntax_error + compile_opt idl2 + + a = +end + +; main level program +compile_opt idl2 + +; run when we dont have compile opt or main level +arr = findgen(42) +help, arr + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; run our procedure from above +test1 + +; run when we have compile opt and main level end + +compile_opt idl2 + +print, 5 + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; we have compile_opt idl2, so we should have a long +a = 15 +help, a + +; embed graphics +p = plot(/test) + +; run cell and dont capture image output (or any output) +!null = 42 + +; embed more than one graphic +p1 = plot(/test) +p2 = surface(/test) +p3 = barplot(/test) + +; run routine with a stop +mypro + +; verify we are at the main level (one item in stack trace) +print, n_elements(scope_traceback()), /implied_print + +; dont execute when we have syntax errors 1 +a = +end \ No newline at end of file diff --git a/idl/test/scratch/idl.json b/idl/test/scratch/idl.json index da7c38c86..fd143e323 100644 --- a/idl/test/scratch/idl.json +++ b/idl/test/scratch/idl.json @@ -4,14 +4,16 @@ "quotes": "single", "methods": "dot", "keywords": "lower", - "properties": "lower", + "properties": "camel", "control": "lower", "numbers": "lower", "hex": "lower", "octal": "lower", "binary": "lower", "routines": "match", + "routineMethods": "match", "systemVariables": "lower", + "structureNames": "pascal", "localVariables": "match" }, "autoFix": true, diff --git a/idl/test/scratch/notebooks/idl-1.0.0.js b/idl/test/scratch/notebooks/idl-1.0.0.js index 405da29d2..11b33571b 100644 --- a/idl/test/scratch/notebooks/idl-1.0.0.js +++ b/idl/test/scratch/notebooks/idl-1.0.0.js @@ -17,9 +17,8 @@ ... }; */ -if (typeof IDL === "undefined") { - var IDL = - { +if (typeof IDL === 'undefined') { + var IDL = { /* Send a notification from JavaScript to IDL. value: A string containing the message payload. @@ -27,29 +26,28 @@ if (typeof IDL === "undefined") { Usage: IDL.notifyIDL("my message payload"); */ - notifyIDL: function(value) - { + notifyIDL: function (value) { window.cefQuery({ request: value, persistent: false, - onSuccess: function(response) { + onSuccess: function (response) { // Do nothing }, - onFailure: function(error_code, error_message) { - console.log(error_message);} + onFailure: function (error_code, error_message) { + console.log(error_message); + }, }); - } + }, /* Receive a notification from IDL and route to the listeners. This is called from the IDL C code; the user should never need to use this method directly. */ - , notifyJS: function(value) - { - var event = new CustomEvent('IDLNotify',{'detail':value}); + notifyJS: function (value) { + var event = new CustomEvent('IDLNotify', { detail: value }); document.dispatchEvent(event); - } + }, /* Register a listener to receive notifications from IDL. @@ -62,8 +60,8 @@ if (typeof IDL === "undefined") { Usage: IDL.addEventListener(myIDLListener); */ - , addEventListener: function(listener) { - document.addEventListener("IDLNotify", listener); - } + addEventListener: function (listener) { + document.addEventListener('IDLNotify', listener); + }, }; } diff --git a/idl/vscode/idl.json b/idl/vscode/idl.json index da7c38c86..04e234375 100644 --- a/idl/vscode/idl.json +++ b/idl/vscode/idl.json @@ -4,13 +4,15 @@ "quotes": "single", "methods": "dot", "keywords": "lower", - "properties": "lower", + "properties": "match", "control": "lower", "numbers": "lower", "hex": "lower", "octal": "lower", "binary": "lower", "routines": "match", + "routineMethods": "camel", + "structureNames": "pascal", "systemVariables": "lower", "localVariables": "match" }, diff --git a/idl/vscode/notebooks/envi/envinotebook__define.pro b/idl/vscode/notebooks/envi/envinotebook__define.pro index c171d315e..f05348619 100644 --- a/idl/vscode/notebooks/envi/envinotebook__define.pro +++ b/idl/vscode/notebooks/envi/envinotebook__define.pro @@ -10,10 +10,10 @@ ; The dataset to display in a notebook ; ; :Keywords: -; allow_many_bands: in, optional, Boolean -; If set, and `animate` is set, allows the display of more -; than 12 bands of data. By default, an error is thrown if you have 12 or -; more bands to limit the size of notebook files. +; allow_many: in, optional, Boolean +; If set, and `animate` is set or we are displaying a raster series, allows +; the display of more than 12 bands or rasters. By default, an error is thrown if +; ou have 12 or more bands to limit the size of notebook files. ; animate: in, optional, Boolean ; If set, and we are displaying an ENVI Raster, then we will create an ; animation of each band @@ -21,6 +21,10 @@ ; If set, and we are displaying an ENVI Raster, then we will create ; a 3d data cube representation showing a visual of the raster with ; a spectral representation along the top and right sides of the image +; no_stretch: in, optional, Boolean +; If set, then bands or rasters that are diplsyed will not have a stretch applied. +; +; This keyword does not apply when creating a raster cube ; size: in, optional, Number ; Specify the largest dimension of the thumbnail (columns or rows). The ; input raster's aspect ratio will be retained. @@ -46,7 +50,7 @@ ; ``` ; ;- -pro ENVINotebook::Display, dataset, allow_many_bands = allow_many_bands, animate = animate, cube = cube, size = size +pro ENVINotebook::Display, dataset, allow_many = allow_many, animate = animate, cube = cube, no_stretch = no_stretch, size = size compile_opt idl2, hidden, static on_error, 2 @@ -56,6 +60,10 @@ pro ENVINotebook::Display, dataset, allow_many_bands = allow_many_bands, animate message, 'ENVI has not started yet, required!' endif + ; make sure we passed in a dataset + if (dataset eq !null) then $ + message, 'Please specify a dataset to display', level = -1 + ; make sure we have system vars vscode_notebookInit @@ -69,7 +77,7 @@ pro ENVINotebook::Display, dataset, allow_many_bands = allow_many_bands, animate ;+ ; Band animation ;- - keyword_set(animate): ENVINotebook_AnimateBands, dataset, size = size, allow_many_bands = allow_many_bands + keyword_set(animate): ENVINotebook_AnimateBands, dataset, allow_many_bands = allow_many, no_stretch = no_stretch, size = size ;+ ; Spectral data cube @@ -79,14 +87,14 @@ pro ENVINotebook::Display, dataset, allow_many_bands = allow_many_bands, animate ;+ ; Normal display of raster ;- - else: ENVINotebook_DisplayRaster, dataset, size = size + else: ENVINotebook_DisplayRaster, dataset, no_stretch = no_stretch, size = size endcase end ;+ ; Displaying raster series ;- - isa(dataset, 'envirasterseries'): ENVINotebook_DisplayRasterSeries, dataset, size = size + isa(dataset, 'envirasterseries'): ENVINotebook_DisplayRasterSeries, dataset, allow_many_rasters = allow_many, no_stretch = no_stretch, size = size ;+ ; Unknown data type @@ -151,11 +159,15 @@ pro ENVINotebook::DisplayInMap, dataset, properties, $ message, 'ENVI has not started yet, required!' endif + ; make sure we passed in a dataset + if (dataset eq !null) then $ + message, 'Please specify a dataset to display', level = -1 + ; make sure we have system vars vscode_notebookInit ; determine how to proceed - IDLNotebook.AddToNotebookMap, dataset, properties, is_geojson_uri = is_geojson_uri + IDLNotebook.addToNotebookMap, dataset, properties, is_geojson_uri = is_geojson_uri end ;+ @@ -177,14 +189,14 @@ pro ENVINotebook::EmbedProgress, stop = stop vscode_notebookInit ; return if already registered - if (obj_valid(!idlnotebookmagic.envilistener)) then begin + if (obj_valid(!idlnotebookmagic.ENVIlistener)) then begin ; stop listening to events - if keyword_set(stop) then !idlnotebookmagic.envilistener.cleanup + if keyword_set(stop) then !idlnotebookmagic.ENVIlistener.cleanup return endif ; create message interceptor and save - !idlnotebookmagic.envilistener = VSCodeENVIMessageInterceptor() + !idlnotebookmagic.ENVIlistener = VSCodeENVIMessageInterceptor() end ;+ diff --git a/idl/vscode/notebooks/envi/envinotebook_animatebands.pro b/idl/vscode/notebooks/envi/envinotebook_animatebands.pro index a62d2f12d..ccd1d7a19 100644 --- a/idl/vscode/notebooks/envi/envinotebook_animatebands.pro +++ b/idl/vscode/notebooks/envi/envinotebook_animatebands.pro @@ -18,6 +18,8 @@ ; :Keywords: ; allow_many_bands: in, optional, Boolean ; If set, allows the display of more than 12 bands of data +; no_stretch: in, optional, Boolean +; If set, then bands that are diplsyed will not have a stretch applied. ; size: in, optional, Number ; Specify the largest dimension of the thumbnail (columns or rows). The ; input raster's aspect ratio will be retained. @@ -42,7 +44,7 @@ ; ``` ; ;- -pro ENVINotebook_AnimateBands, raster, size = size, allow_many_bands = allow_many_bands +pro ENVINotebook_AnimateBands, raster, allow_many_bands = allow_many_bands, no_stretch = no_stretch, size = size compile_opt idl2, hidden on_error, 2 @@ -70,7 +72,7 @@ pro ENVINotebook_AnimateBands, raster, size = size, allow_many_bands = allow_man for i = 0, raster.nbands - 1 do rasters[i] = ENVISubsetRaster(raster, bands = i) ; display rasters - ENVINotebook.display, rasters, size = size + ENVINotebook.display, rasters, no_stretch = no_stretch, size = size ; clean up for i = 0, raster.nbands - 1 do rasters[i].close diff --git a/idl/vscode/notebooks/envi/envinotebook_displayraster.pro b/idl/vscode/notebooks/envi/envinotebook_displayraster.pro index a89b3cf62..502826cec 100644 --- a/idl/vscode/notebooks/envi/envinotebook_displayraster.pro +++ b/idl/vscode/notebooks/envi/envinotebook_displayraster.pro @@ -11,6 +11,8 @@ ; displayed properly ; ; :Keywords: +; no_stretch: in, optional, Boolean +; If set, then bands or rasters that are diplsyed will not have a stretch applied. ; size: in, optional, Number ; Specify the largest dimension of the thumbnail (columns or rows). The ; input raster's aspect ratio will be retained. @@ -36,7 +38,7 @@ ; ``` ; ;- -pro ENVINotebook_DisplayRaster, raster, size = size +pro ENVINotebook_DisplayRaster, raster, no_stretch = no_stretch, size = size compile_opt idl2, hidden on_error, 2 @@ -74,6 +76,7 @@ pro ENVINotebook_DisplayRaster, raster, size = size ; make thumbnail uri = !null AwesomeGenerateThumbnail, $ + no_stretch = no_stretch, $ input_raster = useRasters[i], $ thumbnail_size = size, $ output_png_uri = uri @@ -91,14 +94,14 @@ pro ENVINotebook_DisplayRaster, raster, size = size if (nRasters eq 1) then begin struct = {IDLNotebookImage_FromUri} struct.uri = uris[0] - struct.xsize = info.dimensions[0] - struct.ysize = info.dimensions[1] - IDLNotebook.AddToNotebook, struct + struct.xSize = info.dimensions[0] + struct.ySize = info.dimensions[1] + IDLNotebook.addToNotebook, struct endif else begin struct = {IDLNotebookImage_AnimationFromUris} struct.uris = list(uris, /extract) - struct.xsize = info.dimensions[0] - struct.ysize = info.dimensions[1] - IDLNotebook.AddToNotebook, struct + struct.xSize = info.dimensions[0] + struct.ySize = info.dimensions[1] + IDLNotebook.addToNotebook, struct endelse end \ No newline at end of file diff --git a/idl/vscode/notebooks/envi/envinotebook_displayrastercube.pro b/idl/vscode/notebooks/envi/envinotebook_displayrastercube.pro index ec2e88a00..277dd37d7 100644 --- a/idl/vscode/notebooks/envi/envinotebook_displayrastercube.pro +++ b/idl/vscode/notebooks/envi/envinotebook_displayrastercube.pro @@ -117,7 +117,7 @@ pro ENVINotebook_DisplayRasterCube, raster, size = size ; add to notebook struct = {IDLNotebookImage_FromUri} struct.uri = uri - struct.xsize = info.dimensions[0] - struct.ysize = info.dimensions[1] - IDLNotebook.AddToNotebook, struct + struct.xSize = info.dimensions[0] + struct.ySize = info.dimensions[1] + IDLNotebook.addToNotebook, struct end \ No newline at end of file diff --git a/idl/vscode/notebooks/envi/envinotebook_displayrasterseries.pro b/idl/vscode/notebooks/envi/envinotebook_displayrasterseries.pro index 2d4525f0e..ac7ac57f9 100644 --- a/idl/vscode/notebooks/envi/envinotebook_displayrasterseries.pro +++ b/idl/vscode/notebooks/envi/envinotebook_displayrasterseries.pro @@ -18,6 +18,8 @@ ; :Keywords: ; allow_many_rasters: bidirectional, optional, any ; Placeholder docs for argument, keyword, or property +; no_stretch: in, optional, Boolean +; If set, rasters that are diplsyed will not have a stretch applied. ; size: in, optional, Number ; Specify the largest dimension of the thumbnail (columns or rows). The ; input raster's aspect ratio will be retained. @@ -44,7 +46,7 @@ ; ``` ; ;- -pro ENVINotebook_DisplayRasterSeries, series, size = size, allow_many_rasters = allow_many_rasters +pro ENVINotebook_DisplayRasterSeries, series, allow_many_rasters = allow_many_rasters, no_stretch = no_stretch, size = size compile_opt idl2, hidden on_error, 2 @@ -72,5 +74,5 @@ pro ENVINotebook_DisplayRasterSeries, series, size = size, allow_many_rasters = foreach raster, series, i do rasters[i] = raster ; display rasters - ENVINotebook.Display, rasters + ENVINotebook.display, rasters, no_stretch = no_stretch, size = size end \ No newline at end of file diff --git a/idl/vscode/notebooks/envi/enviraster__getextents.pro b/idl/vscode/notebooks/envi/enviraster__getextents.pro index a21f04720..47e8c1428 100644 --- a/idl/vscode/notebooks/envi/enviraster__getextents.pro +++ b/idl/vscode/notebooks/envi/enviraster__getextents.pro @@ -42,10 +42,10 @@ function ENVIRaster::getExtents, epsgCode ; create data structure extents = {IDLNotebookMap_Extents} extents.epsg = epsgCode - extents.xmin = min(lon) - extents.xmax = max(lon) - extents.ymin = min(lat) - extents.ymax = max(lat) + extents.xMin = min(lon) + extents.xMax = max(lon) + extents.yMin = min(lat) + extents.yMax = max(lat) ; return return, extents diff --git a/idl/vscode/notebooks/envi/enviraster__getoutline.pro b/idl/vscode/notebooks/envi/enviraster__getoutline.pro index 2578f3b78..456154977 100644 --- a/idl/vscode/notebooks/envi/enviraster__getoutline.pro +++ b/idl/vscode/notebooks/envi/enviraster__getoutline.pro @@ -84,7 +84,7 @@ function getRasterBBox, raster, epsg, skip_holes = skip_holes, method = method if ~keyword_set(method) then method = 'idl' ; get the max pyramid level - raster._component.GetProperty, pyramid_levels = maxPyramidLevel + raster._component.getProperty, pyramid_levels = maxPyramidLevel ; get the pyramid level we read at readlevel = maxPyramidLevel - 2 > 0 @@ -93,7 +93,7 @@ function getRasterBBox, raster, epsg, skip_holes = skip_holes, method = method !null = IDLcf$DefaultRasterDisplayBands(raster._component, useBands) ; Get data at a reduced pyramid level - subtract 2 to put us at 1024 x 1024 - if (~raster._component.GetData(dat, level = readlevel, $ + if (~raster._component.getData(dat, level = readlevel, $ bands = useBands, $ pixelstate = ps, $ interleave = 0)) then begin @@ -147,7 +147,7 @@ function getRasterBBox, raster, epsg, skip_holes = skip_holes, method = method ; check if we need to convert our coordinates if (coordSys ne !null) then begin - sRef.convertFiletoLonLat, lon, lat, lon, lat + sRef.convertFileToLonLat, lon, lat, lon, lat ; convert center from old to new coordinate system coordSys.convertLonLatToLonLat, lon, lat, lon, lat, ENVICoordSys(coord_sys_code = epsg) @@ -224,7 +224,7 @@ function getRasterBBox, raster, epsg, skip_holes = skip_holes, method = method tot1 += n_elements(newIdx) ; get the area of our vertices - area = abs(poly_area(verts[0, *], verts[1, *])) + area = abs(Poly_area(verts[0, *], verts[1, *])) ; check if our area is too small and we need to skip if (area le IGNORE_CLUMP_MINIMUM) then continue @@ -336,7 +336,7 @@ file = filepath('qb_boulder_msi', root_dir = e.root_dir, $ subdirectory = ['data']) file = 'c:\Users\znorman\Downloads\CAPELLA_C09_SM_GEO_HH_20230528080239_20230528080244.tif' ; file = 'c:\TradeshowContent\ENVI_DEMOS\SAR\SICD\Helicopters\sar_cog.tif' -raster = e.OpenRaster(file) +raster = e.openRaster(file) tic print, raster.getOutline(3857) diff --git a/idl/vscode/notebooks/envi/helpers/awesomegeneratethumbnail.pro b/idl/vscode/notebooks/envi/helpers/awesomegeneratethumbnail.pro index fadd8c7bf..621b04cc1 100644 --- a/idl/vscode/notebooks/envi/helpers/awesomegeneratethumbnail.pro +++ b/idl/vscode/notebooks/envi/helpers/awesomegeneratethumbnail.pro @@ -54,11 +54,11 @@ pro AwesomeGenerateThumbnail, $ ; Getting information about inputRaster !null = IDLcf$DefaultRasterDisplayBands(inputRaster._component, useBands) - inputRaster._component.GetProperty, pyramid_levels = maxPyramidLevel + inputRaster._component.getProperty, pyramid_levels = maxPyramidLevel pyramidLevel = AwesomeGenerateThumbnailGetPyramidLevel(inputRaster.nsamples, inputRaster.nlines, thumbnailSize) < maxPyramidLevel ; Get data at a reduced pyramid level - if (~inputRaster._component.GetData(data, level = pyramidLevel, $ + if (~inputRaster._component.getData(data, level = pyramidLevel, $ bands = useBands, $ pixelstate = pixelState, $ interleave = 0)) then begin @@ -81,7 +81,7 @@ pro AwesomeGenerateThumbnail, $ alpha = (pixelState eq 0) * 255b ; Dealing with images that have a colormap - inputRaster.GetProperty, colormap = colormap + inputRaster.getProperty, colormap = colormap if (isa(colormap, 'EnviColorMap')) then begin colordata = bytarr(dimensions[0], dimensions[1], 3, /nozero) colordata[0, 0, 0] = colormap.red[data] @@ -102,8 +102,8 @@ pro AwesomeGenerateThumbnail, $ for i = 0, 2 do begin band = data[*, *, i] oHist = obj_new('IDLcfHistogram', data = band) - minVal = oHist.StretchValue(2.) - maxVal = oHist.StretchValue(98.) + minVal = oHist.stretchValue(2.) + maxVal = oHist.stretchValue(98.) histData[*, *, i] = bytscl(band, min = minVal, max = maxVal, /nan) obj_destroy, oHist endfor @@ -112,9 +112,9 @@ pro AwesomeGenerateThumbnail, $ ; Add alpha band thumbnailList = list() - thumbnailList.Add, data - thumbnailList.Add, alpha - data = thumbnailList.ToArray(dimension = 3) + thumbnailList.add, data + thumbnailList.add, alpha + data = thumbnailList.toArray(dimension = 3) ; Converting to the correct size if (dimensions[0] gt dimensions[1]) then begin diff --git a/idl/vscode/notebooks/envi/helpers/roi_parse.pro b/idl/vscode/notebooks/envi/helpers/roi_parse.pro index 55dd60859..938317536 100644 --- a/idl/vscode/notebooks/envi/helpers/roi_parse.pro +++ b/idl/vscode/notebooks/envi/helpers/roi_parse.pro @@ -24,12 +24,12 @@ function _roi_parse_properties, node props = orderedhash() ; get our attributes - attrs = node.GetAttributes() + attrs = node.getAttributes() n = attrs.getLength() if (n gt 0) then begin for i = 0, n - 1 do begin - attr = attrs.Item(i) - props[attr.GetNodeName()] = attr.GetNodeValue() + attr = attrs.item(i) + props[attr.getNodeName()] = attr.getNodeValue() endfor endif @@ -78,18 +78,18 @@ function ROI_Parse, roi_uri, debug = debug ; make our parser and load the XML file dom = IDLffXMLDOMDocument() - dom.Load, filename = roi_uri + dom.load, filename = roi_uri ; get region definitions in the XML - regions = dom.GetElementsByTagName('Region') - n = regions.GetLength() + regions = dom.getElementsByTagName('Region') + n = regions.getLength() ; make sure we have regions to process if (n gt 0) then begin ; process all regions in the XML for i = 0, n - 1 do begin ; get the node for our ROI - region = regions.Item(i) + region = regions.item(i) ; get our name and color props = _roi_parse_properties(region) @@ -107,32 +107,32 @@ function ROI_Parse, roi_uri, debug = debug endif ; process all geometry definitions - geometries = region.GetElementsByTagName('GeometryDef') - nGeo = geometries.GetLength() + geometries = region.getElementsByTagName('GeometryDef') + nGeo = geometries.getLength() if (nGeo gt 0) then begin for j = 0, nGeo - 1 do begin ; get the geometry definition - geo = geometries.Item(j) + geo = geometries.item(j) ; flags for geometry type for where to save afterwards wasPoints = !false wasLines = !false ; verify coord sys string - coordSysList = geo.GetElementsByTagName('CoordSysStr') - nCoordSys = coordSysList.GetLength() + coordSysList = geo.getElementsByTagName('CoordSysStr') + nCoordSys = coordSysList.getLength() if (nCoordSys eq 0) then continue - coordSysNode = coordSysList.Item(0) - kids = coordSysNode.GetChildNodes() - coordSysNode = kids.Item(0) - coordSys = coordSysNode.GetNodeValue() + coordSysNode = coordSysList.item(0) + kids = coordSysNode.getChildNodes() + coordSysNode = kids.item(0) + coordSys = coordSysNode.getNodeValue() ; skip if no coord sys if ~keyword_set(coordSys) then continue ; get all coordinates nodes in our geometry - coordsNodes = geo.GetElementsByTagName('Coordinates') - nCoords = coordsNodes.GetLength() + coordsNodes = geo.getElementsByTagName('Coordinates') + nCoords = coordsNodes.getLength() ; skip if nothing if (nCoords eq 0) then continue @@ -153,11 +153,11 @@ function ROI_Parse, roi_uri, debug = debug ; process each set of coordinates for z = 0, nCoords - 1 do begin ; get the item - coordsNode = coordsNodes.Item(z) - parent = coordsNode.GetParentNode() + coordsNode = coordsNodes.item(z) + parent = coordsNode.getParentNode() ; make coordinates pretty - coords = (coordsNode.GetFirstChild()).GetData() + coords = (coordsNode.getFirstChild()).getData() num = double(strsplit(coords, ' ', /extract)) nvertices[z] = n_elements(num) / 2 num = reform(num, [2, nvertices[z]]) @@ -175,8 +175,8 @@ function ROI_Parse, roi_uri, debug = debug case geomName of 'LinearRing': begin ; get the grandparent - grandparent = parent.GetParentNode() - grandParentName = grandparent.GetNodeName() + grandparent = parent.getParentNode() + grandParentName = grandparent.getNodeName() ; save aux info about the grandparent aux[z] = grandParentName diff --git a/idl/vscode/notebooks/envi/helpers/roitogeojson.pro b/idl/vscode/notebooks/envi/helpers/roitogeojson.pro index 0555067af..448b64ea4 100644 --- a/idl/vscode/notebooks/envi/helpers/roitogeojson.pro +++ b/idl/vscode/notebooks/envi/helpers/roitogeojson.pro @@ -136,7 +136,7 @@ pro ROItoGeoJSON, $ coordSys = lookup[coordSysStr] ; save info about our ROI properties - properties.Add, roiProps + properties.add, roiProps ; determine our geometry type and condense features to speed processing case geoType of @@ -198,7 +198,7 @@ pro ROItoGeoJSON, $ outputGeo += ']}' ; write to disk - if ~keyword_set(output_geojson_uri) then output_geojson_uri = e.gettemporaryFilename('json') + if ~keyword_set(output_geojson_uri) then output_geojson_uri = e.getTemporaryFilename('json') openw, lun, output_geojson_uri, /get_lun printf, lun, outputGeo, /implied_print free_lun, lun diff --git a/idl/vscode/notebooks/envi/helpers/shapefiletogeojson.pro b/idl/vscode/notebooks/envi/helpers/shapefiletogeojson.pro index e34c39f8b..f9c088247 100644 --- a/idl/vscode/notebooks/envi/helpers/shapefiletogeojson.pro +++ b/idl/vscode/notebooks/envi/helpers/shapefiletogeojson.pro @@ -189,7 +189,7 @@ pro ShapeFileToGeoJSON, $ ; create a nice string for each property fixed = list() for i = 0, n_elements(attributes) - 1 do begin - fixed.Add, '{' + strjoin(attNames + reform(strings[i, *]) + back, ',') + '}' + fixed.add, '{' + strjoin(attNames + reform(strings[i, *]) + back, ',') + '}' endfor ; get our entities and iterate over each one @@ -247,7 +247,7 @@ pro ShapeFileToGeoJSON, $ ; convert our coordinates coordSys.convertMapToLonLat, reform(vert[0, *]), reform(vert[1, *]), lon, lat - coordSys.convertlonLatToLonLat, lon, lat, lon, lat, output_coord_sys + coordSys.convertLonLatToLonLat, lon, lat, lon, lat, output_coord_sys nPts = n_elements(lon) ; create a list for our vertices @@ -282,13 +282,13 @@ pro ShapeFileToGeoJSON, $ multipoints.add, 1 endif else begin vertItem = list() - for i = 0, nPts - 1 do vertItem.Add, [lon[i], lat[i]] + for i = 0, nPts - 1 do vertItem.add, [lon[i], lat[i]] verts.add, vertItem multipoints.add, 0 endelse endif else begin vertItem = list() - for i = 0, nPts - 1 do vertItem.Add, [lon[i], lat[i]] + for i = 0, nPts - 1 do vertItem.add, [lon[i], lat[i]] verts.add, vertItem multipoints.add, 0 endelse @@ -303,16 +303,16 @@ pro ShapeFileToGeoJSON, $ ; how do we proceed case (1) of ((types[idx] eq 'Polygon') && (~multipoints[idx])): begin - strs.Add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(list(vert)) + '}}' + strs.add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(list(vert)) + '}}' end (types[idx] eq 'Point' && (n_elements(vert) eq 1)): begin - strs.Add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert[0]) + '}}' + strs.add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert[0]) + '}}' end (types[idx] eq 'LineString'): begin - strs.Add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert[0]) + '}}' + strs.add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert[0]) + '}}' end else: begin - strs.Add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert) + '}}' + strs.add, '{"type":"Feature","properties":' + fixed[z] + ',"geometry":{"type":"' + types[idx] + '","coordinates":' + ShapeFileToGeoJSON_Serialize(vert) + '}}' end endcase endforeach @@ -332,7 +332,7 @@ pro ShapeFileToGeoJSON, $ ; create our output json filename if ~keyword_set(output_geojson_uri) then begin - output_geojson_uri = e.gettemporaryFilename('json') + output_geojson_uri = e.getTemporaryFilename('json') endif openw, lun, output_geojson_uri, /get_lun printf, lun, outputGeo, /implied_print diff --git a/idl/vscode/notebooks/envi/helpers/zhull.pro b/idl/vscode/notebooks/envi/helpers/zhull.pro index 5fc039520..9f0d586a7 100644 --- a/idl/vscode/notebooks/envi/helpers/zhull.pro +++ b/idl/vscode/notebooks/envi/helpers/zhull.pro @@ -4,20 +4,20 @@ ; by recursively using IDLs ```idl qhull``` procedure to extract convex and ; concave features. Using ```idl qhull``` by itself only processes convex features ; and preserves outer edge points. -; +; ; For processing, see the `min_area` parameter below which controls when IDL uses ; recursion for processing concave features. ; ; :Returns: ; Returns the indices for the vertices in the specified polygon that ; make up the smoothed shape. -; +; ; This means that the original shape must be subsetted with `verts[*,idx]` ; where `idx` is returned from this routine. -; +; ; If there is an error, or if there are no vertices, then this routine ; returns a value of `!null`. -; +; ; :Params: ; x: in, required, type=numberarray ; Specify the `x` vertices of the feature you want to smooth. @@ -31,64 +31,64 @@ ; DEBUG: in, optional, type=boolean, private ; If set, errors are stopped on. ; MIN_AREA: in, optional, type=float, default=0.1 -; Specify the minimum size of features that you want to +; Specify the minimum size of features that you want to ; have included. By default ```idl qhull``` only extracts edge features -; so this parameter indicates how large a concave polygon must be to +; so this parameter indicates how large a concave polygon must be to ; have it's major vertices extracted. -; +; ; As this parameter is increased, the shapes have fewer points. Setting to ; a smaller value preserves more points. ; ; :Author: Zachary Norman - GitHub: znorman-harris ;- function zhull, x, y, nLevels, level, area, $ - DEBUG = debug, $ - MIN_AREA = min_area + debug = debug, $ + min_area = min_area compile_opt idl2, hidden if ~keyword_set(debug) then on_error, 2 - - ;calculate base information + + ; calculate base information if (level eq !null) then level = 0 if (min_area eq !null) then min_area = .01 - if (area eq !null) then area = poly_area(x,y) + if (area eq !null) then area = Poly_area(x, y) if (nLevels eq !null) then nLevels = 10 - ;get hull information - qhull, x, y, tr, /DELAUNAY, BOUNDS=hIdx, CONNECTIVITY=conn + ; get hull information + qhull, x, y, tr, /delaunay, bounds = hIdx, connectivity = conn hIdx = hIdx.sort() nEdges = n_elements(hIdx) - ;track the indices that we are adding - newEdges = list(hIdx, /EXTRACT) + ; track the indices that we are adding + newEdges = list(hIdx, /extract) - ;get the level of depth we will be in + ; get the level of depth we will be in newLevel = level + 1 - ;return if more than max number of levels + ; return if more than max number of levels if (newLevel gt nLevels) then return, !null - ;process each potential segment - for j=0, nEdges-2 do begin - ;skip if our two points are next to each other - if ((hIdx[j+1] - hIdx[j]) eq 1) then continue + ; process each potential segment + for j = 0, nEdges - 2 do begin + ; skip if our two points are next to each other + if ((hIdx[j + 1] - hIdx[j]) eq 1) then continue - ;get the indices of our polygon and close with first point - newIdx = [[hIdx[j]:hIdx[j+1]], hIdx[j]] + ; get the indices of our polygon and close with first point + newIdx = [[hIdx[j] : hIdx[j + 1]], hIdx[j]] - ;get new x and y, calculate new area + ; get new x and y, calculate new area newX = x[newIdx] newY = y[newIdx] - newArea = poly_area(newX, newY) + newArea = Poly_area(newX, newY) - ;get the change in area and skip if less than our threshold - added = newArea/area + ; get the change in area and skip if less than our threshold + added = newArea / area if (added le min_area) then continue - ;recurse - tmp = zhull(newX, newY, nLevels, newLevel, area, MIN_AREA = min_area) - if (tmp ne !null) then newEdges.add, newIdx[tmp], /EXTRACT + ; recurse + tmp = zhull(newX, newY, nLevels, newLevel, area, min_area = min_area) + if (tmp ne !null) then newEdges.add, newIdx[tmp], /extract endfor - ;return the indices + ; return the indices return, (newEdges.toArray()).uniq() end \ No newline at end of file diff --git a/idl/vscode/notebooks/envi/vscodeenvimessageinterceptor__define.pro b/idl/vscode/notebooks/envi/vscodeenvimessageinterceptor__define.pro index cfc92808e..21079f998 100644 --- a/idl/vscode/notebooks/envi/vscodeenvimessageinterceptor__define.pro +++ b/idl/vscode/notebooks/envi/vscodeenvimessageinterceptor__define.pro @@ -2,7 +2,7 @@ ; :Description: ; Creates our message interceptor and registers it with ENVI (requires that ENVI is launched) ; -; :Returns: VSCodeENVIMessageInterceptor +; :Returns: VsCodeENVIMessageInterceptor ; ; :Keywords: ; verbose: in, optional, Boolean @@ -21,15 +21,15 @@ function VSCodeENVIMessageInterceptor::Init, verbose = verbose if (e eq !null) then message, 'ENVI has not started yet, required!', level = -1 ; init super - if (~self.ENVIMessageHandler::Init()) then begin + if (~self.enviMessageHandler::init()) then begin return, 0 endif ; init properties self.stack = 0 self.verbose = keyword_set(verbose) - self.laststart = list() - self.lastprogress = list() + self.lastStart = list() + self.lastProgress = list() ; get the channel and subscribe oChannel = e.getBroadcastChannel() @@ -49,7 +49,7 @@ pro VSCodeENVIMessageInterceptor::Cleanup on_error, 2 ; clean up super - self.ENVIMessageHandler::Cleanup + self.enviMessageHandler::cleanup ; get ENVI e = envi(/current) @@ -83,7 +83,7 @@ pro VSCodeENVIMessageInterceptor::OnMessage, msg ; Start of progress ;- isa(msg, 'ENVIStartMessage'): begin - if (n_elements(self.laststart) gt 0) then begin + if (n_elements(self.lastStart) gt 0) then begin if (self.laststart[-1] eq msg.message) then return endif @@ -96,8 +96,8 @@ pro VSCodeENVIMessageInterceptor::OnMessage, msg print, indent + useMsg.trim() ; track info about progress - self.laststart.add, msg.message - self.lastprogress.add, -1 + self.lastStart.add, msg.message + self.lastProgress.add, -1 end ;+ @@ -108,7 +108,7 @@ pro VSCodeENVIMessageInterceptor::OnMessage, msg if (msg.percent le self.lastprogress[self.stack - 1]) then return ; track current progress - self.lastprogress[self.stack - 1] = msg.percent + self.lastProgress[self.stack - 1] = msg.percent if (self.stack eq 1 || self.stack gt 1 and self.verbose) then $ print, strjoin([indent, msg.message.trim(), ' ', strtrim(long(msg.percent), 2), '%']) @@ -122,8 +122,8 @@ pro VSCodeENVIMessageInterceptor::OnMessage, msg self.stack-- ; remove last progress - self.laststart.remove - self.lastprogress.remove + self.lastStart.remove + self.lastProgress.remove ; attempt to print if (self.stack eq 0 || self.stack gt 0 and self.verbose) then begin @@ -137,10 +137,10 @@ pro VSCodeENVIMessageInterceptor::OnMessage, msg end ;+ -; :VSCodeENVIMessageInterceptor: -; lastprogress: List +; :VsCodeENVIMessageInterceptor: +; lastProgress: List ; Track the previous progress percentage -; laststart: List +; lastStart: List ; Titles of start messages to filter duplicates ; stack: Long ; The number of pending progress bars @@ -151,10 +151,10 @@ end pro VSCodeENVIMessageInterceptor__define compile_opt idl2, hidden on_error, 2 - !null = {VSCodeENVIMessageInterceptor, $ + !null = {VsCodeENVIMessageInterceptor, $ inherits ENVIMessageHandler, $ stack: 0l, $ - laststart: list(), $ - lastprogress: list(), $ + lastStart: list(), $ + lastProgress: list(), $ verbose: !false} end \ No newline at end of file diff --git a/idl/vscode/notebooks/graphic__refresh.pro b/idl/vscode/notebooks/graphic__refresh.pro index a64e856d2..2a660c1ca 100644 --- a/idl/vscode/notebooks/graphic__refresh.pro +++ b/idl/vscode/notebooks/graphic__refresh.pro @@ -9,26 +9,26 @@ pro Graphic::Refresh, disable = disable compile_opt idl2, hidden if (isa(self.__obj__)) then begin - oTool = self.__obj__.GetTool() + oTool = self.__obj__.getTool() if (isa(oTool)) then begin if (keyword_set(disable)) then begin - oTool.DisableUpdates + oTool.disableUpdates endif else begin - oTool.DisableUpdates, previously_disabled = wasDisabled - oTool.EnableUpdates + oTool.disableUpdates, previously_disabled = wasDisabled + oTool.enableUpdates ; If we weren't disabled before, then the EnableUpdates will not ; actually do a re-draw. So force the re-draw. if (~wasDisabled) then begin - oWin = oTool.GetCurrentWindow() + oWin = oTool.getCurrentWindow() if (!magic.embed) then begin !magic.window = obj_valid(oWin, /get_heap_id) !magic.type = 1 dim = oWin.dimensions !magic.xsize = dim[0] !magic.ysize = dim[1] - IDLNotebook.AddToNotebook, !magic + IDLNotebook.addToNotebook, !magic endif - if (isa(oWin)) then oWin.Draw + if (isa(oWin)) then oWin.draw endif endelse endif diff --git a/idl/vscode/notebooks/idlititool__refreshcurrentview.pro b/idl/vscode/notebooks/idlititool__refreshcurrentview.pro index dfcaabb11..caef5e900 100644 --- a/idl/vscode/notebooks/idlititool__refreshcurrentview.pro +++ b/idl/vscode/notebooks/idlititool__refreshcurrentview.pro @@ -18,7 +18,7 @@ pro IDLitTool::RefreshCurrentWindow return ; updates disabled, increment and return. endif - oWin = self.GetCurrentWindow() + oWin = self.getCurrentWindow() if (~obj_valid(oWin)) then $ return @@ -31,9 +31,9 @@ pro IDLitTool::RefreshCurrentWindow dim = oWin.dimensions !magic.xsize = dim[0] !magic.ysize = dim[1] - IDLNotebook.AddToNotebook, !magic + IDLNotebook.addToNotebook, !magic endif - oWin.Draw + oWin.draw self._bnoredraw = 0b endif end \ No newline at end of file diff --git a/idl/vscode/notebooks/idlnotebook/idlnotebook__define.pro b/idl/vscode/notebooks/idlnotebook/idlnotebook__define.pro index 3f3767450..0cc933bfe 100644 --- a/idl/vscode/notebooks/idlnotebook/idlnotebook__define.pro +++ b/idl/vscode/notebooks/idlnotebook/idlnotebook__define.pro @@ -88,7 +88,7 @@ pro IDLNotebook::AddToNotebookMap, item, properties, $ !idlnotebookmagic.mapitems.add, geojsonUriForMap endif else begin geojsonForMap = {IDLNotebookMap_GeoJSON} - geojsonForMap.geojson = item + geojsonForMap.geoJSON = item if keyword_set(properties) then geojsonForMap.properties = properties !idlnotebookmagic.mapitems.add, geojsonForMap endelse @@ -106,7 +106,7 @@ end ; within a notebook cell ; ; :Arguments: -; item: in, required, !magic | IDLNotebookImage_PNG | IDLNotebookImage_FromUri | IDLNotebookImage_AnimationFromUris | IDLNotebookMap | IDLNotebookPlot2D +; item: in, required, !magic | IDLNotebookImage_Png | IDLNotebookImage_FromUri | IDLNotebookImage_AnimationFromUris | IDLNotebookMap | IDLNotebookPlot2D ; The item we are adding to a notebook ; ;- @@ -161,13 +161,13 @@ pro IDLNotebook::AddToNotebook, item endforeach ; track - IDLNotebook._TrackNotebookItem, item + IDLNotebook._trackNotebookItem, item end ;+ ; Check for encoded PNG ;- - isa(item, 'IDLNotebookImage_PNG'): IDLNotebook._TrackNotebookItem, item + isa(item, 'IDLNotebookImage_PNG'): IDLNotebook._trackNotebookItem, item ;+ ; Check for image we are adding from a URI @@ -179,18 +179,18 @@ pro IDLNotebook::AddToNotebook, item endif ; track - IDLNotebook._TrackNotebookItem, item + IDLNotebook._trackNotebookItem, item end ;+ ; Check for map ;- - isa(item, 'IDLNotebookMap'): IDLNotebookMap._AddToNotebook, item + isa(item, 'IDLNotebookMap'): IDLNotebookMap._addToNotebook, item ;+ ; Check for 2D plot ;- - isa(item, 'IDLNotebookPlot'): IDLNotebookPlot._AddToNotebook, item + isa(item, 'IDLNotebookPlot'): IDLNotebookPlot._addToNotebook, item ;+ ; Throw error because we don't know what we are adding or handling @@ -237,7 +237,7 @@ function IDLNotebook::_CreateNotebookItemProps, item case (!true) of ; remove null strings - isa(val, 'struct'): saveProps[key.toLower()] = IDLNotebook._CreateNotebookItemProps(val) + isa(val, 'struct'): saveProps[key.toLower()] = IDLNotebook._createNotebookItemProps(val) ; remove if !null isa(val, /null): ; do nothing @@ -277,7 +277,7 @@ function IDLNotebook::_CreateNotebookItem, item ; create and return return, {IDLNotebookItem, $ type: strlowcase(tag_names(item, /structure_name)), $ - item: IDLNotebook._CreateNotebookItemProps(item)} + item: IDLNotebook._createNotebookItemProps(item)} end ;+ @@ -293,13 +293,13 @@ function IDLNotebook::ExportItems catch, err if (err ne 0) then begin catch, /cancel - IDLNotebook.AddToNotebook, !magic + IDLNotebook.addToNotebook, !magic endif else begin !null = ENVI.api_version ; only embed non-direct-graphics if ENVI UI is up ; otherwise we get weird items embedded in the UI if (!magic.type ne 0) then begin - IDLNotebook.AddToNotebook, !magic + IDLNotebook.addToNotebook, !magic endif catch, /cancel endelse @@ -312,7 +312,7 @@ function IDLNotebook::ExportItems endif ; add a map to things we export if we have items to map - IDLNotebookMap._AddToNotebook + IDLNotebookMap._addToNotebook ; remove tracked map items !idlnotebookmagic.mapitems.remove, /all @@ -333,10 +333,10 @@ function IDLNotebook::ExportItems if (encoded eq !null) then continue ;+ Create PNG data structre - png = {IDLNotebookImage_PNG} + png = {IDLNotebookImage_Png} png.data = encoded - png.xsize = long(item.magic['xsize']) - png.ysize = long(item.magic['ysize']) + png.xSize = long(item.magic['xsize']) + png.ySize = long(item.magic['ysize']) ; Why doesnt this work?? ; png = {IDLNotebookImage_PNG, $ @@ -345,14 +345,14 @@ function IDLNotebook::ExportItems ; ysize: long(item.magic['ysize'])} ; create exportable structure and return - export.add, IDLNotebook._CreateNotebookItem(png) + export.add, IDLNotebook._createNotebookItem(png) endif else begin export.add, item endelse endforeach ; clean up - IDLNotebook.Reset + IDLNotebook.reset ;+ Return the items to embed return, export @@ -371,7 +371,7 @@ pro IDLNotebook::Export on_error, 2 ;+ Export items and convert to something that is serializable - export = IDLNotebook.ExportItems() + export = IDLNotebook.exportItems() ; check what our IDL version is case (!true) of @@ -402,7 +402,7 @@ function IDLNotebook::Init, _extra = extra on_error, 2 if (isa(extra)) then $ - self.idlnotebook__define::SetProperty, _extra = extra + self.idlNotebook__define::setProperty, _extra = extra return, 1 end @@ -438,7 +438,7 @@ pro IDLNotebook::_TrackNotebookItem, item on_error, 2 ; add and return - !idlnotebookmagic.items.add, IDLNotebook._CreateNotebookItem(item) + !idlnotebookmagic.items.add, IDLNotebook._createNotebookItem(item) end ;+ @@ -446,13 +446,13 @@ end ; Class definition procedure ; ; :IDLNotebook: -; envilistener: VSCodeENVIMessageInterceptor +; enviListener: VSCodeENVIMessageInterceptor ; If we have created an ENVI listener or not ; graphics: OrderedHash ; By window ID, track graphics that we need to embed ; items: List ; The items that we are adding to our notebook -; mapitems: List +; mapItems: List ; The items that we are adding to a map for our given notebook ; cell ; @@ -476,9 +476,9 @@ pro IDLNotebook__define ; Data structure for this class ;- !null = {IDLNotebook, $ - envilistener: obj_new(), $ + enviListener: obj_new(), $ items: list(), $ - mapitems: list(), $ + mapItems: list(), $ graphics: orderedhash()} ;+ @@ -497,7 +497,7 @@ pro IDLNotebook__define ; make sure super magic exists defsysv, '!IDLNotebookMagic', exists = _exists if ~_exists then defsysv, '!IDLNotebookMagic', $ - {IDLNotebook, envilistener: !false, items: list(), mapitems: list(), graphics: orderedhash(/fold_case)} + {IDLNotebook, enviListener: !false, items: list(), mapItems: list(), graphics: orderedhash(/fold_case)} ; load all other structures IDLNotebookImage__define diff --git a/idl/vscode/notebooks/idlnotebook/idlnotebookimage__define.pro b/idl/vscode/notebooks/idlnotebook/idlnotebookimage__define.pro index e43fb6be6..73bd8c359 100644 --- a/idl/vscode/notebooks/idlnotebook/idlnotebookimage__define.pro +++ b/idl/vscode/notebooks/idlnotebook/idlnotebookimage__define.pro @@ -1,11 +1,11 @@ ;+ ; :IDLNotebookImage_Base: -; xsize: Number +; xSize: Number ; The width of the PNG for display -; ysize: Number +; ySize: Number ; The height of the PNG for display ; -; :IDLNotebookImage_PNG: +; :IDLNotebookImage_Png: ; data: String ; Base64 encoded PNG as a string ; @@ -31,13 +31,13 @@ pro IDLNotebookImage__define ; Base datas tructure for image ;- !null = {IDLNotebookImage_Base, $ - xsize: 0l, $ - ysize: 0l} + xSize: 0l, $ + ySize: 0l} ;+ ; Data structure for embedding an image ;- - !null = {IDLNotebookImage_PNG, $ + !null = {IDLNotebookImage_Png, $ inherits IDLNotebookImage_Base, $ data: 'base64'} diff --git a/idl/vscode/notebooks/idlnotebook/idlnotebookmap__define.pro b/idl/vscode/notebooks/idlnotebook/idlnotebookmap__define.pro index e569a2980..47df0d864 100644 --- a/idl/vscode/notebooks/idlnotebook/idlnotebookmap__define.pro +++ b/idl/vscode/notebooks/idlnotebook/idlnotebookmap__define.pro @@ -18,7 +18,7 @@ function IDLNotebookMap::_CreateNotebookItem, val ; Handle raw GeoJSON ;- isa(val, 'IDLNotebookMap_GeoJSON'): begin - return, IDLNotebook._CreateNotebookItem(val) + return, IDLNotebook._createNotebookItem(val) end ;+ @@ -30,7 +30,7 @@ function IDLNotebookMap::_CreateNotebookItem, val endif ; save because we are OK! - return, IDLNotebook._CreateNotebookItem(val) + return, IDLNotebook._createNotebookItem(val) end ;+ @@ -42,7 +42,7 @@ function IDLNotebookMap::_CreateNotebookItem, val endif ; save because we are OK! - return, IDLNotebook._CreateNotebookItem(val) + return, IDLNotebook._createNotebookItem(val) end ;+ @@ -81,19 +81,19 @@ function IDLNotebookMap::_CreateNotebookItem, val ; make new item newItem = {IDLNotebookMap_ImageFromUri} newItem.uri = uri - newItem.xsize = info.dimensions[0] - newItem.ysize = info.dimensions[1] + newItem.xSize = info.dimensions[0] + newItem.ySize = info.dimensions[1] newItem.extents = reproj.getExtents() ; save new item - return, IDLNotebook._CreateNotebookItem(newItem) + return, IDLNotebook._createNotebookItem(newItem) end ;+ ; Handle ROIs ;- isa(val, 'IDLNotebookMap_ROIs'): begin - if n_elements(val.rois) eq 0 then begin + if n_elements(val.ROIs) eq 0 then begin message, '"IDLNotebookMap_ROIs" has no rois to add!', level = -1 endif @@ -107,7 +107,7 @@ function IDLNotebookMap::_CreateNotebookItem, val uri = !null ROItoGeoJSON, $ epsg_code = 3857, $ - input_roi = val.rois.toArray(), $ + input_roi = val.ROIs.toArray(), $ has_features = isROIOK, $ output_geojson_uri = uri @@ -120,7 +120,7 @@ function IDLNotebookMap::_CreateNotebookItem, val newItem.properties = val.properties ; save because we are OK! - return, IDLNotebook._CreateNotebookItem(newItem) + return, IDLNotebook._createNotebookItem(newItem) end ;+ @@ -157,7 +157,7 @@ function IDLNotebookMap::_CreateNotebookItem, val newItem.properties = val.properties ; save because we are OK! - return, IDLNotebook._CreateNotebookItem(newItem) + return, IDLNotebook._createNotebookItem(newItem) end ;+ @@ -201,10 +201,10 @@ pro IDLNotebookMap::_AddToNotebook, item addItem.data = list() ; process all items - foreach val, mapThese do addItem.data.add, IDLNotebookMap._CreateNotebookItem(val) + foreach val, mapThese do addItem.data.add, IDLNotebookMap._createNotebookItem(val) ; track data - IDLNotebook._TrackNotebookItem, addItem + IDLNotebook._trackNotebookItem, addItem end ;+ @@ -219,17 +219,17 @@ end ; :IDLNotebookMap_Extents: ; epsg: Number ; EPSG code for extents -; xmax: Double +; xMax: Double ; Max longitude -; xmin: Double +; xMin: Double ; Min longitude -; ymax: Double +; yMax: Double ; Max latitude -; ymin: Double +; yMin: Double ; Min latitude ; ; :IDLNotebookMap_GeoJSON: -; geojson: String +; geoJSON: String ; GeoJSON string that should be added to a map ; ; :IDLNotebookMap_GeoJSONFromUri: @@ -276,17 +276,17 @@ pro IDLNotebookMap__define ;- !null = {IDLNotebookMap_Extents, $ epsg: 0l, $ - xmin: 0d, $ - ymin: 0d, $ - xmax: 0d, $ - ymax: 0d} + xMin: 0d, $ + yMin: 0d, $ + xMax: 0d, $ + yMax: 0d} ;+ ; Data structure for embedding GeoJON in maps ;- !null = {IDLNotebookMap_GeoJSON, $ inherits IDLNotebookMap_VectorProperties, $ - geojson: ''} + geoJSON: ''} ;+ ; Data structure for embedding GeoJON in maps diff --git a/idl/vscode/notebooks/idlnotebook/idlnotebookplot__define.pro b/idl/vscode/notebooks/idlnotebook/idlnotebookplot__define.pro index 681bedfbf..2bf74f033 100644 --- a/idl/vscode/notebooks/idlnotebook/idlnotebookplot__define.pro +++ b/idl/vscode/notebooks/idlnotebook/idlnotebookplot__define.pro @@ -45,7 +45,7 @@ function IDLNotebookPlot::_CreateNotebookItem, item endif ; create notebook item and return - return, IDLNotebook._CreateNotebookItem(item) + return, IDLNotebook._createNotebookItem(item) end ;+ @@ -59,7 +59,7 @@ function IDLNotebookPlot::_CreateNotebookItem, item if (n_elements(item.frames) eq 0) then message, 'No frames to add for IDLNotebookPlot_LineAnimation', level = -1 ; add to notebook - return, IDLNotebook._CreateNotebookItem(item) + return, IDLNotebook._createNotebookItem(item) end ;+ @@ -73,7 +73,7 @@ function IDLNotebookPlot::_CreateNotebookItem, item if (n_elements(item.frames) eq 0) then message, 'No frames to add for IDLNotebookPlot_LineAnimation', level = -1 ; add to notebook - return, IDLNotebook._CreateNotebookItem(item) + return, IDLNotebook._createNotebookItem(item) end ;+ @@ -124,10 +124,10 @@ pro IDLNotebookPlot::_AddToNotebook, item addItem.properties = obj_valid(item.properties) ? item.properties : orderedhash() ; process all items - foreach val, plotThese do addItem.data.add, IDLNotebookPlot._CreateNotebookItem(val) + foreach val, plotThese do addItem.data.add, IDLNotebookPlot._createNotebookItem(val) ; track data - IDLNotebook._TrackNotebookItem, addItem + IDLNotebook._trackNotebookItem, addItem end ;+ @@ -137,7 +137,7 @@ end ; that we create. ; ; :IDLNotebookPlot: -; data: List +; data: List ; The data to add to our plot ; ; :IDLNotebookPlot_LineFrame: diff --git a/idl/vscode/vscode_getidlinfo.pro b/idl/vscode/vscode_getidlinfo.pro index f699ee9d5..bda2c5011 100644 --- a/idl/vscode/vscode_getidlinfo.pro +++ b/idl/vscode/vscode_getidlinfo.pro @@ -1,7 +1,9 @@ ;+ -; Returns basic information about our IDL session for use in VSCode +; :Description: +; Returns basic information about our IDL session for use in VSCode +; +; This gets version ; -; This gets version ;- pro vscode_getIDLInfo compile_opt idl2, hidden diff --git a/idl/vscode/vscode_opendata.pro b/idl/vscode/vscode_opendata.pro index 71280d7aa..2254c377a 100644 --- a/idl/vscode/vscode_opendata.pro +++ b/idl/vscode/vscode_opendata.pro @@ -56,7 +56,7 @@ pro vscode_openData, uri ; display our raster e.refresh, /disable view = e.getView() - layer = view.CreateLayer(rasters[0]) ; default to first raster + layer = view.createLayer(rasters[0]) ; default to first raster view.zoom, /full_extent e.refresh diff --git a/libs/assembling/assembler/project.json b/libs/assembling/assembler/project.json index a03f1beb2..47bf8dcf1 100644 --- a/libs/assembling/assembler/project.json +++ b/libs/assembling/assembler/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/assembler/**/*.ts"] diff --git a/libs/assembling/config/project.json b/libs/assembling/config/project.json index e3ac7270a..87846e070 100644 --- a/libs/assembling/config/project.json +++ b/libs/assembling/config/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/config/**/*.ts"] diff --git a/libs/assembling/config/src/lib/style-rule-sets.interface.ts b/libs/assembling/config/src/lib/style-rule-sets.interface.ts index f71d88903..f5c7a64a7 100644 --- a/libs/assembling/config/src/lib/style-rule-sets.interface.ts +++ b/libs/assembling/config/src/lib/style-rule-sets.interface.ts @@ -12,15 +12,17 @@ export const MODERN_STYLE_RULE_SET: ICodeStyle = { quotes: STYLE_FLAG_LOOKUP.SINGLE, methods: STYLE_FLAG_LOOKUP.DOT, keywords: STYLE_FLAG_LOOKUP.LOWER, - properties: STYLE_FLAG_LOOKUP.LOWER, + properties: STYLE_FLAG_LOOKUP.CAMEL, control: STYLE_FLAG_LOOKUP.LOWER, numbers: STYLE_FLAG_LOOKUP.LOWER, hex: STYLE_FLAG_LOOKUP.LOWER, octal: STYLE_FLAG_LOOKUP.LOWER, binary: STYLE_FLAG_LOOKUP.LOWER, routines: STYLE_FLAG_LOOKUP.MATCH, + routineMethods: STYLE_FLAG_LOOKUP.CAMEL, systemVariables: STYLE_FLAG_LOOKUP.LOWER, localVariables: STYLE_FLAG_LOOKUP.MATCH, + structureNames: STYLE_FLAG_LOOKUP.PASCAL, }; /** @@ -39,8 +41,10 @@ export const DATED_RULE_SET: ICodeStyle = { octal: STYLE_FLAG_LOOKUP.UPPER, binary: STYLE_FLAG_LOOKUP.UPPER, routines: STYLE_FLAG_LOOKUP.MATCH, + routineMethods: STYLE_FLAG_LOOKUP.PASCAL, systemVariables: STYLE_FLAG_LOOKUP.UPPER, localVariables: STYLE_FLAG_LOOKUP.MATCH, + structureNames: STYLE_FLAG_LOOKUP.UPPER, }; /** diff --git a/libs/assembling/config/src/lib/style.interface.ts b/libs/assembling/config/src/lib/style.interface.ts index b7b4f5965..c03b552b5 100644 --- a/libs/assembling/config/src/lib/style.interface.ts +++ b/libs/assembling/config/src/lib/style.interface.ts @@ -19,6 +19,10 @@ export const ASSEMBLER_STYLER_LOOKUP: IAssemblerStylerLookup = { DEFAULT: 'default', }; +/** Pascal case for style */ +type CamelCaseStyleFlag = 'camel'; +/** Pascal case for style */ +type PascalCaseStyleFlag = 'pascal'; /** Upper case */ type LowerCaseStyleFlag = 'lower'; /** Lower case */ @@ -45,6 +49,17 @@ export type CaseStyleFlags = | UpperCaseStyleFlag | NoneStyleFlag; +/** + * All case style flags, some things don't need all, so thats why they are separate + */ +export type FullCaseStyleFlags = + | MatchStyleFlag + | CamelCaseStyleFlag + | PascalCaseStyleFlag + | LowerCaseStyleFlag + | UpperCaseStyleFlag + | NoneStyleFlag; + /** * When we have style to match, these are our options */ @@ -75,6 +90,8 @@ export type StyleFlag = CaseStyleFlags | MatchStyleFlags | QuoteStyleFlags; /** Strictly typed lookup for fiddler flags */ interface IStyleFlags { + CAMEL: CamelCaseStyleFlag; + PASCAL: PascalCaseStyleFlag; LOWER: LowerCaseStyleFlag; UPPER: UpperCaseStyleFlag; SINGLE: SingleQuoteStyleFlag; @@ -89,6 +106,8 @@ interface IStyleFlags { * Lookup with option flags for the fiddler */ export const STYLE_FLAG_LOOKUP: IStyleFlags = { + CAMEL: 'camel', + PASCAL: 'pascal', LOWER: 'lower', UPPER: 'upper', SINGLE: 'single', @@ -110,20 +129,24 @@ export interface ICodeStyle { /** Do we enforce upper case keywords or not */ keywords: CaseStyleFlags; /** Do we use upper case characters for properties or not */ - properties: MatchStyleFlag | CaseStyleFlags; + properties: FullCaseStyleFlags; /** Are control statements upper or lower case */ control: CaseStyleFlags; - /** Formatting for numbers */ + /** Style for numbers */ numbers: CaseStyleFlags; - /** Indicate how hex numbers (starting with \"0x\", expressed as strings, or hex escape characters in tempalte literals) will be formatted. Modern uses lower case and dated uses upper case. */ + /** Style for how hex numbers (starting with \"0x\", expressed as strings, or hex escape characters in template literals) will be formatted. Modern uses lower case and dated uses upper case. */ hex: CaseStyleFlags; - /** Formatting for octal numbers starting with "0o" */ + /** Style for octal numbers starting with "0o" */ octal: CaseStyleFlags; - /** Formatting for binary numbers starting with "0b" */ + /** Style for binary numbers starting with "0b" */ binary: CaseStyleFlags; - /** Formatting for routines from core ENVI or IDL */ - routines: MatchStyleFlags; - /** Formatting for system variables */ + /** Style for functions and procedures */ + routines: FullCaseStyleFlags; + /** Style for function and procedure methods */ + routineMethods: FullCaseStyleFlags; + /** Style for structure names */ + structureNames: FullCaseStyleFlags; + /** Style for system variables */ systemVariables: CaseStyleFlags; /** How do we format locally defined variables */ localVariables: MatchStyleFlags; diff --git a/libs/assembling/fixers/project.json b/libs/assembling/fixers/project.json index e8a4abf47..9c18ffe2f 100644 --- a/libs/assembling/fixers/project.json +++ b/libs/assembling/fixers/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/fixers/**/*.ts"] diff --git a/libs/assembling/formatters/project.json b/libs/assembling/formatters/project.json index a30cbf061..0409b0224 100644 --- a/libs/assembling/formatters/project.json +++ b/libs/assembling/formatters/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/formatters/**/*.ts"] diff --git a/libs/assembling/json-formatter/project.json b/libs/assembling/json-formatter/project.json index b5d024abe..135f6c9dc 100644 --- a/libs/assembling/json-formatter/project.json +++ b/libs/assembling/json-formatter/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/json-formatter/**/*.ts"] diff --git a/libs/assembling/shared/project.json b/libs/assembling/shared/project.json index 06d73dca2..6c54ae600 100644 --- a/libs/assembling/shared/project.json +++ b/libs/assembling/shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/shared/**/*.ts"] diff --git a/libs/assembling/shared/src/index.ts b/libs/assembling/shared/src/index.ts index 99afafe1b..3381be8b4 100644 --- a/libs/assembling/shared/src/index.ts +++ b/libs/assembling/shared/src/index.ts @@ -1,4 +1,5 @@ export * from './lib/add-code-to-syntax-tree'; -export * from './lib/case-transforms'; +export * from './lib/adjust-case'; export * from './lib/conditional-line-number-increment'; export * from './lib/increment-line-numbers'; +export * from './lib/transform-case'; diff --git a/libs/assembling/shared/src/lib/case-transforms.ts b/libs/assembling/shared/src/lib/adjust-case.ts similarity index 82% rename from libs/assembling/shared/src/lib/case-transforms.ts rename to libs/assembling/shared/src/lib/adjust-case.ts index 1bac10b09..d492cd219 100644 --- a/libs/assembling/shared/src/lib/case-transforms.ts +++ b/libs/assembling/shared/src/lib/adjust-case.ts @@ -1,7 +1,7 @@ import { CaseStyleFlags, STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; /** - * Sets case based on styling + * Simply adjust the case of text without anything fancy being applied */ export function AdjustCase(text: string, flag: CaseStyleFlags) { switch (flag) { diff --git a/libs/assembling/shared/src/lib/transform-case.interface.ts b/libs/assembling/shared/src/lib/transform-case.interface.ts new file mode 100644 index 000000000..546c76264 --- /dev/null +++ b/libs/assembling/shared/src/lib/transform-case.interface.ts @@ -0,0 +1,31 @@ +/** + * When adjusting the case of strings, which characters do + * we make sure to preserve so we don't break case conversion? + */ +export const PRESERVE_CHARS: string[] = [ + '_', // always keep underscore so we dont change syntax + '$', // valid character + '!', // classes/system variables + '.', // methods and properties + '(', // functions + ':', // methods + '-', // methods + '>', // methods +]; + +/** + * Regular expression that find text that should always be upper case + * + * Needs to be a global regex to replace multiple matches at once + */ +export const PASCAL_POST_PROCESS_REGEX = /idl|envi|roi|json/gim; + +/** + * Regular expressions that indicate we have special text to replace with our + * case conversions for camel case + */ +export const CAMEL_POST_PROCESS_REGEX = { + IDL: /^idl(?=[a-z])/im, + ENVI: /^envi(?=[a-z])/im, + UPPER: /(? m.toUpperCase() + ); +} + +/** + * Transforms text to pascal case with special cases for ENVI and IDL + */ +function CamelCaseTransform(referenceText: string) { + /** Convert */ + let converted = camelCase(referenceText, { keep: PRESERVE_CHARS }).replace( + CAMEL_POST_PROCESS_REGEX.UPPER, + (m) => m.toUpperCase() + ); + + // check for special character combinations + switch (true) { + case CAMEL_POST_PROCESS_REGEX.IDL.test(referenceText): + { + converted = + converted.substring(0, 3).toLowerCase() + + converted.substring(3, 4).toUpperCase() + + converted.substring(4); + } + break; + case CAMEL_POST_PROCESS_REGEX.ENVI.test(referenceText): + converted = + converted.substring(0, 4).toLowerCase() + + converted.substring(4, 5).toUpperCase() + + converted.substring(5); + break; + default: + break; + } + + return converted; +} + +/** + * Transforms the case of text to a different type given the + * reference/defined case + */ +export function TransformCase(referenceText: string, flag: FullCaseStyleFlags) { + switch (flag) { + case STYLE_FLAG_LOOKUP.MATCH: + return referenceText; + case STYLE_FLAG_LOOKUP.CAMEL: + return CamelCaseTransform(referenceText); + case STYLE_FLAG_LOOKUP.PASCAL: + return PascalCaseTransform(referenceText); + default: + return AdjustCase(referenceText, flag as CaseStyleFlags); + } +} diff --git a/libs/assembling/styles/project.json b/libs/assembling/styles/project.json index bcba7992f..880069ed2 100644 --- a/libs/assembling/styles/project.json +++ b/libs/assembling/styles/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/styles/**/*.ts"] diff --git a/libs/assembling/styles/src/lib/default/style-call-routine-method.ts b/libs/assembling/styles/src/lib/default/style-call-routine-method.ts index c0288a0d5..05e37c73f 100644 --- a/libs/assembling/styles/src/lib/default/style-call-routine-method.ts +++ b/libs/assembling/styles/src/lib/default/style-call-routine-method.ts @@ -1,4 +1,5 @@ import { STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { ASSEMBLER_DEFAULT_STYLING } from '@idl/assembling/tree-handlers'; import { ITokenCache } from '@idl/parsing/index'; import { TOKEN_NAMES } from '@idl/parsing/tokenizer'; @@ -9,29 +10,30 @@ import { TOKEN_NAMES } from '@idl/parsing/tokenizer'; ASSEMBLER_DEFAULT_STYLING.onBranchToken( TOKEN_NAMES.CALL_FUNCTION_METHOD, (token, parsed, meta) => { - // get the type before - const methods = (token.cache as ITokenCache)?.method; - - // check for data type - if (methods === undefined) { + if (meta.style.routineMethods === STYLE_FLAG_LOOKUP.NONE) { return; } - // return if we dont have any methods - if (methods.length === 0) { + // get the type before + const methods = (token.cache as ITokenCache)?.method; + + // check if we give benefit-of-the-doubt and dont have known + if (methods === undefined || methods.length === 0) { + token.match[0] = token.match[0].replace( + token.match[2], + TransformCase(token.match[2], meta.style.routineMethods) + ); return; } // get the display name for the method const display = methods[0].meta.display; - // check if we need to match - if (meta.style.routines === STYLE_FLAG_LOOKUP.MATCH) { - token.match[0] = token.match[0].replace( - token.match[2], - display.split('::')[1] - ); - } + // check if we need to transform the text + token.match[0] = token.match[0].replace( + token.match[2], + TransformCase(display.split('::')[1], meta.style.routineMethods) + ); } ); @@ -41,28 +43,29 @@ ASSEMBLER_DEFAULT_STYLING.onBranchToken( ASSEMBLER_DEFAULT_STYLING.onBranchToken( TOKEN_NAMES.CALL_PROCEDURE_METHOD, (token, parsed, meta) => { - // get the type before - const methods = (token.cache as ITokenCache)?.method; - - // check for data type - if (methods === undefined) { + if (meta.style.routineMethods === STYLE_FLAG_LOOKUP.NONE) { return; } - // return if we dont have any methods - if (methods.length === 0) { + // get the type before + const methods = (token.cache as ITokenCache)?.method; + + // check if we give benefit-of-the-doubt and dont have known + if (methods === undefined || methods.length === 0) { + token.match[0] = token.match[0].replace( + token.match[2], + TransformCase(token.match[2], meta.style.routineMethods) + ); return; } // get the display name for the method const display = methods[0].meta.display; - // check if we need to match or not - if (meta.style.routines === STYLE_FLAG_LOOKUP.MATCH) { - token.match[0] = token.match[0].replace( - token.match[2], - display.split('::')[1] - ); - } + // check if we need to transform the text + token.match[0] = token.match[0].replace( + token.match[2], + TransformCase(display.split('::')[1], meta.style.routineMethods) + ); } ); diff --git a/libs/assembling/styles/src/lib/default/style-call-routine.ts b/libs/assembling/styles/src/lib/default/style-call-routine.ts index b89556e86..76f19fa97 100644 --- a/libs/assembling/styles/src/lib/default/style-call-routine.ts +++ b/libs/assembling/styles/src/lib/default/style-call-routine.ts @@ -1,4 +1,4 @@ -import { STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { ASSEMBLER_DEFAULT_STYLING } from '@idl/assembling/tree-handlers'; import { GLOBAL_TOKEN_TYPES } from '@idl/data-types/core'; import { IDL_DISPLAY_NAMES } from '@idl/parsing/routines'; @@ -23,17 +23,14 @@ ASSEMBLER_DEFAULT_STYLING.onBranchToken( /** Lower-case name of routine */ const low = token.match[1].replace(/\s/gim, '').toLowerCase(); - // determine how to proceed - switch (true) { - // check if internal function - case low in FUNCTIONS: - if (meta.style.routines === STYLE_FLAG_LOOKUP.MATCH) { - token.match[0] = `${FUNCTIONS[low]}(`; - } - break; - default: - // do nothing - break; + // check if we have a known function + if (low in FUNCTIONS) { + token.match[0] = `${TransformCase(FUNCTIONS[low], meta.style.routines)}(`; + } else { + token.match[0] = TransformCase( + token.match[0].replace(/\s/gim, ''), + meta.style.routines + ); } } ); @@ -47,17 +44,10 @@ ASSEMBLER_DEFAULT_STYLING.onBranchToken( /** Lower-case name of routine */ const low = token.match[0].toLowerCase(); - // determine how to proceed - switch (true) { - // check if internal function - case low in PROCEDURES: - if (meta.style.routines === STYLE_FLAG_LOOKUP.MATCH) { - token.match[0] = PROCEDURES[low]; - } - break; - default: - // do nothing - break; - } + // check if we have a known procedure + token.match[0] = TransformCase( + low in PROCEDURES ? PROCEDURES[low] : token.match[0], + meta.style.routines + ); } ); diff --git a/libs/assembling/styles/src/lib/default/style-properties.ts b/libs/assembling/styles/src/lib/default/style-properties.ts index c0d91e7f6..1a43ed21f 100644 --- a/libs/assembling/styles/src/lib/default/style-properties.ts +++ b/libs/assembling/styles/src/lib/default/style-properties.ts @@ -1,5 +1,4 @@ -import { CaseStyleFlags, STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; -import { AdjustCase } from '@idl/assembling/shared'; +import { TransformCase } from '@idl/assembling/shared'; import { ASSEMBLER_DEFAULT_STYLING } from '@idl/assembling/tree-handlers'; import { ITokenCache } from '@idl/parsing/index'; import { TOKEN_NAMES } from '@idl/parsing/tokenizer'; @@ -15,45 +14,31 @@ const PROPERTIES = [ ASSEMBLER_DEFAULT_STYLING.onBasicToken( TOKEN_NAMES.ACCESS_PROPERTY, (token, parsed, meta) => { - switch (true) { - case meta.style.properties === STYLE_FLAG_LOOKUP.MATCH: { - const prop = (token.cache as ITokenCache).property; - if (prop === undefined) { - return; - } - token.match[0] = `.${prop.display}`; - break; - } - default: - token.match[0] = AdjustCase( - token.match[0].replace(/\s/g, ''), - meta.style.properties as CaseStyleFlags - ); - break; + // check for a property in our token cache + const prop = (token.cache as ITokenCache).property; + + // if we have a known property, transform the display name + if (prop !== undefined) { + token.match[0] = `.${TransformCase(prop.display, meta.style.properties)}`; + } else { + token.match[0] = TransformCase( + token.match[0].replace(/\s/g, ''), + meta.style.properties + ); } - return; } ); ASSEMBLER_DEFAULT_STYLING.onBranchToken( TOKEN_NAMES.STRUCTURE_PROPERTY, (token, parsed, meta) => { - switch (true) { - case meta.style.properties === STYLE_FLAG_LOOKUP.MATCH: { - const prop = (token.cache as ITokenCache).property; - if (prop === undefined) { - return; - } - token.match[0] = prop.display; - break; - } - default: - token.match[0] = AdjustCase( - token.match[0].replace(/\s/g, ''), - meta.style.properties as CaseStyleFlags - ); - break; - } - return; + // check for a property in our token cache + const prop = (token.cache as ITokenCache).property; + + // transform case using known property or the text the user has written + token.match[0] = TransformCase( + prop !== undefined ? prop.display : token.match[0].replace(/\s/g, ''), + meta.style.properties + ); } ); diff --git a/libs/assembling/styles/src/lib/default/style-routine-docs.ts b/libs/assembling/styles/src/lib/default/style-routine-docs.ts index ce65e4a16..a1218eb84 100644 --- a/libs/assembling/styles/src/lib/default/style-routine-docs.ts +++ b/libs/assembling/styles/src/lib/default/style-routine-docs.ts @@ -15,6 +15,7 @@ import { IBranch, IParsed, SyntaxTree, + TreeBranchToken, TreeToken, } from '@idl/parsing/syntax-tree'; import { @@ -109,32 +110,44 @@ export function ReplaceRoutineDocs(parsed: IParsed, style: ICodeStyle) { // add comment blocks for routines that dont have them for (let i = 0; i < tree.length; i++) { - // check if we need to add a comment block - if ( - tree[i].name in REPLACE && - (i === 0 || tree[i - 1].name !== TOKEN_NAMES.COMMENT_BLOCK) - ) { - /** Start of new token */ - const newStartLine = tree[i].pos[0]; - - // make a new comment block - const block: IBranch = { - type: BRANCH_TYPES.BRANCH, - name: TOKEN_NAMES.COMMENT_BLOCK, - pos: [newStartLine, 0, 0], - match: [], - idx: i, - parseProblems: [], - scope: [], - kids: [], - end: { + // check if routine + if (tree[i].name in REPLACE) { + /** + * Is the block before? + */ + const before = tree[i - 1]?.name === TOKEN_NAMES.COMMENT_BLOCK; + + /** + * is the block after? + */ + const after = + (tree[i] as TreeBranchToken)?.kids[1]?.name === + TOKEN_NAMES.COMMENT_BLOCK; + + // check if we need to add a comment block + if (!(before || after)) { + /** Start of new token */ + const newStartLine = tree[i].pos[0]; + + // make a new comment block + const block: IBranch = { + type: BRANCH_TYPES.BRANCH, + name: TOKEN_NAMES.COMMENT_BLOCK, pos: [newStartLine, 0, 0], match: [], - }, - }; + idx: i, + parseProblems: [], + scope: [], + kids: [], + end: { + pos: [newStartLine, 0, 0], + match: [], + }, + }; - // save the block - useTree.push(block); + // save the block + useTree.push(block); + } } // always save our node @@ -142,20 +155,57 @@ export function ReplaceRoutineDocs(parsed: IParsed, style: ICodeStyle) { } // process only top level children and dont recurse - for (let i = 0; i < useTree.length - 1; i++) { - // check if we have comment block followed by a routine + for (let i = 0; i < useTree.length; i++) { + /** Routine def that we found */ + let routine: TreeToken; + + /** Comment block associated with the routine */ + let block: IBranch; + + /** Track where our comment block resides */ + let before = false; + + /** + * Check if we have a comment block before + */ if ( useTree[i].name === TOKEN_NAMES.COMMENT_BLOCK && - useTree[i + 1].name in REPLACE + useTree[i + 1]?.name in REPLACE + ) { + /** Comment block is before */ + before = true; + + /** Comment block */ + block = useTree[i] as IBranch; + + /** Extract our routine */ + routine = useTree[i + 1] as TreeToken< + RoutineProcedureToken | RoutineFunctionToken + >; + } + + /** + * Check if we have a comment block after + */ + if ( + useTree[i].name in REPLACE && + (useTree[i] as TreeBranchToken)?.kids[1]?.name === + TOKEN_NAMES.COMMENT_BLOCK ) { + /** Comment block is after */ + before = false; + /** Extract our routine */ - const routine = useTree[i + 1] as TreeToken< + routine = useTree[i] as TreeToken< RoutineProcedureToken | RoutineFunctionToken >; /** Comment block */ - const block = useTree[i] as IBranch; + block = routine.kids[1] as IBranch; + } + // check if we have comment block followed by a routine + if (routine !== undefined && block !== undefined) { /** Get global token */ const global = GetMatchingGlobalToken(routine, parsed); @@ -174,10 +224,10 @@ export function ReplaceRoutineDocs(parsed: IParsed, style: ICodeStyle) { const delta = docs.length - block.kids.length; /** Get start line */ - const start = useTree[i].pos[0]; + const start = block.pos[0]; /** Scope for tokens */ - const scope = [...useTree[i].scope, TOKEN_NAMES.COMMENT_BLOCK]; + const scope = [...block.scope, TOKEN_NAMES.COMMENT_BLOCK]; // convert to comment tokens const children: SyntaxTree = []; @@ -205,18 +255,24 @@ export function ReplaceRoutineDocs(parsed: IParsed, style: ICodeStyle) { } // save matches - useTree[i].match = docs; + block.match = docs; // update the comment block's children block.kids = children; // bump the lines for the next tokens starting at i + 1 which is where our routine // token starts - IncrementLineNumbers( - useTree.slice(i + 1), - // shift and do math to make bottom of docs above routine definition - delta - (routine.pos[0] + delta - block.end.pos[0] - 1) - ); + if (before) { + IncrementLineNumbers( + useTree.slice(i + 1), + // shift and do math to make bottom of docs above routine definition + delta - (routine.pos[0] + delta - block.end.pos[0] - 1) + ); + } else { + routine.end.pos[0] += delta; + IncrementLineNumbers(routine.kids.slice(2), delta); + IncrementLineNumbers(useTree.slice(i + 1), delta); + } } } } diff --git a/libs/assembling/styles/src/lib/default/style-structures.ts b/libs/assembling/styles/src/lib/default/style-structures.ts index fdda3e82d..589523710 100644 --- a/libs/assembling/styles/src/lib/default/style-structures.ts +++ b/libs/assembling/styles/src/lib/default/style-structures.ts @@ -1,12 +1,27 @@ -import { STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; -import { AdjustCase } from '@idl/assembling/shared'; +import { FullCaseStyleFlags, STYLE_FLAG_LOOKUP } from '@idl/assembling/config'; +import { AdjustCase, TransformCase } from '@idl/assembling/shared'; import { ASSEMBLER_DEFAULT_STYLING } from '@idl/assembling/tree-handlers'; +import { CUSTOM_TYPE_DISPLAY_NAMES } from '@idl/data-types/core'; import { TOKEN_NAMES } from '@idl/parsing/tokenizer'; +/** + * Style the structure name + */ +function StyleStructureName(name: string, flag: FullCaseStyleFlags) { + const low = name.toLowerCase().trim(); + return TransformCase( + low in CUSTOM_TYPE_DISPLAY_NAMES ? CUSTOM_TYPE_DISPLAY_NAMES[low] : name, + flag + ); +} + // handle inheritance statements ASSEMBLER_DEFAULT_STYLING.onBasicToken( TOKEN_NAMES.STRUCTURE_INHERITANCE, (token, parsed, meta) => { + /** + * Style inheritance control statement + */ switch (meta.style.control) { case STYLE_FLAG_LOOKUP.LOWER: token.match[0] = token.match[0].replace(/inherits/gim, 'inherits'); @@ -18,6 +33,14 @@ ASSEMBLER_DEFAULT_STYLING.onBasicToken( // do nothing break; } + + /** + * Style class name + */ + token.match[0] = token.match[0].replace( + token.match[1], + StyleStructureName(token.match[1], meta.style.structureNames) + ); } ); @@ -25,9 +48,19 @@ ASSEMBLER_DEFAULT_STYLING.onBasicToken( ASSEMBLER_DEFAULT_STYLING.onBranchToken( TOKEN_NAMES.STRUCTURE_NAME, (token, parsed, meta) => { - // check if our structure name is a system variable - if (token.match[0].startsWith('!')) { - token.match[0] = AdjustCase(token.match[0], meta.style.systemVariables); + switch (true) { + // check for system variable + case token.match[0].trim().startsWith('!'): + token.match[0] = AdjustCase(token.match[0], meta.style.systemVariables); + break; + // default to case transform! + default: { + token.match[0] = StyleStructureName( + token.match[0], + meta.style.structureNames + ); + break; + } } } ); diff --git a/libs/assembling/tasks/project.json b/libs/assembling/tasks/project.json index 9b891a885..e520ebe39 100644 --- a/libs/assembling/tasks/project.json +++ b/libs/assembling/tasks/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/tasks/**/*.ts"] diff --git a/libs/assembling/tasks/src/lib/formatters/envitask-formatter.ts b/libs/assembling/tasks/src/lib/formatters/envitask-formatter.ts index 72efc2a51..2f177ac6a 100644 --- a/libs/assembling/tasks/src/lib/formatters/envitask-formatter.ts +++ b/libs/assembling/tasks/src/lib/formatters/envitask-formatter.ts @@ -1,8 +1,4 @@ -import { - CaseStyleFlags, - FormatterType, - IAssemblerOptions, -} from '@idl/assembling/config'; +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; import { AdjustCase } from '@idl/assembling/shared'; import { ENVITask, ENVITaskSchemaVersion } from '@idl/data-types/tasks'; @@ -38,7 +34,7 @@ export function ENVITaskFormatter( if (param.name !== undefined) { param.name = AdjustCase( param.name.replace(/\s/g, ''), - options.style.properties as CaseStyleFlags + options.style.keywords ); } diff --git a/libs/assembling/tasks/src/lib/formatters/envitask-legacy-formatter.ts b/libs/assembling/tasks/src/lib/formatters/envitask-legacy-formatter.ts index 0cd75f994..672173d9f 100644 --- a/libs/assembling/tasks/src/lib/formatters/envitask-legacy-formatter.ts +++ b/libs/assembling/tasks/src/lib/formatters/envitask-legacy-formatter.ts @@ -1,8 +1,4 @@ -import { - CaseStyleFlags, - FormatterType, - IAssemblerOptions, -} from '@idl/assembling/config'; +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; import { AdjustCase } from '@idl/assembling/shared'; import { ENVITaskLegacy, ENVITaskLegacyVersion } from '@idl/data-types/tasks'; @@ -38,7 +34,7 @@ export function ENVITaskLegacyFormatter( if (param.name !== undefined) { param.name = AdjustCase( param.name.replace(/\s/g, ''), - options.style.properties as CaseStyleFlags + options.style.keywords ); } diff --git a/libs/assembling/tasks/src/lib/formatters/idltask-formatter.ts b/libs/assembling/tasks/src/lib/formatters/idltask-formatter.ts index a0139de97..14f71e9df 100644 --- a/libs/assembling/tasks/src/lib/formatters/idltask-formatter.ts +++ b/libs/assembling/tasks/src/lib/formatters/idltask-formatter.ts @@ -1,8 +1,4 @@ -import { - CaseStyleFlags, - FormatterType, - IAssemblerOptions, -} from '@idl/assembling/config'; +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; import { AdjustCase } from '@idl/assembling/shared'; import { IDLTask, IDLTaskSchemaVersion } from '@idl/data-types/tasks'; @@ -38,7 +34,7 @@ export function IDLTaskFormatter( if (param.name !== undefined) { param.name = AdjustCase( param.name.replace(/\s/g, ''), - options.style.properties as CaseStyleFlags + options.style.keywords ); } diff --git a/libs/assembling/tree-handlers/project.json b/libs/assembling/tree-handlers/project.json index f2682f166..42d224a16 100644 --- a/libs/assembling/tree-handlers/project.json +++ b/libs/assembling/tree-handlers/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/assembling/tree-handlers/**/*.ts"] diff --git a/libs/cancellation-tokens/project.json b/libs/cancellation-tokens/project.json index 311248434..00a576d28 100644 --- a/libs/cancellation-tokens/project.json +++ b/libs/cancellation-tokens/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/cancellation-tokens/**/*.ts"] diff --git a/libs/data-types/core/project.json b/libs/data-types/core/project.json index 34699cc7e..4fdb7fd7d 100644 --- a/libs/data-types/core/project.json +++ b/libs/data-types/core/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/data-types/core/**/*.ts"] diff --git a/libs/data-types/tasks/project.json b/libs/data-types/tasks/project.json index 9afb53d23..a30424bf6 100644 --- a/libs/data-types/tasks/project.json +++ b/libs/data-types/tasks/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/data-types/tasks/**/*.ts"] diff --git a/libs/debug-types/project.json b/libs/debug-types/project.json index 7df3ebf5e..6600c9534 100644 --- a/libs/debug-types/project.json +++ b/libs/debug-types/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/debug-types/**/*.ts"] diff --git a/libs/generators/envi-task/project.json b/libs/generators/envi-task/project.json index 2fff80c1a..60715c38c 100644 --- a/libs/generators/envi-task/project.json +++ b/libs/generators/envi-task/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/generators/envi-task/**/*.ts"] diff --git a/libs/generators/envi-task/src/lib/generate-envi-task.ts b/libs/generators/envi-task/src/lib/generate-envi-task.ts index ce0184b38..66b20354a 100644 --- a/libs/generators/envi-task/src/lib/generate-envi-task.ts +++ b/libs/generators/envi-task/src/lib/generate-envi-task.ts @@ -5,7 +5,11 @@ import { IAssemblerOptions, } from '@idl/assembling/config'; import { ENVITask, ENVITaskSchema33 } from '@idl/data-types/tasks'; -import { GenerateTaskResult, GetProcedure } from '@idl/generators/tasks-shared'; +import { + GenerateTaskResult, + GetDisplayName, + GetProcedure, +} from '@idl/generators/tasks-shared'; import { IDL_DOCS_HEADERS, IParsed } from '@idl/parsing/syntax-tree'; import { PRO_FILE_EXTENSION, TASK_FILE_EXTENSION } from '@idl/shared'; import { IDL_TRANSLATION } from '@idl/translation'; @@ -62,7 +66,7 @@ export async function GenerateENVITask( const task: ENVITask = { schema: 'envitask_3.3', name: pro.meta.display, - display_name: pro.meta.display, + display_name: GetDisplayName(pro.meta.display), base_class: 'ENVITaskFromProcedure', routine: pro.meta.display, description: pro.meta.docsLookup[IDL_DOCS_HEADERS.DEFAULT] || '', diff --git a/libs/generators/envi-task/src/lib/make-envi-task-parameters.ts b/libs/generators/envi-task/src/lib/make-envi-task-parameters.ts index 3f7f17957..49e096b59 100644 --- a/libs/generators/envi-task/src/lib/make-envi-task-parameters.ts +++ b/libs/generators/envi-task/src/lib/make-envi-task-parameters.ts @@ -6,6 +6,7 @@ import { SerializeIDLType, } from '@idl/data-types/core'; import { ENVITaskParameter, ENVITaskSchema33 } from '@idl/data-types/tasks'; +import { GetDisplayName } from '@idl/generators/tasks-shared'; /** * Makes the ENVI Task parameters from our procedure definition @@ -34,7 +35,7 @@ export function MakeENVITaskParameters( /** First pass at parameter */ const param: ENVITaskParameter = { name: kws[i].display, - display_name: kws[i].display, + display_name: GetDisplayName(kws[i].display), description: kws[i].docs, type: '', required: true, diff --git a/libs/generators/idl-task/project.json b/libs/generators/idl-task/project.json index 663daaf77..9a1e4fcea 100644 --- a/libs/generators/idl-task/project.json +++ b/libs/generators/idl-task/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/generators/idl-task/**/*.ts"] diff --git a/libs/generators/idl-task/src/lib/generate-idl-task.ts b/libs/generators/idl-task/src/lib/generate-idl-task.ts index e792eccd4..543253504 100644 --- a/libs/generators/idl-task/src/lib/generate-idl-task.ts +++ b/libs/generators/idl-task/src/lib/generate-idl-task.ts @@ -5,7 +5,11 @@ import { IAssemblerOptions, } from '@idl/assembling/config'; import { IDLTask, IDLTaskSchema12 } from '@idl/data-types/tasks'; -import { GenerateTaskResult, GetProcedure } from '@idl/generators/tasks-shared'; +import { + GenerateTaskResult, + GetDisplayName, + GetProcedure, +} from '@idl/generators/tasks-shared'; import { IDL_DOCS_HEADERS, IParsed } from '@idl/parsing/syntax-tree'; import { PRO_FILE_EXTENSION, TASK_FILE_EXTENSION } from '@idl/shared'; import { IDL_TRANSLATION } from '@idl/translation'; @@ -62,7 +66,7 @@ export async function GenerateIDLTask( const task: IDLTask = { schema: 'idltask_1.2', name: pro.meta.display, - display_name: pro.meta.display, + display_name: GetDisplayName(pro.meta.display), base_class: 'IDLTaskFromProcedure', routine: pro.meta.display, description: pro.meta.docsLookup[IDL_DOCS_HEADERS.DEFAULT] || '', diff --git a/libs/generators/idl-task/src/lib/make-idl-task-parameters.ts b/libs/generators/idl-task/src/lib/make-idl-task-parameters.ts index df08e9467..9891abdf4 100644 --- a/libs/generators/idl-task/src/lib/make-idl-task-parameters.ts +++ b/libs/generators/idl-task/src/lib/make-idl-task-parameters.ts @@ -6,6 +6,7 @@ import { SerializeIDLType, } from '@idl/data-types/core'; import { IDLTaskParameter, IDLTaskSchema12 } from '@idl/data-types/tasks'; +import { GetDisplayName } from '@idl/generators/tasks-shared'; /** * Makes the ENVI Task parameters from our procedure definition @@ -31,7 +32,7 @@ export function MakeIDLTaskParameters( /** First pass at parameter */ const param: IDLTaskParameter = { name: kws[i].display, - display_name: kws[i].display, + display_name: GetDisplayName(kws[i].display), description: kws[i].docs, type: '', required: true, diff --git a/libs/generators/idl.json/project.json b/libs/generators/idl.json/project.json index f9394baf6..f8345e4fe 100644 --- a/libs/generators/idl.json/project.json +++ b/libs/generators/idl.json/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/generators/idl.json/**/*.ts"] diff --git a/libs/generators/tasks-shared/project.json b/libs/generators/tasks-shared/project.json index f8975499d..adf8cb2ab 100644 --- a/libs/generators/tasks-shared/project.json +++ b/libs/generators/tasks-shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/generators/tasks-shared/**/*.ts"] diff --git a/libs/generators/tasks-shared/src/index.ts b/libs/generators/tasks-shared/src/index.ts index aecb8b891..c4bffc5d5 100644 --- a/libs/generators/tasks-shared/src/index.ts +++ b/libs/generators/tasks-shared/src/index.ts @@ -1,2 +1,3 @@ export * from './lib/generate-task-result.interface'; +export * from './lib/get-display-name'; export * from './lib/get-procedure'; diff --git a/libs/generators/tasks-shared/src/lib/get-display-name.ts b/libs/generators/tasks-shared/src/lib/get-display-name.ts new file mode 100644 index 000000000..c43c50f18 --- /dev/null +++ b/libs/generators/tasks-shared/src/lib/get-display-name.ts @@ -0,0 +1,8 @@ +import { capitalCase } from 'case-anything'; + +/** + * Gets the display name from text for a task name or parameter display name + */ +export function GetDisplayName(text: string) { + return capitalCase(text).replace(/_/gim, ' '); +} diff --git a/libs/idl/project.json b/libs/idl/project.json index 8ed69f188..be7ef3483 100644 --- a/libs/idl/project.json +++ b/libs/idl/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/idl/**/*.ts"] diff --git a/libs/idl/src/lib/idl.class.ts b/libs/idl/src/lib/idl.class.ts index 021c2e1da..3b168e11d 100644 --- a/libs/idl/src/lib/idl.class.ts +++ b/libs/idl/src/lib/idl.class.ts @@ -184,7 +184,6 @@ export class IDL extends EventEmitter { dir: args.env.IDL_DIR, path: args.env.IDL_PATH, dlm_path: args.env.IDL_DLM_PATH, - env: args.env, }, ], }); @@ -193,22 +192,28 @@ export class IDL extends EventEmitter { this.idl = spawn(cmd, null, { env: args.env, cwd: args.cwd, - stdio: ['pipe', 'pipe', 'pipe', 'pipe'], + stdio: ['pipe', 'pipe', 'pipe'], }); // check for errors if (!this.idl.stdout || !this.idl.stderr || !this.idl.stdin) { + this.log.log({ + type: 'error', + content: [ + `Unable to start IDL. One or more of standard in, out, or error did not initialize:`, + ], + }); this.emit(IDL_EVENT_LOOKUP.FAILED_START, 'Failed to start IDL'); return; } - // listen for standard out output from IDL - this.idl.stdio[3].on('data', (buff) => { - this.log.log({ - type: 'info', - content: `Stdout: ${JSON.stringify(buff.toString('utf8'))}`, - }); - }); + // // listen for standard out output from IDL + // this.idl.stdio[3].on('data', (buff) => { + // this.log.log({ + // type: 'info', + // content: `Stdout: ${JSON.stringify(buff.toString('utf8'))}`, + // }); + // }); // write the IDL prompt if not windows so that we properly // detect start. for our "poor man's solution" this is the indicator @@ -427,7 +432,7 @@ export class IDL extends EventEmitter { * Returns a command to retrieve scope information from IDL */ scopeInfoCommand(level: number) { - return `vscode_getScopeInfo, -${level}`; + return ` vscode_getScopeInfo, -${level}`; } /** @@ -516,7 +521,7 @@ export class IDL extends EventEmitter { lineNumber?: number ): Promise { // get the strings for our breakpoints - const resp = await this.evaluate('vscode_getBreakpoints', { + const resp = await this.evaluate(' vscode_getBreakpoints', { silent: true, idlInfo: false, }); @@ -604,7 +609,7 @@ export class IDL extends EventEmitter { } // add extra spaces at the beginning of the command - return await this._executeQueue(` ${command}`, options); + return await this._executeQueue(`${command}`, options); } /** diff --git a/libs/logger/project.json b/libs/logger/project.json index 1d3828697..7fb197eea 100644 --- a/libs/logger/project.json +++ b/libs/logger/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/logger/**/*.ts"] diff --git a/libs/notebooks/index/.eslintrc.json b/libs/notebooks/idl-index/.eslintrc.json similarity index 100% rename from libs/notebooks/index/.eslintrc.json rename to libs/notebooks/idl-index/.eslintrc.json diff --git a/libs/notebooks/index/README.md b/libs/notebooks/idl-index/README.md similarity index 100% rename from libs/notebooks/index/README.md rename to libs/notebooks/idl-index/README.md diff --git a/libs/notebooks/index/jest.config.ts b/libs/notebooks/idl-index/jest.config.ts similarity index 70% rename from libs/notebooks/index/jest.config.ts rename to libs/notebooks/idl-index/jest.config.ts index ff7fbb8df..e96fcb753 100644 --- a/libs/notebooks/index/jest.config.ts +++ b/libs/notebooks/idl-index/jest.config.ts @@ -1,11 +1,11 @@ /* eslint-disable */ export default { - displayName: 'notebooks-index', + displayName: 'notebooks-idl-index', preset: '../../../jest.preset.js', testEnvironment: 'node', transform: { '^.+\\.[tj]s$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], }, moduleFileExtensions: ['ts', 'js', 'html'], - coverageDirectory: '../../../coverage/libs/notebooks/index', + coverageDirectory: '../../../coverage/libs/notebooks/idl-index', }; diff --git a/libs/notebooks/index/project.json b/libs/notebooks/idl-index/project.json similarity index 67% rename from libs/notebooks/index/project.json rename to libs/notebooks/idl-index/project.json index 6022f01e2..d360a5ce8 100644 --- a/libs/notebooks/index/project.json +++ b/libs/notebooks/idl-index/project.json @@ -1,21 +1,21 @@ { - "name": "notebooks-index", + "name": "notebooks-idl-index", "$schema": "../../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "libs/notebooks/index/src", + "sourceRoot": "libs/notebooks/idl-index/src", "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { - "lintFilePatterns": ["libs/notebooks/index/**/*.ts"] + "lintFilePatterns": ["libs/notebooks/idl-index/**/*.ts"] } }, "test": { "executor": "@nx/jest:jest", "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], "options": { - "jestConfig": "libs/notebooks/index/jest.config.ts", + "jestConfig": "libs/notebooks/idl-index/jest.config.ts", "passWithNoTests": true }, "configurations": { diff --git a/libs/notebooks/index/src/index.ts b/libs/notebooks/idl-index/src/index.ts similarity index 100% rename from libs/notebooks/index/src/index.ts rename to libs/notebooks/idl-index/src/index.ts diff --git a/libs/notebooks/index/src/lib/notebook-to-pro-code.ts b/libs/notebooks/idl-index/src/lib/notebook-to-pro-code.ts similarity index 58% rename from libs/notebooks/index/src/lib/notebook-to-pro-code.ts rename to libs/notebooks/idl-index/src/lib/notebook-to-pro-code.ts index 8b35c6c60..ffe641d31 100644 --- a/libs/notebooks/index/src/lib/notebook-to-pro-code.ts +++ b/libs/notebooks/idl-index/src/lib/notebook-to-pro-code.ts @@ -1,10 +1,14 @@ import { Assembler } from '@idl/assembler'; import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { CancellationToken } from '@idl/cancellation-tokens'; import { IDLNotebookDocument } from '@idl/notebooks/shared'; +import { + DEFAULT_NOTEBOOK_TO_PRO_CODE_OPTIONS, + INotebookToProCodeOptions, +} from '@idl/notebooks/types'; import { IDLIndex } from '@idl/parsing/index'; import { SyntaxTree, TreeToken } from '@idl/parsing/syntax-tree'; import { MainLevelToken, TOKEN_NAMES } from '@idl/parsing/tokenizer'; -import { writeFileSync } from 'fs'; /** * Converts a notebook to PRO code on disk @@ -13,18 +17,19 @@ export async function NotebookToProCode( index: IDLIndex, file: string, notebook: IDLNotebookDocument, - outFile: string, - formatting: IAssemblerOptions -) { + formatting: IAssemblerOptions, + cancel: CancellationToken, + options: Partial = {} +): Promise { /** - * Index our file + * Merge options for notebook creation */ - const indexed = await index.indexIDLNotebook(file, notebook); + const useOptions = { ...DEFAULT_NOTEBOOK_TO_PRO_CODE_OPTIONS, ...options }; /** - * Get the values for our parsed notebooks + * Index our file */ - const cells = Object.values(indexed); + const indexed = await index.getParsedNotebook(file, notebook, cancel); /** * Routine code (non-main) @@ -37,9 +42,34 @@ export async function NotebookToProCode( let main: string[] = []; // track our strings - for (let i = 0; i < cells.length; i++) { + for (let i = 0; i < notebook.cells.length; i++) { + /** + * Get for cell + */ + const key = `${file}#${i}`; + /** Get parsed cell */ - const parsed = cells[i]; + const parsed = indexed[key]; + + // if cell is undefined, it isnt code + if (parsed === undefined) { + // check if we keep everything or not + if (useOptions.includeAllCells) { + if (routines.length > 0) { + routines.push(''); + } + + // get the cell + const mdCell = notebook.cells[i]; + + // add in markdown or other cells + routines = routines.concat( + mdCell.text.split(/\r?\n/gim).map((line) => `; ${line}`) + ); + } + + continue; + } // save a reference to the tree const tree = parsed.tree; @@ -59,7 +89,7 @@ export async function NotebookToProCode( if (tree[tree.length - 1].name === TOKEN_NAMES.MAIN_LEVEL) { // check if we have something besides main if (tree.length > 1) { - nonMainTokens = tree.slice(0, tree.length - 2); + nonMainTokens = tree.slice(0, tree.length - 1); } // save main tokens @@ -74,7 +104,11 @@ export async function NotebookToProCode( parsed.tree = nonMainTokens; // format the main level program - const nonMain = Assembler(parsed, formatting); + const nonMain = Assembler(parsed, cancel, { + ...formatting, + autoDoc: false, + styleAndFormat: false, + }); // TODO: figure out what to do if syntax error if (nonMain === undefined) { @@ -92,8 +126,11 @@ export async function NotebookToProCode( // check for main if (mainTokens.length > 0) { + // get the syntax tree + parsed.tree = mainTokens; + // format the main level program - const formattedMain = Assembler(parsed, formatting); + const formattedMain = Assembler(parsed, cancel, formatting); // TODO: figure out what to do if syntax error if (formattedMain === undefined) { @@ -125,9 +162,18 @@ export async function NotebookToProCode( if (strings.length > 0) { strings.push(''); } + + // add header to the start of the main level program + main.unshift(''); + main.unshift('compile_opt idl2'); + main.unshift('; main level program'); + + // close the main level program + main.push('end'); + + // merge strings strings = strings.concat(main); } - // write file to disk - writeFileSync(outFile, formatting.eol === 'lf' ? '\n' : '\r\n'); + return strings.join(formatting.eol === 'lf' ? '\n' : '\r\n'); } diff --git a/libs/notebooks/index/tsconfig.json b/libs/notebooks/idl-index/tsconfig.json similarity index 100% rename from libs/notebooks/index/tsconfig.json rename to libs/notebooks/idl-index/tsconfig.json diff --git a/libs/notebooks/index/tsconfig.lib.json b/libs/notebooks/idl-index/tsconfig.lib.json similarity index 100% rename from libs/notebooks/index/tsconfig.lib.json rename to libs/notebooks/idl-index/tsconfig.lib.json diff --git a/libs/notebooks/index/tsconfig.spec.json b/libs/notebooks/idl-index/tsconfig.spec.json similarity index 100% rename from libs/notebooks/index/tsconfig.spec.json rename to libs/notebooks/idl-index/tsconfig.spec.json diff --git a/libs/notebooks/shared/project.json b/libs/notebooks/shared/project.json index 96fd438bd..f5f460824 100644 --- a/libs/notebooks/shared/project.json +++ b/libs/notebooks/shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/notebooks/shared/**/*.ts"] diff --git a/libs/notebooks/types/project.json b/libs/notebooks/types/project.json index 29fdee10b..f134c1c4f 100644 --- a/libs/notebooks/types/project.json +++ b/libs/notebooks/types/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/notebooks/types/**/*.ts"] diff --git a/libs/notebooks/types/src/index.ts b/libs/notebooks/types/src/index.ts index 6e71d6df0..3b61c95ef 100644 --- a/libs/notebooks/types/src/index.ts +++ b/libs/notebooks/types/src/index.ts @@ -5,4 +5,5 @@ export * from './lib/embeds/idl-notebook-plot.embed.interface'; export * from './lib/idl-notebook-metadata.interface'; export * from './lib/idl-notebook-mime-types.interface'; export * from './lib/idl-notebook-renderer-messages.interface'; +export * from './lib/notebook-to-pro-code.interface'; export * from './lib/raw-notebook.interface'; diff --git a/libs/notebooks/types/src/lib/notebook-to-pro-code.interface.ts b/libs/notebooks/types/src/lib/notebook-to-pro-code.interface.ts new file mode 100644 index 000000000..cb67c0a46 --- /dev/null +++ b/libs/notebooks/types/src/lib/notebook-to-pro-code.interface.ts @@ -0,0 +1,16 @@ +/** + * Options when creating IDL Notebook + */ +export interface INotebookToProCodeOptions { + /** + * If set, include all cells in the PRO file + */ + includeAllCells: boolean; +} + +/** + * Default options for converting our notebook to PRO code + */ +export const DEFAULT_NOTEBOOK_TO_PRO_CODE_OPTIONS: INotebookToProCodeOptions = { + includeAllCells: true, +}; diff --git a/libs/notebooks/types/src/lib/raw-notebook.interface.ts b/libs/notebooks/types/src/lib/raw-notebook.interface.ts index a1b7778db..aec72d03e 100644 --- a/libs/notebooks/types/src/lib/raw-notebook.interface.ts +++ b/libs/notebooks/types/src/lib/raw-notebook.interface.ts @@ -102,17 +102,11 @@ export const DEFAULT_NOTEBOOK: IDLRawNotebook = { cells: [ { type: 'markdown', - content: [ - '### Notebook Preview', - '', - 'Please note that this is a preview feature of notebooks for IDL.', - '', - "Our Notebook API and file format are not set in stone, so please don't start creating many notebooks for personal use quite yet.", - '', - 'Use the examples from documentation as a way to learn about how to use notebooks and see if you like them!', - '', - 'If you have questions, comments, or concerns, let us know [here](https://github.com/interactive-data-language/vscode-idl/discussions/6) on GitHub.', - ], + content: ['### My Amazing IDL Notebook'], + }, + { + type: 'code', + content: ["print, 'Hello world! IDL Notebooks are awesome.'"], }, ], }; diff --git a/libs/parsing/index/project.json b/libs/parsing/index/project.json index 8c731af53..df779a7c7 100644 --- a/libs/parsing/index/project.json +++ b/libs/parsing/index/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/index/**/*.ts"] diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-function-methods.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-function-methods.ts index 98d913db7..e0b5a8bd1 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-function-methods.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-function-methods.ts @@ -1,3 +1,5 @@ +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES, IDL_TYPE_LOOKUP, @@ -28,6 +30,7 @@ const FUNCTION_METHODS = IDL_DISPLAY_NAMES[GLOBAL_TOKEN_TYPES.FUNCTION_METHOD]; function AddCompletionFunctionMethodsForType( complete: CompletionItem[], index: IDLIndex, + formatting: IAssemblerOptions, type: IDLDataTypeBase, addParen: boolean, found: { [key: string]: any } = {} @@ -49,7 +52,11 @@ function AddCompletionFunctionMethodsForType( for (let i = 0; i < displayNames.length; i++) { complete.push({ label: displayNames[i] + '()', - insertText: displayNames[i].split('::')[1] + add, + insertText: + TransformCase( + displayNames[i].split('::')[1], + formatting.style.routineMethods + ) + add, kind: CompletionItemKind.Method, sortText: SORT_PRIORITY.METHODS, detail: IDL_TRANSLATION.autoComplete.detail.functionMethod, @@ -73,7 +80,11 @@ function AddCompletionFunctionMethodsForType( ) { complete.push({ label: FUNCTION_METHODS[names[i]] + '()', - insertText: FUNCTION_METHODS[names[i]].split('::')[1] + add, + insertText: + TransformCase( + FUNCTION_METHODS[names[i]].split('::')[1], + formatting.style.routineMethods + ) + add, kind: CompletionItemKind.Method, sortText: SORT_PRIORITY.METHODS, detail: IDL_TRANSLATION.autoComplete.detail.functionMethod, @@ -96,6 +107,7 @@ function AddCompletionFunctionMethodsForType( AddCompletionFunctionMethods( complete, index, + formatting, ParseIDLType(inherits[i]), addParen, found @@ -111,6 +123,7 @@ function AddCompletionFunctionMethodsForType( export function AddCompletionFunctionMethods( complete: CompletionItem[], index: IDLIndex, + formatting: IAssemblerOptions, type: IDLDataType, addParen: boolean, found: { [key: string]: any } = {} @@ -120,6 +133,7 @@ export function AddCompletionFunctionMethods( AddCompletionFunctionMethodsForType( complete, index, + formatting, type[i], addParen, found diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-functions.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-functions.ts index 3692000af..2207b8f1f 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-functions.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-functions.ts @@ -3,6 +3,7 @@ import { IAssemblerOptions, STYLE_FLAG_LOOKUP, } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES } from '@idl/data-types/core'; import { IDL_DISPLAY_NAMES } from '@idl/parsing/routines'; import { TASK_REGEX, TaskFunctionName } from '@idl/parsing/syntax-tree'; @@ -57,9 +58,10 @@ export function AddCompletionFunctions( detail: IDL_TRANSLATION.autoComplete.detail.function, }); } else { + const display = TransformCase(displayNames[i], formatting.style.routines); complete.push({ - label: displayNames[i] + '()', - insertText: displayNames[i] + add, + label: `${display}()`, + insertText: `${display}${add}`, kind: CompletionItemKind.Function, sortText: SORT_PRIORITY.ROUTINES, detail: IDL_TRANSLATION.autoComplete.detail.function, diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedure-methods.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedure-methods.ts index 8868d65b4..e94345523 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedure-methods.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedure-methods.ts @@ -1,3 +1,5 @@ +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES, IDL_TYPE_LOOKUP, @@ -25,6 +27,7 @@ const PROCEDURE_METHODS = function AddCompletionProcedureMethodsForType( complete: CompletionItem[], index: IDLIndex, + formatting: IAssemblerOptions, type: IDLDataTypeBase, found: { [key: string]: any } = {} ) { @@ -36,7 +39,10 @@ function AddCompletionProcedureMethodsForType( for (let i = 0; i < displayNames.length; i++) { complete.push({ label: displayNames[i], - insertText: displayNames[i].split('::')[1], + insertText: TransformCase( + displayNames[i].split('::')[1], + formatting.style.routineMethods + ), kind: CompletionItemKind.Function, sortText: SORT_PRIORITY.METHODS, detail: IDL_TRANSLATION.autoComplete.detail.procedureMethod, @@ -55,7 +61,10 @@ function AddCompletionProcedureMethodsForType( if (keysInternal[i].startsWith(compareType) && !(methodName in found)) { complete.push({ label: PROCEDURE_METHODS[keysInternal[i]], - insertText: PROCEDURE_METHODS[keysInternal[i]].split('::')[1], + insertText: TransformCase( + PROCEDURE_METHODS[keysInternal[i]].split('::')[1], + formatting.style.routineMethods + ), kind: CompletionItemKind.Function, sortText: SORT_PRIORITY.METHODS, detail: IDL_TRANSLATION.autoComplete.detail.procedureMethod, @@ -77,6 +86,7 @@ function AddCompletionProcedureMethodsForType( AddCompletionProcedureMethods( complete, index, + formatting, ParseIDLType(inherits[i]), found ); @@ -91,11 +101,18 @@ function AddCompletionProcedureMethodsForType( export function AddCompletionProcedureMethods( complete: CompletionItem[], index: IDLIndex, + formatting: IAssemblerOptions, type: IDLDataType, found: { [key: string]: any } = {} ) { // process each type for (let i = 0; i < type.length; i++) { - AddCompletionProcedureMethodsForType(complete, index, type[i], found); + AddCompletionProcedureMethodsForType( + complete, + index, + formatting, + type[i], + found + ); } } diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedures.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedures.ts index 5dd58f962..4e4e99cf2 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedures.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-procedures.ts @@ -1,3 +1,5 @@ +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES } from '@idl/data-types/core'; import { IDL_DISPLAY_NAMES } from '@idl/parsing/routines'; import { MAIN_LEVEL_NAME } from '@idl/parsing/syntax-tree'; @@ -14,7 +16,10 @@ const PROCEDURES = IDL_DISPLAY_NAMES[GLOBAL_TOKEN_TYPES.PROCEDURE]; /** * Adds variables to our completion items */ -export function AddCompletionProcedures(complete: CompletionItem[]) { +export function AddCompletionProcedures( + complete: CompletionItem[], + formatting: IAssemblerOptions +) { // add user procedures first const displayNames = Object.values(PROCEDURES); for (let i = 0; i < displayNames.length; i++) { @@ -22,7 +27,7 @@ export function AddCompletionProcedures(complete: CompletionItem[]) { continue; } complete.push({ - label: displayNames[i], + label: TransformCase(displayNames[i], formatting.style.routines), kind: CompletionItemKind.Function, sortText: SORT_PRIORITY.ROUTINES, detail: IDL_TRANSLATION.autoComplete.detail.procedure, diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties-in-structures.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties-in-structures.ts index bfec95ceb..4ccc0a0ff 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties-in-structures.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties-in-structures.ts @@ -1,9 +1,5 @@ -import { - CaseStyleFlags, - FormatterType, - IAssemblerOptions, -} from '@idl/assembling/config'; -import { AdjustCase } from '@idl/assembling/shared'; +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES } from '@idl/data-types/core'; import { FindDirectBranchChildren, TreeToken } from '@idl/parsing/syntax-tree'; import { StructureNameToken, TOKEN_NAMES } from '@idl/parsing/tokenizer'; @@ -41,9 +37,9 @@ function ResolveProperties( // process all properties if they have not been found already for (let i = 0; i < names.length; i++) { if (!(names[i] in found)) { - const display = AdjustCase( + const display = TransformCase( properties[names[i]].display, - formatting.style.properties as CaseStyleFlags + formatting.style.properties ); // add to completion complete.push({ diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties.ts index 6e311a905..b10594439 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties.ts @@ -1,9 +1,5 @@ -import { - CaseStyleFlags, - FormatterType, - IAssemblerOptions, -} from '@idl/assembling/config'; -import { AdjustCase } from '@idl/assembling/shared'; +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { TransformCase } from '@idl/assembling/shared'; import { GLOBAL_TOKEN_TYPES, IDL_TYPE_LOOKUP, @@ -15,7 +11,6 @@ import { import { IDL_TRANSLATION } from '@idl/translation'; import { CompletionItem, CompletionItemKind } from 'vscode-languageserver'; -import { GetPropertyDisplayName } from '../../helpers/get-property-display-name'; import { IDLIndex } from '../../idl-index.class'; import { SORT_PRIORITY } from '../sort-priority.interface'; @@ -35,17 +30,22 @@ function AddCompletionPropertiesForType( return; } - // check if we have aN ANONYMOUS STRUCTURE + // check if we have an anonymous structure if (type.name === IDL_TYPE_LOOKUP.STRUCTURE) { const properties = type.meta; const keys = Object.keys(properties); for (let i = 0; i < keys.length; i++) { const lowKey = keys[i].toLowerCase(); if (!(lowKey in found)) { + const display = TransformCase( + properties[keys[i]].display, + formatting.style.properties + ); + // add to completion complete.push({ - label: GetPropertyDisplayName(properties[keys[i]].display), - insertText: GetPropertyDisplayName(properties[keys[i]].display) + add, + label: display, + insertText: display + add, kind: CompletionItemKind.Field, sortText: SORT_PRIORITY.PROPERTIES, documentation: properties[keys[i]].docs, @@ -71,9 +71,9 @@ function AddCompletionPropertiesForType( for (let i = 0; i < keys.length; i++) { const lowKey = keys[i].toLowerCase(); if (!(lowKey in found)) { - const display = AdjustCase( + const display = TransformCase( properties[keys[i]].display, - formatting.style.properties as CaseStyleFlags + formatting.style.properties ); // add to completion diff --git a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-structure-names.ts b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-structure-names.ts index af3df7acc..effe535e5 100644 --- a/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-structure-names.ts +++ b/libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-structure-names.ts @@ -1,3 +1,5 @@ +import { FormatterType, IAssemblerOptions } from '@idl/assembling/config'; +import { AdjustCase, TransformCase } from '@idl/assembling/shared'; import { CUSTOM_TYPE_DISPLAY_NAMES } from '@idl/data-types/core'; import { IDL_TRANSLATION } from '@idl/translation'; import { CompletionItem, CompletionItemKind } from 'vscode-languageserver'; @@ -7,7 +9,10 @@ import { SORT_PRIORITY } from '../sort-priority.interface'; /** * Adds variables to our completion items */ -export function AddCompletionStructureNames(complete: CompletionItem[]) { +export function AddCompletionStructureNames( + complete: CompletionItem[], + formatting: IAssemblerOptions +) { // add user procedures first const displayNames = Object.values(CUSTOM_TYPE_DISPLAY_NAMES); for (let i = 0; i < displayNames.length; i++) { @@ -15,7 +20,9 @@ export function AddCompletionStructureNames(complete: CompletionItem[]) { continue; } complete.push({ - label: displayNames[i], + label: displayNames[i].startsWith('!') + ? AdjustCase(displayNames[i], formatting.style.systemVariables) + : TransformCase(displayNames[i], formatting.style.structureNames), kind: CompletionItemKind.Class, sortText: SORT_PRIORITY.STRUCTURES, detail: IDL_TRANSLATION.autoComplete.detail.structure, diff --git a/libs/parsing/index/src/lib/auto-complete/get-auto-complete.ts b/libs/parsing/index/src/lib/auto-complete/get-auto-complete.ts index 94b8a3012..b9d6b6f61 100644 --- a/libs/parsing/index/src/lib/auto-complete/get-auto-complete.ts +++ b/libs/parsing/index/src/lib/auto-complete/get-auto-complete.ts @@ -131,11 +131,18 @@ export async function GetAutoComplete( AddCompletionExecutiveCommands(items, formatting); return items; case token?.name === TOKEN_NAMES.STRUCTURE && token?.kids?.length === 0: - AddCompletionStructureNames(items); + AddCompletionStructureNames(items, formatting); + return items; + case token?.name === TOKEN_NAMES.STRUCTURE_INHERITANCE && + // fully typed inherits + token.match[0].trim().toLowerCase() === 'inherits' && + // make sure it ends with a space + token.match[0].endsWith(' '): + AddCompletionStructureNames(items, formatting); return items; case token?.name === TOKEN_NAMES.STRUCTURE_NAME && token?.kids?.length === 0: - AddCompletionStructureNames(items); + AddCompletionStructureNames(items, formatting); return items; case token?.name === TOKEN_NAMES.STRUCTURE_NAME: AddCompletionPropertiesInStructures( @@ -265,9 +272,15 @@ export async function GetAutoComplete( // check if we send procedure or function methods if (local?.name in PROCEDURES) { - AddCompletionProcedureMethods(items, index, type); + AddCompletionProcedureMethods(items, index, formatting, type); } else { - AddCompletionFunctionMethods(items, index, type, addParen); + AddCompletionFunctionMethods( + items, + index, + formatting, + type, + addParen + ); } break; /** @@ -282,7 +295,7 @@ export async function GetAutoComplete( // check if we can send procedures or if it needs to be functions if (token?.name in PROCEDURES) { - AddCompletionProcedures(items); + AddCompletionProcedures(items, formatting); } else { AddCompletionFunctions(items, formatting, addParen); } diff --git a/libs/parsing/index/src/lib/get-code-outline.ts b/libs/parsing/index/src/lib/get-code-outline.ts new file mode 100644 index 000000000..4f7b965df --- /dev/null +++ b/libs/parsing/index/src/lib/get-code-outline.ts @@ -0,0 +1,36 @@ +import { CancellationToken } from '@idl/cancellation-tokens'; +import { DocumentSymbol } from 'vscode-languageserver'; + +import { GetParsedPROCode, PENDING_PRO_CODE } from './get-parsed-pro-code'; +import { IDLIndex } from './idl-index.class'; + +/** + * Get the outline of our file nicely fro our cache or pending files + * to reduce extra work + */ +export async function GetCodeOutline( + index: IDLIndex, + file: string, + code: string | string[], + token = new CancellationToken() +): Promise { + switch (true) { + /** + * Check if it is pending + */ + case file in PENDING_PRO_CODE: + return (await PENDING_PRO_CODE[file].promise).outline; + + /** + * Check if it is in our lookup + */ + case index.tokensByFile.has(file): + return index.tokensByFile.outline(file); + + /** + * Parse to get the outline + */ + default: + return (await GetParsedPROCode(index, file, code, token)).outline; + } +} diff --git a/libs/parsing/index/src/lib/get-code-semantic-tokens.ts b/libs/parsing/index/src/lib/get-code-semantic-tokens.ts new file mode 100644 index 000000000..8dd9feffa --- /dev/null +++ b/libs/parsing/index/src/lib/get-code-semantic-tokens.ts @@ -0,0 +1,35 @@ +import { CancellationToken } from '@idl/cancellation-tokens'; +import { SemanticTokens } from 'vscode-languageserver'; + +import { GetParsedPROCode, PENDING_PRO_CODE } from './get-parsed-pro-code'; +import { IDLIndex } from './idl-index.class'; + +/** + * Get the semantic tokens for a file + */ +export async function GetCodeSemanticTokens( + index: IDLIndex, + file: string, + code: string | string[], + token = new CancellationToken() +): Promise { + switch (true) { + /** + * Check if it is pending + */ + case file in PENDING_PRO_CODE: + return (await PENDING_PRO_CODE[file].promise).semantic; + + /** + * Check if it is in our lookup + */ + case index.tokensByFile.has(file): + return index.tokensByFile.semantic(file); + + /** + * Parse to get the outline + */ + default: + return (await GetParsedPROCode(index, file, code, token)).semantic; + } +} diff --git a/libs/parsing/index/src/lib/get-parsed-pro-code.ts b/libs/parsing/index/src/lib/get-parsed-pro-code.ts index bd20e064d..ef78f3845 100644 --- a/libs/parsing/index/src/lib/get-parsed-pro-code.ts +++ b/libs/parsing/index/src/lib/get-parsed-pro-code.ts @@ -16,7 +16,7 @@ import { /** * Track the pending files */ -const PENDING_PRO_CODE: { [key: string]: IGetParsedPROCodePending } = {}; +export const PENDING_PRO_CODE: { [key: string]: IGetParsedPROCodePending } = {}; /** * Gets a promise that resolves to the pending file diff --git a/libs/parsing/index/src/lib/helpers/save-global-display-names.ts b/libs/parsing/index/src/lib/helpers/save-global-display-names.ts index d028ea51b..7b1ba9975 100644 --- a/libs/parsing/index/src/lib/helpers/save-global-display-names.ts +++ b/libs/parsing/index/src/lib/helpers/save-global-display-names.ts @@ -21,7 +21,7 @@ export function SaveGlobalDisplayNames(global: GlobalTokens) { // save structure display names if (global[i].type === GLOBAL_TOKEN_TYPES.STRUCTURE) { - CUSTOM_TYPE_DISPLAY_NAMES[global[i].name] = global[i].meta.display; + CUSTOM_TYPE_DISPLAY_NAMES[global[i].name.trim()] = global[i].meta.display; } } } diff --git a/libs/parsing/index/src/lib/idl-index.class.ts b/libs/parsing/index/src/lib/idl-index.class.ts index 84edf05a3..ca155c2d5 100644 --- a/libs/parsing/index/src/lib/idl-index.class.ts +++ b/libs/parsing/index/src/lib/idl-index.class.ts @@ -18,7 +18,6 @@ import { import { IDLNotebookDocument, IParsedIDLNotebook } from '@idl/notebooks/shared'; import { Parser } from '@idl/parser'; import { SyntaxProblems } from '@idl/parsing/problem-codes'; -import { GetSemanticTokens } from '@idl/parsing/semantic-tokens'; import { IParsed, TreeToken } from '@idl/parsing/syntax-tree'; import { IncludeToken } from '@idl/parsing/tokenizer'; import { LoadConfig } from '@idl/schemas/idl.json'; @@ -72,6 +71,8 @@ import { Worker } from 'worker_threads'; import { GetAutoComplete } from './auto-complete/get-auto-complete'; import { CanChangeDetection } from './change-detection/can-change-detection'; import { ChangeDetection } from './change-detection/change-detection'; +import { GetCodeOutline } from './get-code-outline'; +import { GetCodeSemanticTokens } from './get-code-semantic-tokens'; import { GetParsedNotebook } from './get-parsed-notebook'; import { GetParsedPROCode } from './get-parsed-pro-code'; import { GlobalIndex } from './global-index.class'; @@ -90,12 +91,6 @@ import { } from './idl-index.interface'; import { IDLParsedCache } from './idl-parsed-cache.class'; import { IDL_GLOBAL_TOKENS, LoadGlobal } from './load-global/load-global'; -import { OutlineDisplayName } from './outline'; -import { - DEFAULT_OUTLINE_SYMBOL_KIND, - OUTLINE_THESE_TOKENS, - OUTLINE_TOKEN_KIND_MAP, -} from './outline.interface'; import { ParseNotebook } from './parse-notebook'; import { PostProcessParsed } from './post-process/post-process-parsed'; import { GetTokenDefinition } from './token-definiton/get-token-definition'; @@ -502,11 +497,7 @@ export class IDLIndex { { file, code } ).response; } else { - return GetSemanticTokens( - await this.getParsedProCode(file, code, token, { - postProcess: true, - }) - ); + return GetCodeSemanticTokens(this, file, code, token); } } @@ -627,7 +618,7 @@ export class IDLIndex { token: CancellationToken ): Promise { // if document isnt PRO code, return - if (!this.isPROCode(file)) { + if (!(this.isPROCode(file) || this.isIDLNotebookFile(file))) { return undefined; } @@ -640,64 +631,7 @@ export class IDLIndex { ).response; } - // get tokens for our file - const tokens = await this.getParsedProCode(file, code, token, { - postProcess: true, - }); - - // get our global tokens - const global = tokens.global; - - // initialize object to track global tokens - // only track a single token per line which matches IDL where you cant declare - // more than one routine on the same line - const tracked: { [key: number]: DocumentSymbol } = {}; - - // process our global tokens - for (let i = 0; i < global.length; i++) { - // extract global token - const globali = global[i]; - - // check if we need to save - if (globali.type in OUTLINE_THESE_TOKENS) { - tracked[globali.pos[0]] = { - kind: - globali.type in OUTLINE_TOKEN_KIND_MAP - ? OUTLINE_TOKEN_KIND_MAP[globali.type] - : DEFAULT_OUTLINE_SYMBOL_KIND, - name: OutlineDisplayName(globali), - range: { - start: { - line: globali.pos[0], - character: globali.pos[1], - }, - end: { - line: globali.pos[0], - character: globali.pos[1] + globali.pos[2], - }, - }, - selectionRange: { - start: { - line: globali.pos[0], - character: globali.pos[1], - }, - end: { - line: globali.pos[0], - character: globali.pos[1] + globali.pos[2], - }, - }, - }; - } - } - - // order by appearance - const lines = Object.keys(tracked).sort(); - const found: DocumentSymbol[] = []; - for (let i = 0; i < lines.length; i++) { - found.push(tracked[lines[i]]); - } - - return found; + return await GetCodeOutline(this, file, code, token); } /** @@ -777,10 +711,10 @@ export class IDLIndex { log: IDL_LSP_LOG, type: 'error', content: [`${IDL_TRANSLATION.lsp.config.failedParse}: "${file}"`, err], - alert: `${IDL_TRANSLATION.lsp.config.failedParse}: "${file}"`, - alertMeta: { - file, - }, + // alert: `${IDL_TRANSLATION.lsp.config.failedParse}: "${file}"`, + // alertMeta: { + // file, + // }, }); } } diff --git a/libs/parsing/index/src/lib/idl-parsed-cache.class.ts b/libs/parsing/index/src/lib/idl-parsed-cache.class.ts index 6f8f9935f..6a9fb3fa0 100644 --- a/libs/parsing/index/src/lib/idl-parsed-cache.class.ts +++ b/libs/parsing/index/src/lib/idl-parsed-cache.class.ts @@ -1,6 +1,7 @@ import { CancellationToken } from '@idl/cancellation-tokens'; import { IParsed, RemoveScopeDetail } from '@idl/parsing/syntax-tree'; import copy from 'fast-copy'; +import { DocumentSymbol, SemanticTokens } from 'vscode-languageserver'; import { IDL_INDEX_OPTIONS } from './idl-index.interface'; @@ -147,6 +148,27 @@ export class IDLParsedCache { } } + /** + * Return file outline + */ + outline(file: string): DocumentSymbol[] | undefined { + if (file in this.byFile) { + return this.byFile[file].outline; + } + } + + /** + * Return file semantic tokens + * + * Only created/updated after we post-process a file, otherwise + * value is empty + */ + semantic(file: string): SemanticTokens | undefined { + if (file in this.byFile) { + return this.byFile[file].semantic; + } + } + /** * Returns the text for a given file or undefined if the file * does not exist in our cache diff --git a/libs/parsing/index/src/lib/post-process/post-process-parsed.ts b/libs/parsing/index/src/lib/post-process/post-process-parsed.ts index 438324d95..5340e0ce7 100644 --- a/libs/parsing/index/src/lib/post-process/post-process-parsed.ts +++ b/libs/parsing/index/src/lib/post-process/post-process-parsed.ts @@ -1,4 +1,5 @@ import { CancellationToken } from '@idl/cancellation-tokens'; +import { GetSemanticTokens } from '@idl/parsing/semantic-tokens'; import { IParsed, PopulateScopeDetailAndResetTokenCache, @@ -42,6 +43,9 @@ export function PostProcessParsed( */ PopulateUsesThese(index, parsed, cancel); + // update semantic tokens + GetSemanticTokens(parsed); + // update problems for our file index.trackSyntaxProblemsForFile(file, GetSyntaxProblems(parsed)); diff --git a/libs/parsing/parser/project.json b/libs/parsing/parser/project.json index 2be87b743..2745a83e2 100644 --- a/libs/parsing/parser/project.json +++ b/libs/parsing/parser/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/parser/**/*.ts"] diff --git a/libs/parsing/parser/src/lib/parser-get-outline.interface.ts b/libs/parsing/parser/src/lib/parser-get-outline.interface.ts new file mode 100644 index 000000000..bb7da0bbd --- /dev/null +++ b/libs/parsing/parser/src/lib/parser-get-outline.interface.ts @@ -0,0 +1,27 @@ +import { GLOBAL_TOKEN_TYPES } from '@idl/data-types/core'; +import { SymbolKind } from 'vscode-languageserver/node'; + +/** + * When generating an outline for a document, these are the tokens we report outlines for + */ +export const OUTLINE_THESE_TOKENS: { [key: string]: boolean } = {}; +OUTLINE_THESE_TOKENS[GLOBAL_TOKEN_TYPES.FUNCTION] = true; +OUTLINE_THESE_TOKENS[GLOBAL_TOKEN_TYPES.FUNCTION_METHOD] = true; +OUTLINE_THESE_TOKENS[GLOBAL_TOKEN_TYPES.PROCEDURE] = true; +OUTLINE_THESE_TOKENS[GLOBAL_TOKEN_TYPES.PROCEDURE_METHOD] = true; + +/** + * Map for symbol kinds from our global tokens to what the + * VSCode user interface expects + */ +export const OUTLINE_TOKEN_KIND_MAP: { [key: string]: SymbolKind } = {}; +OUTLINE_TOKEN_KIND_MAP[GLOBAL_TOKEN_TYPES.FUNCTION] = SymbolKind.Function; +OUTLINE_TOKEN_KIND_MAP[GLOBAL_TOKEN_TYPES.FUNCTION_METHOD] = SymbolKind.Class; +OUTLINE_TOKEN_KIND_MAP[GLOBAL_TOKEN_TYPES.PROCEDURE] = SymbolKind.Function; +OUTLINE_TOKEN_KIND_MAP[GLOBAL_TOKEN_TYPES.PROCEDURE_METHOD] = SymbolKind.Class; + +/** + * If we have a mistake and a global token is in the outline tokens, but not the map, + * then this is the default symbol kind that we will use + */ +export const DEFAULT_OUTLINE_SYMBOL_KIND = SymbolKind.Function; diff --git a/libs/parsing/parser/src/lib/parser-get-outline.ts b/libs/parsing/parser/src/lib/parser-get-outline.ts new file mode 100644 index 000000000..017827dfd --- /dev/null +++ b/libs/parsing/parser/src/lib/parser-get-outline.ts @@ -0,0 +1,89 @@ +import { + GLOBAL_TOKEN_TYPES, + GlobalTokenType, + IGlobalIndexedToken, +} from '@idl/data-types/core'; +import { IParsed } from '@idl/parsing/syntax-tree'; +import { DocumentSymbol } from 'vscode-languageserver'; + +import { + DEFAULT_OUTLINE_SYMBOL_KIND, + OUTLINE_THESE_TOKENS, + OUTLINE_TOKEN_KIND_MAP, +} from './parser-get-outline.interface'; + +/** + * Given a global token, returns the display name to be shown in the outline in VSCode + */ +export function OutlineDisplayName( + token: IGlobalIndexedToken +): string { + switch (token.type) { + case GLOBAL_TOKEN_TYPES.FUNCTION: + return `${token.meta.display}()`; + case GLOBAL_TOKEN_TYPES.FUNCTION_METHOD: + return `${token.meta.display}()`; + default: + return token.meta.display; + } +} + +/** + * Generates the outline for a PRO file + */ +export async function ParserGetOutline(parsed: IParsed) { + // get our global tokens + const global = parsed.global; + + // initialize object to track global tokens + // only track a single token per line which matches IDL where you cant declare + // more than one routine on the same line + const tracked: { [key: number]: DocumentSymbol } = {}; + + // process our global tokens + for (let i = 0; i < global.length; i++) { + // extract global token + const globali = global[i]; + + // check if we need to save + if (globali.type in OUTLINE_THESE_TOKENS) { + tracked[globali.pos[0]] = { + kind: + globali.type in OUTLINE_TOKEN_KIND_MAP + ? OUTLINE_TOKEN_KIND_MAP[globali.type] + : DEFAULT_OUTLINE_SYMBOL_KIND, + name: OutlineDisplayName(globali), + range: { + start: { + line: globali.pos[0], + character: globali.pos[1], + }, + end: { + line: globali.pos[0], + character: globali.pos[1] + globali.pos[2], + }, + }, + selectionRange: { + start: { + line: globali.pos[0], + character: globali.pos[1], + }, + end: { + line: globali.pos[0], + character: globali.pos[1] + globali.pos[2], + }, + }, + }; + } + } + + // order by appearance + const lines = Object.keys(tracked).sort(); + const found: DocumentSymbol[] = []; + for (let i = 0; i < lines.length; i++) { + found.push(tracked[lines[i]]); + } + + // add to outline + parsed.outline = found; +} diff --git a/libs/parsing/parser/src/lib/parser.ts b/libs/parsing/parser/src/lib/parser.ts index feaebde4b..5cafe0d28 100644 --- a/libs/parsing/parser/src/lib/parser.ts +++ b/libs/parsing/parser/src/lib/parser.ts @@ -15,6 +15,7 @@ import { readFile } from 'fs/promises'; import { CodeChecksum } from './code-checksum'; import { DEFAULT_PARSER_OPTIONS, IParserOptions } from './parser.interface'; +import { ParserGetOutline } from './parser-get-outline'; // call a function from our validators so the code gets loaded and bundled ActivateDefaultSyntaxRules(); @@ -96,6 +97,8 @@ export function Parser( main: [], }, uses: copy(DEFAULT_USES_THESE_GLOBAL_TOKEN), + outline: [], + semantic: { data: [] }, }; // extract tokens @@ -137,6 +140,9 @@ export function Parser( PostProcessProblems(tokenized); } + // get code outline + ParserGetOutline(tokenized); + return tokenized; } diff --git a/libs/parsing/problem-codes/project.json b/libs/parsing/problem-codes/project.json index 16bde4890..b39542f1b 100644 --- a/libs/parsing/problem-codes/project.json +++ b/libs/parsing/problem-codes/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/problem-codes/**/*.ts"] diff --git a/libs/parsing/routines/project.json b/libs/parsing/routines/project.json index 2ce340985..cf3410253 100644 --- a/libs/parsing/routines/project.json +++ b/libs/parsing/routines/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/routines/**/*.ts"] diff --git a/libs/parsing/semantic-tokens/project.json b/libs/parsing/semantic-tokens/project.json index d6d308ab1..5781173aa 100644 --- a/libs/parsing/semantic-tokens/project.json +++ b/libs/parsing/semantic-tokens/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/semantic-tokens/**/*.ts"] diff --git a/libs/parsing/semantic-tokens/src/lib/get-semantic-tokens.ts b/libs/parsing/semantic-tokens/src/lib/get-semantic-tokens.ts index 2381698a0..8122ae307 100644 --- a/libs/parsing/semantic-tokens/src/lib/get-semantic-tokens.ts +++ b/libs/parsing/semantic-tokens/src/lib/get-semantic-tokens.ts @@ -1,7 +1,6 @@ import { IParsed } from '@idl/parsing/syntax-tree'; import { SemanticTokenModifiers, - SemanticTokens, SemanticTokensBuilder, SemanticTokenTypes, } from 'vscode-languageserver'; @@ -14,7 +13,7 @@ import { /** * Returns semantic tokens from parsed code */ -export function GetSemanticTokens(parsed: IParsed): SemanticTokens { +export function GetSemanticTokens(parsed: IParsed) { /** * Combine all variable lookups */ @@ -72,7 +71,7 @@ export function GetSemanticTokens(parsed: IParsed): SemanticTokens { // if no tokens return if (tokens.length === 0) { - return undefined; + return; } /** @@ -94,5 +93,6 @@ export function GetSemanticTokens(parsed: IParsed): SemanticTokens { ); } - return builder.build(); + // save semantic tokens + parsed.semantic = builder.build(); } diff --git a/libs/parsing/syntax-post-processors/project.json b/libs/parsing/syntax-post-processors/project.json index 8f5826d9e..06f76d13b 100644 --- a/libs/parsing/syntax-post-processors/project.json +++ b/libs/parsing/syntax-post-processors/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/syntax-post-processors/**/*.ts"] diff --git a/libs/parsing/syntax-post-processors/src/lib/post-processors/main-level.ts b/libs/parsing/syntax-post-processors/src/lib/post-processors/main-level.ts index 60af8e064..cbea68ff2 100644 --- a/libs/parsing/syntax-post-processors/src/lib/post-processors/main-level.ts +++ b/libs/parsing/syntax-post-processors/src/lib/post-processors/main-level.ts @@ -70,6 +70,11 @@ IDL_SYNTAX_TREE_POST_PROCESSOR.onTree((tree, parsed) => { // change end of the tree to account for reverse idx = tree.length - idx - 1; + // return if only tokens that we should ignore + if (tree.slice(idx).filter((el) => !(el.name in IGNORE)).length === 0) { + return; + } + // extract our children const mainChildren = tree.splice(idx, tree.length - idx); diff --git a/libs/parsing/syntax-tree/project.json b/libs/parsing/syntax-tree/project.json index 1d82c3d09..da966abb7 100644 --- a/libs/parsing/syntax-tree/project.json +++ b/libs/parsing/syntax-tree/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/syntax-tree/**/*.ts"] diff --git a/libs/parsing/syntax-tree/src/lib/build-syntax-tree.interface.ts b/libs/parsing/syntax-tree/src/lib/build-syntax-tree.interface.ts index ea58c7c85..62b0252fa 100644 --- a/libs/parsing/syntax-tree/src/lib/build-syntax-tree.interface.ts +++ b/libs/parsing/syntax-tree/src/lib/build-syntax-tree.interface.ts @@ -7,6 +7,7 @@ import { import { SyntaxProblems } from '@idl/parsing/problem-codes'; import { IFoundTokens } from '@idl/parsing/tokenizer'; import { PositionArray } from '@idl/parsing/tokenizer-types'; +import { DocumentSymbol, SemanticTokens } from 'vscode-languageserver'; import { SyntaxTree } from './branches.interface'; import { ILocalTokens } from './populators/populate-local.interface'; @@ -149,6 +150,10 @@ export interface IParsed extends IFoundTokens { compile: ICompileOptions; /** Global constructs that we call (for change detection) */ uses: UsesTheseGlobalTokens; + /** The outline of our current PRO code */ + outline: DocumentSymbol[]; + /** Semantic tokens that we highlight */ + semantic: SemanticTokens; } /** @@ -176,4 +181,6 @@ export const DEFAULT_PARSED: IParsed = { main: [], }, uses: DEFAULT_USES_THESE_GLOBAL_TOKEN, + outline: [], + semantic: { data: [] }, }; diff --git a/libs/parsing/syntax-tree/src/lib/populators/populate-global.ts b/libs/parsing/syntax-tree/src/lib/populators/populate-global.ts index 5fb6ebfb9..aa3531dbd 100644 --- a/libs/parsing/syntax-tree/src/lib/populators/populate-global.ts +++ b/libs/parsing/syntax-tree/src/lib/populators/populate-global.ts @@ -94,6 +94,11 @@ export function PopulateGlobalLocalCompileOpts( structures = FindStructureDefs(branch, name, found); } + // check for comments within routines + if (branch.kids[1]?.name === TOKEN_NAMES.COMMENT_BLOCK) { + docs = branch.kids[1]; + } + // generate metadata const meta = full ? GenerateRoutineDocsAndMetadata( @@ -214,6 +219,11 @@ export function PopulateGlobalLocalCompileOpts( structures = FindStructureDefs(branch, name, found); } + // check for comments within routines + if (branch.kids[1]?.name === TOKEN_NAMES.COMMENT_BLOCK) { + docs = branch.kids[1]; + } + // generate metadata const meta = full ? GenerateRoutineDocsAndMetadata( diff --git a/libs/parsing/syntax-validators/project.json b/libs/parsing/syntax-validators/project.json index ca020cb5b..1770fae98 100644 --- a/libs/parsing/syntax-validators/project.json +++ b/libs/parsing/syntax-validators/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/syntax-validators/**/*.ts"] diff --git a/libs/parsing/tokenizer-types/project.json b/libs/parsing/tokenizer-types/project.json index e21a3c4ac..345719a36 100644 --- a/libs/parsing/tokenizer-types/project.json +++ b/libs/parsing/tokenizer-types/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/parsing/tokenizer-types/**/*.ts"] diff --git a/libs/parsing/tokenizer/project.json b/libs/parsing/tokenizer/project.json index c4bc11cff..b8d2abe69 100644 --- a/libs/parsing/tokenizer/project.json +++ b/libs/parsing/tokenizer/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "options": { "lintFilePatterns": ["libs/parsing/tokenizer/**/*.ts"] }, diff --git a/libs/schemas/idl.json/project.json b/libs/schemas/idl.json/project.json index 8c16b34c4..22f498361 100644 --- a/libs/schemas/idl.json/project.json +++ b/libs/schemas/idl.json/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/schemas/idl.json/**/*.ts"] diff --git a/libs/schemas/tasks/project.json b/libs/schemas/tasks/project.json index 81fb942a4..9764ed2cc 100644 --- a/libs/schemas/tasks/project.json +++ b/libs/schemas/tasks/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/schemas/tasks/**/*.ts"] diff --git a/libs/shared/project.json b/libs/shared/project.json index c47005bc4..0a5304839 100644 --- a/libs/shared/project.json +++ b/libs/shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/shared/**/*.ts"] diff --git a/libs/shared/src/lib/idl-commands.interface.ts b/libs/shared/src/lib/idl-commands.interface.ts index 1fda7a31a..9fca1ed32 100644 --- a/libs/shared/src/lib/idl-commands.interface.ts +++ b/libs/shared/src/lib/idl-commands.interface.ts @@ -96,6 +96,14 @@ export const IDL_COMMANDS = { HELP_AS_NOTEBOOK: `${BASE_NOTEBOOK}helpAsNotebook`, /** Open IDL example notebook */ OPEN_IDL_EXAMPLE: `${BASE_NOTEBOOK}openIDLExample`, + /** Open ENVI example notebook */ + OPEN_ENVI_EXAMPLE: `${BASE_NOTEBOOK}openENVIExample`, + /** Reset example notebooks */ + RESET_NOTEBOOK_EXAMPLES: `${BASE_NOTEBOOK}resetNotebookExamples`, + /** Create a new notebook */ + NEW_NOTEBOOK: `${BASE_NOTEBOOK}newNotebook`, + /** Convert a notebook to PRO code */ + NOTEBOOK_TO_PRO_CODE: `${BASE_NOTEBOOK}notebookToProCode`, }, // /** Commands for starting and interacting with a terminal session of IDL */ // TERMINAL: { diff --git a/libs/shared/src/lib/language.interface.ts b/libs/shared/src/lib/language.interface.ts index c368a628c..1ec3c4302 100644 --- a/libs/shared/src/lib/language.interface.ts +++ b/libs/shared/src/lib/language.interface.ts @@ -26,7 +26,7 @@ export const LANGUAGE_TOKEN_SCOPE_NAME = `source.${IDL_LANGUAGE_NAME}`; /** * The name of IDL notebooks */ -export const IDL_NOTEBOOK_NAME = `${IDL_LANGUAGE_NAME}-notebook`; +export const IDL_NOTEBOOK_LANGUAGE_NAME = `${IDL_LANGUAGE_NAME}-notebook`; /** * The name of IDL notebooks @@ -42,7 +42,7 @@ export const IDL_NOTEBOOK_CONTROLLER_TRANSLATION_NAME = /** * The name of IDL notebook renderer */ -export const IDL_NOTEBOOK_RENDERER_NAME = `${IDL_NOTEBOOK_NAME}-renderer`; +export const IDL_NOTEBOOK_RENDERER_NAME = `${IDL_NOTEBOOK_LANGUAGE_NAME}-renderer`; /** * Name of the extension in VSCode diff --git a/libs/shared/src/lib/version.interface.ts b/libs/shared/src/lib/version.interface.ts index 6000c5f8e..b9ae73df0 100644 --- a/libs/shared/src/lib/version.interface.ts +++ b/libs/shared/src/lib/version.interface.ts @@ -1,4 +1,4 @@ /** * Version of the extension */ -export const VERSION = '3.2.4'; +export const VERSION = '4.0.0'; diff --git a/libs/test-helpers/project.json b/libs/test-helpers/project.json index 198f63740..06c2784f2 100644 --- a/libs/test-helpers/project.json +++ b/libs/test-helpers/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/test-helpers/**/*.ts"] diff --git a/libs/tests/assembler/project.json b/libs/tests/assembler/project.json index c3a4baa6c..e682e6510 100644 --- a/libs/tests/assembler/project.json +++ b/libs/tests/assembler/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/assembler/**/*.ts"] diff --git a/libs/tests/assembler/src/lib/auto-doc.below.spec.ts b/libs/tests/assembler/src/lib/auto-doc.below.spec.ts new file mode 100644 index 000000000..3d6979304 --- /dev/null +++ b/libs/tests/assembler/src/lib/auto-doc.below.spec.ts @@ -0,0 +1,282 @@ +import { Assembler } from '@idl/assembler'; +import { CancellationToken } from '@idl/cancellation-tokens'; +import { LogManager } from '@idl/logger'; +import { GetTokenNames } from '@idl/parser'; +import { IDL_INDEX_OPTIONS, IDLIndex } from '@idl/parsing/index'; +import { SyntaxProblems } from '@idl/parsing/problem-codes'; + +IDL_INDEX_OPTIONS.IS_TEST = true; + +describe(`[auto generated] Verify auto-doc when below`, () => { + it(`[auto generated] does not add docs above`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + autoDoc: true, + autoFix: false, + formatter: 'fiddle', + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third`, + ` ;+`, + ` ; :Keywords:`, + ` ; input_raster: in, optional, ENVIRaster`, + ` ; Thing 1`, + ` ; output_raster_uri: in, optional, String`, + ` ; Thing 2`, + ` ; third: bidirectional, optional, any`, + ` ; Thing 3`, + ` ;`, + ` ;-`, + ` compile_opt idl2`, + ``, + ` ; get the current session of ENVI`, + ` e = envi(/current)`, + ` if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + ` endif`, + ` idltasktest, input_raster = 5`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 104, + info: 'Unused variable "input_raster"', + start: [0, 44, 12], + end: [0, 44, 12], + }, + { + code: 104, + info: 'Unused variable "output_raster_uri"', + start: [0, 78, 17], + end: [0, 78, 17], + }, + { + code: 104, + info: 'Unused variable "third"', + start: [0, 105, 5], + end: [0, 105, 5], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] updates comment blocks right`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ``, + `; main level program`, + `compile_opt idl2`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + autoDoc: true, + autoFix: false, + formatter: 'fiddle', + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + ` ;+`, + ` ; :Keywords:`, + ` ; input_raster: in, optional, ENVIRaster`, + ` ; Thing 1`, + ` ; output_raster_uri: in, optional, String`, + ` ; Thing 2`, + ` ; third2: bidirectional, optional, any`, + ` ; Placeholder docs for argument, keyword, or property`, + ` ; third: bidirectional, optional, any`, + ` ; Thing 3`, + ` ;`, + ` ;-`, + ` compile_opt idl2`, + ``, + ` ; get the current session of ENVI`, + ` e = envi(/current)`, + ` if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + ` endif`, + ` idltasktest, input_raster = 5`, + `end`, + ``, + `; main level program`, + `compile_opt idl2`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 63, + info: 'Documented argument, keyword, or property does not exist: "third"', + start: [7, 0, 39], + end: [7, 0, 39], + }, + { + code: 64, + info: 'Parameter is missing from documentation: "third2"', + start: [0, 97, 6], + end: [0, 97, 6], + }, + { + code: 104, + info: 'Unused variable "input_raster"', + start: [0, 44, 12], + end: [0, 44, 12], + }, + { + code: 104, + info: 'Unused variable "output_raster_uri"', + start: [0, 78, 17], + end: [0, 78, 17], + }, + { + code: 104, + info: 'Unused variable "third"', + start: [0, 106, 5], + end: [0, 106, 5], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); +}); diff --git a/libs/tests/assembler/src/lib/auto-doc.structures.2.spec.ts b/libs/tests/assembler/src/lib/auto-doc.structures.2.spec.ts index 74cec1f1b..fd54637b9 100644 --- a/libs/tests/assembler/src/lib/auto-doc.structures.2.spec.ts +++ b/libs/tests/assembler/src/lib/auto-doc.structures.2.spec.ts @@ -70,11 +70,11 @@ describe(`[auto generated] Generate structure docs`, () => { `pro pro4__define`, ` compile_opt idl2`, ``, - ` !null = {struct1}`, + ` !null = {Struct1}`, ``, - ` !null = {struct2}`, + ` !null = {Struct2}`, ``, - ` !null = {struct3, prop: 'socool'}`, + ` !null = {Struct3, prop: 'socool'}`, `end`, ]; diff --git a/libs/tests/assembler/src/lib/auto-doc.structures.spec.ts b/libs/tests/assembler/src/lib/auto-doc.structures.spec.ts index 5fa0a8ac2..178400f55 100644 --- a/libs/tests/assembler/src/lib/auto-doc.structures.spec.ts +++ b/libs/tests/assembler/src/lib/auto-doc.structures.spec.ts @@ -72,9 +72,9 @@ describe(`[auto generated] Generate structure docs`, () => { `pro pro4__define`, ` compile_opt idl2`, ``, - ` !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}`, + ` !null = {MyStruct, inherits IDL_Object, prop: 1, prop2: 4}`, ``, - ` !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}`, + ` !null = {Mystruct2, inherits IDL_Object, prop: 1, prop2: 4}`, `end`, ]; @@ -154,9 +154,9 @@ describe(`[auto generated] Generate structure docs`, () => { `pro pro4`, ` compile_opt idl2`, ``, - ` !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}`, + ` !null = {MyStruct, inherits IDL_Object, prop: 1, prop2: 4}`, ``, - ` !null = {mystruct2, inherits IDL_object, prop: 1, prop2: 4}`, + ` !null = {Mystruct2, inherits IDL_Object, prop: 1, prop2: 4}`, `end`, ]; @@ -263,7 +263,7 @@ describe(`[auto generated] Generate structure docs`, () => { `pro pro4__define`, ` compile_opt idl2`, ``, - ` !null = {MyStruct, inherits IDL_object, prop: 1, prop2: 4}`, + ` !null = {MyStruct, inherits IDL_Object, prop: 1, prop2: 4}`, `end`, ]; diff --git a/libs/tests/assembler/src/lib/lib-examples.1.spec.ts b/libs/tests/assembler/src/lib/lib-examples.1.spec.ts index baf8ef4ba..b29ab7e82 100644 --- a/libs/tests/assembler/src/lib/lib-examples.1.spec.ts +++ b/libs/tests/assembler/src/lib/lib-examples.1.spec.ts @@ -238,36 +238,36 @@ describe(`[auto generated] Verify code snippets from the lib folder`, () => { } else { // define expected problems const expectedFormatting: string[] = [ - `if ((*pstate).mousestate eq 1) then begin`, + `if ((*pstate).mouseState eq 1) then begin`, ` if (totCOBs gt rows) then begin`, - ` if ((*pstate).scrollup eq 0) then begin ; scroll down`, - ` if ((*pstate).cobindex lt totCOBs) then begin`, - ` (*pstate).cobindex = (*pstate).cobindex + (*pstate).pagescrlinc`, + ` if ((*pstate).scrollUp eq 0) then begin ; scroll down`, + ` if ((*pstate).cobIndex lt totCOBs) then begin`, + ` (*pstate).cobIndex = (*pstate).cobIndex + (*pstate).pageScrlInc`, ``, - ` idx = (*pstate).cobindex`, + ` idx = (*pstate).cobIndex`, ` skip = idx - rows`, ` if (skip gt (totCOBs - rows)) then begin`, ` skip = totCOBs - rows`, ` ; (*pstate).cobIndex = totCOBs-rows`, - ` (*pstate).cobindex = totCOBs`, + ` (*pstate).cobIndex = totCOBs`, ` endif`, ``, - ` res = (*pstate).owcs.GetCoverageOfferingBriefs(index = skip, number = rows)`, + ` res = (*pstate).owcs.getCoverageOfferingBriefs(index = skip, number = rows)`, ` cw_ogc_wcs_cap_display_cap_table, ev, res`, ` endif`, ` endif else begin ; scroll up`, - ` if ((*pstate).cobindex gt rows) then begin`, - ` (*pstate).cobindex = (*pstate).cobindex - (*pstate).pagescrlinc`, + ` if ((*pstate).cobIndex gt rows) then begin`, + ` (*pstate).cobIndex = (*pstate).cobIndex - (*pstate).pageScrlInc`, ``, - ` idx = (*pstate).cobindex`, + ` idx = (*pstate).cobIndex`, ` skip = idx - rows`, ``, ` if (skip lt 0) then begin`, ` skip = 0`, - ` (*pstate).cobindex = rows`, + ` (*pstate).cobIndex = rows`, ` endif`, ``, - ` res = (*pstate).owcs.GetCoverageOfferingBriefs(index = skip, number = rows)`, + ` res = (*pstate).owcs.getCoverageOfferingBriefs(index = skip, number = rows)`, ` cw_ogc_wcs_cap_display_cap_table, ev, res`, ` endif`, ` endelse`, diff --git a/libs/tests/assembler/src/lib/style.control.spec.ts b/libs/tests/assembler/src/lib/style.control.spec.ts index f9eace89f..64c09a126 100644 --- a/libs/tests/assembler/src/lib/style.control.spec.ts +++ b/libs/tests/assembler/src/lib/style.control.spec.ts @@ -159,7 +159,7 @@ describe(`[auto generated] Control statement styling`, () => { `endelse`, ``, `; structure inheritance`, - `mystruct = {myname, inherits plot}`, + `mystruct = {Myname, inherits Plot}`, ``, `; executive command`, `.reset`, @@ -409,7 +409,7 @@ describe(`[auto generated] Control statement styling`, () => { `ENDELSE`, ``, `; structure inheritance`, - `mystruct = {myname, INHERITS plot}`, + `mystruct = {Myname, INHERITS Plot}`, ``, `; executive command`, `.RESET`, @@ -659,7 +659,7 @@ describe(`[auto generated] Control statement styling`, () => { `endelse`, ``, `; structure inheritance`, - `mystruct = {myname, INHerits plot}`, + `mystruct = {Myname, INHerits Plot}`, ``, `; executive command`, `.reset`, diff --git a/libs/tests/assembler/src/lib/style.internal-routines.spec.ts b/libs/tests/assembler/src/lib/style.internal-routines.spec.ts index 44346b969..51a5d2b2f 100644 --- a/libs/tests/assembler/src/lib/style.internal-routines.spec.ts +++ b/libs/tests/assembler/src/lib/style.internal-routines.spec.ts @@ -8,7 +8,7 @@ import { SyntaxProblems } from '@idl/parsing/problem-codes'; IDL_INDEX_OPTIONS.IS_TEST = true; describe(`[auto generated] Style internal routines`, () => { - it(`[auto generated] using modern format`, async () => { + it(`[auto generated] match`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -140,7 +140,7 @@ describe(`[auto generated] Style internal routines`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] using no format`, async () => { + it(`[auto generated] pascal`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -190,7 +190,7 @@ describe(`[auto generated] Style internal routines`, () => { // format code const formatted = Assembler(tokenized, new CancellationToken(), { formatter: 'fiddle', - style: { routines: 'none' }, + style: { routines: 'pascal' }, autoFix: false, }); @@ -207,16 +207,544 @@ describe(`[auto generated] Style internal routines`, () => { ``, `compile_opt idl2`, ``, - `PRINT`, + `Print`, `Openr`, ``, + `p = Plot()`, + ``, + `r = ENVIRaster()`, + ``, + `o = IDLnetUrl()`, + ``, + `s = IDLffShape()`, + ``, + `!null = Strtok('something')`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 104, + info: 'Unused variable "p"', + start: [10, 0, 1], + end: [10, 0, 1], + }, + { + code: 104, + info: 'Unused variable "r"', + start: [12, 0, 1], + end: [12, 0, 1], + }, + { + code: 104, + info: 'Unused variable "o"', + start: [14, 0, 1], + end: [14, 0, 1], + }, + { + code: 104, + info: 'Unused variable "s"', + start: [16, 0, 1], + end: [16, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] camel`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'camel' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro mypro`, + ` compile_opt idl2`, + ` return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `print`, + `openr`, + ``, + `p = plot()`, + ``, + `r = enviRaster()`, + ``, + `o = idlNetUrl()`, + ``, + `s = idlFfShape()`, + ``, + `!null = strtok('something')`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 104, + info: 'Unused variable "p"', + start: [10, 0, 1], + end: [10, 0, 1], + }, + { + code: 104, + info: 'Unused variable "r"', + start: [12, 0, 1], + end: [12, 0, 1], + }, + { + code: 104, + info: 'Unused variable "o"', + start: [14, 0, 1], + end: [14, 0, 1], + }, + { + code: 104, + info: 'Unused variable "s"', + start: [16, 0, 1], + end: [16, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] upper`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'upper' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro mypro`, + ` compile_opt idl2`, + ` RETURN`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `OPENR`, + ``, `p = PLOT()`, ``, + `r = ENVIRASTER()`, + ``, + `o = IDLNETURL()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 104, + info: 'Unused variable "p"', + start: [10, 0, 1], + end: [10, 0, 1], + }, + { + code: 104, + info: 'Unused variable "r"', + start: [12, 0, 1], + end: [12, 0, 1], + }, + { + code: 104, + info: 'Unused variable "o"', + start: [14, 0, 1], + end: [14, 0, 1], + }, + { + code: 104, + info: 'Unused variable "s"', + start: [16, 0, 1], + end: [16, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] lower`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'lower' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro mypro`, + ` compile_opt idl2`, + ` return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `print`, + `openr`, + ``, + `p = plot()`, + ``, `r = enviraster()`, ``, `o = idlneturl()`, ``, - `s = IDLFFSHAPE()`, + `s = idlffshape()`, + ``, + `!null = strtok('something')`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 104, + info: 'Unused variable "p"', + start: [10, 0, 1], + end: [10, 0, 1], + }, + { + code: 104, + info: 'Unused variable "r"', + start: [12, 0, 1], + end: [12, 0, 1], + }, + { + code: 104, + info: 'Unused variable "o"', + start: [14, 0, 1], + end: [14, 0, 1], + }, + { + code: 104, + info: 'Unused variable "s"', + start: [16, 0, 1], + end: [16, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] none`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `PRINT`, + `Openr`, + ``, + `p = PLOT()`, + ``, + `r = enviraster()`, + ``, + `o = idlneturl()`, + ``, + `s = IDLFFSHAPE()`, + ``, + `!null = STRTOK('something')`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'none' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro mypro`, + ` compile_opt idl2`, + ` Return`, + `end`, + ``, + `compile_opt idl2`, + ``, + `print`, + `openr`, + ``, + `p = plot()`, + ``, + `r = ENVIRaster()`, + ``, + `o = IDLnetURL()`, + ``, + `s = IDLffShape()`, ``, `!null = STRTOK('something')`, ``, diff --git a/libs/tests/assembler/src/lib/style.logic-case.1.spec.ts b/libs/tests/assembler/src/lib/style.logic-case.1.spec.ts index 25cbcd95f..3eb710338 100644 --- a/libs/tests/assembler/src/lib/style.logic-case.1.spec.ts +++ b/libs/tests/assembler/src/lib/style.logic-case.1.spec.ts @@ -69,7 +69,7 @@ describe(`[auto generated] Verify we style case`, () => { ` : $`, ` print, 'one' + func()`, ` else: begin`, - ` dat = {myStruct}`, + ` dat = {MyStruct}`, ` print, 'Please enter a value between 1 and 4'`, ` end`, `endcase`, @@ -561,28 +561,28 @@ describe(`[auto generated] Verify we style case`, () => { `; Just determine what to do and register.`, `case 1 of`, ` keyword_set(visualization): $`, - ` oSystem.RegisterVisualization, strName, strClassName, _extra = _extra`, + ` oSystem.registerVisualization, strName, strClassName, _extra = _extra`, ``, ` keyword_set(annotation): $`, - ` oSystem.RegisterAnnotation, strName, strClassName, _extra = _extra`, + ` oSystem.registerAnnotation, strName, strClassName, _extra = _extra`, ``, ` keyword_set(user_interface): $`, - ` oSystem.RegisterUserInterface, strName, strClassName, _extra = _extra`, + ` oSystem.registerUserInterface, strName, strClassName, _extra = _extra`, ``, ` keyword_set(ui_panel): $`, - ` oSystem.RegisterUIPanel, strName, strClassName, _extra = _extra`, + ` oSystem.registerUiPanel, strName, strClassName, _extra = _extra`, ``, ` keyword_set(ui_service): $`, - ` oSystem.RegisterUIService, strName, strClassName, _extra = _extra`, + ` oSystem.registerUiService, strName, strClassName, _extra = _extra`, ``, ` keyword_set(file_reader): $`, - ` oSystem.RegisterFileReader, strName, strClassName, _extra = _extra`, + ` oSystem.registerFileReader, strName, strClassName, _extra = _extra`, ``, ` keyword_set(file_writer): $`, - ` oSystem.RegisterFileWriter, strName, strClassName, _extra = _extra`, + ` oSystem.registerFileWriter, strName, strClassName, _extra = _extra`, ``, ` else: $`, - ` oSystem.RegisterTool, strName, strClassName, _extra = _extra`, + ` oSystem.registerTool, strName, strClassName, _extra = _extra`, `endcase`, `end`, ]; diff --git a/libs/tests/assembler/src/lib/style.logic-switch.1.spec.ts b/libs/tests/assembler/src/lib/style.logic-switch.1.spec.ts index 0acda49b6..f798f3c2e 100644 --- a/libs/tests/assembler/src/lib/style.logic-switch.1.spec.ts +++ b/libs/tests/assembler/src/lib/style.logic-switch.1.spec.ts @@ -69,7 +69,7 @@ describe(`[auto generated] Verify we style switch`, () => { ` : $`, ` print, 'one' + func()`, ` else: begin`, - ` dat = {myStruct}`, + ` dat = {MyStruct}`, ` print, 'Please enter a value between 1 and 4'`, ` end`, `endcase`, diff --git a/libs/tests/assembler/src/lib/style.logic-ternary.1.spec.ts b/libs/tests/assembler/src/lib/style.logic-ternary.1.spec.ts index b973d4132..98bcf72ed 100644 --- a/libs/tests/assembler/src/lib/style.logic-ternary.1.spec.ts +++ b/libs/tests/assembler/src/lib/style.logic-ternary.1.spec.ts @@ -128,7 +128,7 @@ describe(`[auto generated] Verify we style ternary operators well`, () => { } else { // define expected problems const expectedFormatting: string[] = [ - `oWorld = obj_valid(oLayer) ? oLayer.GetWorld() : obj_new()`, + `oWorld = obj_valid(oLayer) ? oLayer.getWorld() : obj_new()`, ]; // verify formatting diff --git a/libs/tests/assembler/src/lib/style.methods-call.spec.ts b/libs/tests/assembler/src/lib/style.methods-call.spec.ts index 19d8a1805..bb7d99022 100644 --- a/libs/tests/assembler/src/lib/style.methods-call.spec.ts +++ b/libs/tests/assembler/src/lib/style.methods-call.spec.ts @@ -58,7 +58,7 @@ describe(`[auto generated] Method styling`, () => { // format code const formatted = Assembler(tokenized, new CancellationToken(), { formatter: 'fiddle', - style: { routines: 'match' }, + style: { routineMethods: 'match' }, autoFix: false, }); @@ -115,6 +115,434 @@ describe(`[auto generated] Method styling`, () => { ).toEqual(expectedProblems); }); + it(`[auto generated] pascal`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routineMethods: 'pascal' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `function myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` !null = self.Mymethod()`, + ``, + ` return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` self.Mymethod`, + `end`, + ``, + `pro auto_doc_example`, + ` compile_opt idl2`, + ``, + ` p = IDLgrSurface()`, + ` !null = p.GetFullIdentifier()`, + ` p.SetVertexAttributeData`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] camel`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routineMethods: 'camel' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `function myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` !null = self.mymethod()`, + ``, + ` return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` self.mymethod`, + `end`, + ``, + `pro auto_doc_example`, + ` compile_opt idl2`, + ``, + ` p = IDLgrSurface()`, + ` !null = p.getFullIdentifier()`, + ` p.setVertexAttributeData`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] upper`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routineMethods: 'upper' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `function myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` !null = self.MYMETHOD()`, + ``, + ` return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` self.MYMETHOD`, + `end`, + ``, + `pro auto_doc_example`, + ` compile_opt idl2`, + ``, + ` p = IDLgrSurface()`, + ` !null = p.GETFULLIDENTIFIER()`, + ` p.SETVERTEXATTRIBUTEDATA`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] lower`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `!null = self.myMethod()`, + ``, + `return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + `compile_opt idl2`, + ``, + `self.myMethod`, + `end`, + ``, + `pro auto_doc_example`, + `compile_opt idl2`, + ``, + `p = IDLgrSurface()`, + `!null = p.getFullIdentifier()`, + `p.SETVERTEXATTRIBUTEDATA`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routineMethods: 'lower' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `function myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` !null = self.mymethod()`, + ``, + ` return, 1`, + `end`, + ``, + `pro myclass::MYMETHOD`, + ` compile_opt idl2`, + ``, + ` self.mymethod`, + `end`, + ``, + `pro auto_doc_example`, + ` compile_opt idl2`, + ``, + ` p = IDLgrSurface()`, + ` !null = p.getfullidentifier()`, + ` p.setvertexattributedata`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + it(`[auto generated] none`, async () => { // create index const index = new IDLIndex( @@ -165,7 +593,7 @@ describe(`[auto generated] Method styling`, () => { // format code const formatted = Assembler(tokenized, new CancellationToken(), { formatter: 'fiddle', - style: { routines: 'none' }, + style: { routineMethods: 'none' }, autoFix: false, }); diff --git a/libs/tests/assembler/src/lib/style.operators.1.spec.ts b/libs/tests/assembler/src/lib/style.operators.1.spec.ts index dc77777a5..66d82be7a 100644 --- a/libs/tests/assembler/src/lib/style.operators.1.spec.ts +++ b/libs/tests/assembler/src/lib/style.operators.1.spec.ts @@ -55,7 +55,7 @@ describe(`[auto generated] Verify operators`, () => { `compile_opt idl2`, ``, `; complex pointers`, - `(*pstate).codescovidarr[(*pstate).codescovidarridx++] = ogc_wcs_descov(ev.top, (*pstate).owcs, covNames, '')`, + `(*pstate).coDesCovIdArr[(*pstate).coDesCovIdArrIdx++] = ogc_wcs_descov(ev.top, (*pstate).owcs, covNames, '')`, ``, `end`, ]; @@ -357,7 +357,7 @@ describe(`[auto generated] Verify operators`, () => { } else { // define expected problems const expectedFormatting: string[] = [ - `if ~keyword_set(difference_raster_uri) then difference_raster_uri = e.GetTemporaryFilename()`, + `if ~keyword_set(difference_raster_uri) then difference_raster_uri = e.getTemporaryFilename()`, ]; // verify formatting @@ -445,7 +445,7 @@ describe(`[auto generated] Verify operators`, () => { `a = 5 * 10`, `(*ptr).prop = 5`, `b = *ptr`, - `segsUpper.Add, *overlaps.lower[mapXY[0], mapXY[1] - 1], /extract`, + `segsUpper.add, *overlaps.lower[mapXY[0], mapXY[1] - 1], /extract`, `end`, ]; diff --git a/libs/tests/assembler/src/lib/style.properties.spec.ts b/libs/tests/assembler/src/lib/style.properties.spec.ts index 854ff282f..1209b6e63 100644 --- a/libs/tests/assembler/src/lib/style.properties.spec.ts +++ b/libs/tests/assembler/src/lib/style.properties.spec.ts @@ -8,7 +8,7 @@ import { SyntaxProblems } from '@idl/parsing/problem-codes'; IDL_INDEX_OPTIONS.IS_TEST = true; describe(`[auto generated] Property styling`, () => { - it(`[auto generated] using modern format`, async () => { + it(`[auto generated] match`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -100,7 +100,191 @@ describe(`[auto generated] Property styling`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] using modern format`, async () => { + it(`[auto generated] pascal`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.myPROP`, + `b = {SomeThing:'cool'}`, + `!null = b.SomeThing`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { properties: 'pascal' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.MyProp`, + `b = {SomeThing: 'cool'}`, + `!null = b.SomeThing`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 99, + info: 'Undefined variable "myvar"', + start: [2, 4, 5], + end: [2, 4, 5], + }, + { + code: 104, + info: 'Unused variable "a"', + start: [2, 0, 1], + end: [2, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] camel`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.myPROP`, + `b = {SomeThing:'cool'}`, + `!null = b.SomeThing`, + ``, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { properties: 'camel' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2, hidden`, + ``, + `a = myvar.myProp`, + `b = {someThing: 'cool'}`, + `!null = b.someThing`, + ``, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 99, + info: 'Undefined variable "myvar"', + start: [2, 4, 5], + end: [2, 4, 5], + }, + { + code: 104, + info: 'Unused variable "a"', + start: [2, 0, 1], + end: [2, 0, 1], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] lower`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -192,7 +376,7 @@ describe(`[auto generated] Property styling`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] using dated format`, async () => { + it(`[auto generated] upper`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -284,7 +468,7 @@ describe(`[auto generated] Property styling`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] using no format`, async () => { + it(`[auto generated] none`, async () => { // create index const index = new IDLIndex( new LogManager({ diff --git a/libs/tests/assembler/src/lib/style.structure-names.1.spec.ts b/libs/tests/assembler/src/lib/style.structure-names.1.spec.ts new file mode 100644 index 000000000..63cdede7b --- /dev/null +++ b/libs/tests/assembler/src/lib/style.structure-names.1.spec.ts @@ -0,0 +1,514 @@ +import { Assembler } from '@idl/assembler'; +import { CancellationToken } from '@idl/cancellation-tokens'; +import { LogManager } from '@idl/logger'; +import { GetTokenNames } from '@idl/parser'; +import { IDL_INDEX_OPTIONS, IDLIndex } from '@idl/parsing/index'; +import { SyntaxProblems } from '@idl/parsing/problem-codes'; + +IDL_INDEX_OPTIONS.IS_TEST = true; + +describe(`[auto generated] Verify structure names`, () => { + it(`[auto generated] match`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'match' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {IDLnetURL}`, + `!null = {ENVIRaster}`, + `!null = {idlNotebook}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] pascal`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'pascal' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {IDLnetUrl}`, + `!null = {ENVIRaster}`, + `!null = {IDLNotebook}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] camel`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'camel' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {idlNetUrl}`, + `!null = {enviRaster}`, + `!null = {idlNotebook}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] upper`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'upper' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {IDLNETURL}`, + `!null = {ENVIRASTER}`, + `!null = {IDLNOTEBOOK}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] lower`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'lower' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {idlneturl}`, + `!null = {enviraster}`, + `!null = {idlnotebook}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] none`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + ` compile_opt idl2 `, + `!null = { IDLnetURl }`, + `!null = { enviRaster }`, + `!null = { idlNotebook }`, + `!null = { !map } ; special case, handled by sys var`, + `end `, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { structureNames: 'none' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `compile_opt idl2`, + `!null = {IDLnetURL}`, + `!null = {ENVIRaster}`, + `!null = {idlNotebook}`, + `!null = {!map} ; special case, handled by sys var`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = [ + { + code: 77, + info: 'No matching structure/object/class definition for structure named "idlNotebook "', + start: [3, 14, 14], + end: [3, 14, 14], + }, + ]; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); +}); diff --git a/libs/tests/assembler/src/lib/style.structures.1.spec.ts b/libs/tests/assembler/src/lib/style.structures.1.spec.ts index 63f086c0d..13458f33e 100644 --- a/libs/tests/assembler/src/lib/style.structures.1.spec.ts +++ b/libs/tests/assembler/src/lib/style.structures.1.spec.ts @@ -51,7 +51,7 @@ describe(`[auto generated] Verify structures`, () => { // define expected problems const expectedFormatting: string[] = [ `compile_opt idl2`, - `fourty2 = {mystruct}`, + `fourty2 = {Mystruct}`, ``, `end`, ]; @@ -158,8 +158,8 @@ describe(`[auto generated] Verify structures`, () => { ` on_error, 2`, ``, ` void = { $`, - ` FOLDERWATCH, $`, - ` inherits idl_object, $`, + ` Folderwatch, $`, + ` inherits IDL_Object, $`, ` _folder: '', $`, ` _callback: '', $`, ` _userdata: ptr_new(), $`, diff --git a/libs/tests/assembler/src/lib/style.user-routines.spec.ts b/libs/tests/assembler/src/lib/style.user-routines.spec.ts index 73af33f78..15a346c98 100644 --- a/libs/tests/assembler/src/lib/style.user-routines.spec.ts +++ b/libs/tests/assembler/src/lib/style.user-routines.spec.ts @@ -8,7 +8,7 @@ import { SyntaxProblems } from '@idl/parsing/problem-codes'; IDL_INDEX_OPTIONS.IS_TEST = true; describe(`[auto generated] Style user routines`, () => { - it(`[auto generated] using modern format`, async () => { + it(`[auto generated] match`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -101,7 +101,7 @@ describe(`[auto generated] Style user routines`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] using no format`, async () => { + it(`[auto generated] pascal`, async () => { // create index const index = new IDLIndex( new LogManager({ @@ -144,7 +144,100 @@ describe(`[auto generated] Style user routines`, () => { // format code const formatted = Assembler(tokenized, new CancellationToken(), { formatter: 'fiddle', - style: { routines: 'none' }, + style: { routines: 'pascal' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` Return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `Test_Things`, + `!null = Test_Things()`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] camel`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'camel' }, autoFix: false, }); @@ -165,7 +258,193 @@ describe(`[auto generated] Style user routines`, () => { ``, `compile_opt idl2`, ``, + `test_things`, + `!null = test_things()`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] upper`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'upper' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` RETURN, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, `TEST_THINGS`, + `!null = TEST_THINGS()`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] lower`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'lower' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `test_things`, `!null = test_things()`, `end`, ]; @@ -193,4 +472,97 @@ describe(`[auto generated] Style user routines`, () => { tokenized.parseProblems.concat(tokenized.postProcessProblems) ).toEqual(expectedProblems); }); + + it(`[auto generated] none`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `TEST_THINGS`, + `!null = test_things()`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'my_file.pro', + code, + new CancellationToken(), + { postProcess: true } + ); + + // extract token names + const tokenizedNames = GetTokenNames(tokenized); + + // format code + const formatted = Assembler(tokenized, new CancellationToken(), { + formatter: 'fiddle', + style: { routines: 'none' }, + autoFix: false, + }); + + // verify formatting + if (formatted === undefined) { + expect(formatted).toEqual(undefined); + } else { + // define expected problems + const expectedFormatting: string[] = [ + `pro test_things`, + ` compile_opt idl2`, + `end`, + ``, + `function test_THINGS`, + ` compile_opt idl2`, + ` return, 42`, + `end`, + ``, + `compile_opt idl2`, + ``, + `test_things`, + `!null = test_THINGS()`, + `end`, + ]; + + // verify formatting + expect(formatted.split(`\n`)).toEqual(expectedFormatting); + + // parse formatted code + const reParsed = await index.getParsedProCode( + 'my_file.pro', + formatted, + new CancellationToken(), + { postProcess: true } + ); + + // make sure the syntax trees are the same as they were before + expect(GetTokenNames(reParsed)).toEqual(tokenizedNames); + } + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify problems + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); }); diff --git a/libs/tests/auto-complete/project.json b/libs/tests/auto-complete/project.json index 57ad5214c..d3a367375 100644 --- a/libs/tests/auto-complete/project.json +++ b/libs/tests/auto-complete/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/auto-complete/**/*.ts"] diff --git a/libs/tests/auto-complete/src/lib/in-structures.1.spec.ts b/libs/tests/auto-complete/src/lib/in-structures.1.spec.ts index 24127b874..08bc1ea3d 100644 --- a/libs/tests/auto-complete/src/lib/in-structures.1.spec.ts +++ b/libs/tests/auto-complete/src/lib/in-structures.1.spec.ts @@ -486,7 +486,7 @@ describe(`[auto generated] Verify auto-complete in structures`, () => { }, { label: 'ENVIWorkflowStep::getUIObject()', - insertText: 'getUIObject()', + insertText: 'getUiObject()', kind: 2, sortText: '03', detail: 'Function Method', @@ -656,5 +656,599 @@ describe(`[auto generated] Verify auto-complete in structures`, () => { ) ).slice(0, 50) ); + // define position + const position_3: Position = { line: 24, character: 27 }; + + // define expected token we extract + const expectedFound_3: CompletionItem[] = [ + { label: '!x', kind: 7, sortText: '00', detail: 'Structure' }, + { label: '!y', kind: 7, sortText: '00', detail: 'Structure' }, + { label: '!z', kind: 7, sortText: '00', detail: 'Structure' }, + { + label: 'ENVIInitializeENVINet5MultiModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildLabelRasterFromClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPixelROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIRandomizeTrainTensorFlowMaskModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBoundingBoxSet', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildDeepLearningRasterTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildLabelRasterFromROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromAnnotationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromVectorTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolygonROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolygonShapefileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolylineShapefileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningLabelRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningObjectDetectionRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowMaskClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractDeepLearningLabelRasterFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractDeepLearningRasterFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractTensorFlowModelFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITrainTensorFlowObjectModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPostProcessObjectClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowModel', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowObjectClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowObjectModel', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITrainTensorFlowMaskModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIQuerySpectralLibraryTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIStretchParameters', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDiceRasterByVectorTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { label: 'ENVITask', kind: 7, sortText: '00', detail: 'Structure' }, + { + label: 'ENVILinearSpectralUnmixingTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDirectionalKernelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIVectorRecordsToBoundingBoxTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIMaximumLikelihoodClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPercentThresholdClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVICalibrateRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIVectorRecordsToROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIFireFuelClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVInnDiffusePanSharpeningRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPointCloudMetadata', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVICreateSubrectsFromTileCountTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVInnDiffusePanSharpeningTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIImageIntersectionTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBinaryGtThresholdRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIRadarBackscatterRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIAutoChangeThresholdClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + ]; + + // verify results + expect(expectedFound_3).toEqual( + ( + await index.getAutoComplete( + filepath, + await readFile(filepath, 'utf-8'), + position_3 + ) + ).slice(0, 50) + ); + // define position + const position_4: Position = { line: 24, character: 28 }; + + // define expected token we extract + const expectedFound_4: CompletionItem[] = [ + { label: '!x', kind: 7, sortText: '00', detail: 'Structure' }, + { label: '!y', kind: 7, sortText: '00', detail: 'Structure' }, + { label: '!z', kind: 7, sortText: '00', detail: 'Structure' }, + { + label: 'ENVIInitializeENVINet5MultiModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildLabelRasterFromClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPixelROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIRandomizeTrainTensorFlowMaskModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBoundingBoxSet', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildDeepLearningRasterTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildLabelRasterFromROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromAnnotationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBuildObjectDetectionRasterFromVectorTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolygonROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolygonShapefileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIClassActivationToPolylineShapefileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningLabelRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningObjectDetectionRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowMaskClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDeepLearningRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractDeepLearningLabelRasterFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractDeepLearningRasterFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIExtractTensorFlowModelFromFileTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITrainTensorFlowObjectModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPostProcessObjectClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowModel', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowObjectClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITensorFlowObjectModel', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVITrainTensorFlowMaskModelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIQuerySpectralLibraryTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIStretchParameters', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDiceRasterByVectorTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { label: 'ENVITask', kind: 7, sortText: '00', detail: 'Structure' }, + { + label: 'ENVILinearSpectralUnmixingTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIDirectionalKernelTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIVectorRecordsToBoundingBoxTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIMaximumLikelihoodClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPercentThresholdClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVICalibrateRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIVectorRecordsToROITask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIFireFuelClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVInnDiffusePanSharpeningRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIPointCloudMetadata', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVICreateSubrectsFromTileCountTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVInnDiffusePanSharpeningTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIImageIntersectionTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIBinaryGtThresholdRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIRadarBackscatterRaster', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + { + label: 'ENVIAutoChangeThresholdClassificationTask', + kind: 7, + sortText: '00', + detail: 'Structure', + }, + ]; + + // verify results + expect(expectedFound_4).toEqual( + ( + await index.getAutoComplete( + filepath, + await readFile(filepath, 'utf-8'), + position_4 + ) + ).slice(0, 50) + ); }); }); diff --git a/libs/tests/auto-complete/src/lib/methods.1.spec.ts b/libs/tests/auto-complete/src/lib/methods.1.spec.ts index 315a3d7c1..18e2db269 100644 --- a/libs/tests/auto-complete/src/lib/methods.1.spec.ts +++ b/libs/tests/auto-complete/src/lib/methods.1.spec.ts @@ -483,7 +483,7 @@ describe(`[auto generated] Verify types being used for`, () => { const expectedFound_2: CompletionItem[] = [ { label: 'IDLgrSurface::getCTM()', - insertText: 'getCTM', + insertText: 'getCtm', kind: 2, sortText: '03', detail: 'Function Method', diff --git a/libs/tests/auto-complete/src/lib/no-init.spec.ts b/libs/tests/auto-complete/src/lib/no-init.spec.ts index 595336dbd..afb02479b 100644 --- a/libs/tests/auto-complete/src/lib/no-init.spec.ts +++ b/libs/tests/auto-complete/src/lib/no-init.spec.ts @@ -31,7 +31,7 @@ describe(`[auto generated] Exclude init method`, () => { const expectedFound_0: CompletionItem[] = [ { label: 'IDLgrSurface::getCTM()', - insertText: 'getCTM', + insertText: 'getCtm', kind: 2, sortText: '03', detail: 'Function Method', diff --git a/libs/tests/auto-complete/src/lib/no-paren.spec.ts b/libs/tests/auto-complete/src/lib/no-paren.spec.ts index cddf135fb..a33ee45d2 100644 --- a/libs/tests/auto-complete/src/lib/no-paren.spec.ts +++ b/libs/tests/auto-complete/src/lib/no-paren.spec.ts @@ -412,7 +412,7 @@ describe(`[auto generated] Exclude parentheses`, () => { const expectedFound_1: CompletionItem[] = [ { label: 'IDLgrSurface::getCTM()', - insertText: 'getCTM', + insertText: 'getCtm', kind: 2, sortText: '03', detail: 'Function Method', diff --git a/libs/tests/auto-complete/src/lib/no-properties.spec.ts b/libs/tests/auto-complete/src/lib/no-properties.spec.ts index df8c92a3b..1532b8c46 100644 --- a/libs/tests/auto-complete/src/lib/no-properties.spec.ts +++ b/libs/tests/auto-complete/src/lib/no-properties.spec.ts @@ -31,7 +31,7 @@ describe(`[auto generated] Exclude properties`, () => { const expectedFound_0: CompletionItem[] = [ { label: 'IDLgrSurface::getCTM()', - insertText: 'getCTM', + insertText: 'getCtm', kind: 2, sortText: '03', detail: 'Function Method', diff --git a/libs/tests/auto-complete/src/lib/structures-anonymous.spec.ts b/libs/tests/auto-complete/src/lib/structures-anonymous.spec.ts index 4a8918c61..135163509 100644 --- a/libs/tests/auto-complete/src/lib/structures-anonymous.spec.ts +++ b/libs/tests/auto-complete/src/lib/structures-anonymous.spec.ts @@ -1138,7 +1138,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVINNDiffusePanSharpeningRaster', + label: 'ENVInnDiffusePanSharpeningRaster', kind: 7, sortText: '00', detail: 'Structure', @@ -1156,7 +1156,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVINNDiffusePanSharpeningTask', + label: 'ENVInnDiffusePanSharpeningTask', kind: 7, sortText: '00', detail: 'Structure', @@ -1168,7 +1168,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVIBinaryGTThresholdRaster', + label: 'ENVIBinaryGtThresholdRaster', kind: 7, sortText: '00', detail: 'Structure', @@ -1435,7 +1435,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVINNDiffusePanSharpeningRaster', + label: 'ENVInnDiffusePanSharpeningRaster', kind: 7, sortText: '00', detail: 'Structure', @@ -1453,7 +1453,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVINNDiffusePanSharpeningTask', + label: 'ENVInnDiffusePanSharpeningTask', kind: 7, sortText: '00', detail: 'Structure', @@ -1465,7 +1465,7 @@ describe(`[auto generated] Structures`, () => { detail: 'Structure', }, { - label: 'ENVIBinaryGTThresholdRaster', + label: 'ENVIBinaryGtThresholdRaster', kind: 7, sortText: '00', detail: 'Structure', diff --git a/libs/tests/auto-fixing/project.json b/libs/tests/auto-fixing/project.json index 93c1618d4..143ebcf45 100644 --- a/libs/tests/auto-fixing/project.json +++ b/libs/tests/auto-fixing/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/auto-fixing/**/*.ts"] diff --git a/libs/tests/config-resolution/project.json b/libs/tests/config-resolution/project.json index 5fb357174..3e87217b2 100644 --- a/libs/tests/config-resolution/project.json +++ b/libs/tests/config-resolution/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/config-resolution/**/*.ts"] diff --git a/libs/tests/config-resolution/src/lib/bad-file.spec.ts b/libs/tests/config-resolution/src/lib/bad-file.spec.ts index 5bf06ebbb..9c10dba96 100644 --- a/libs/tests/config-resolution/src/lib/bad-file.spec.ts +++ b/libs/tests/config-resolution/src/lib/bad-file.spec.ts @@ -34,15 +34,17 @@ describe(`[auto generated] Parse invalid config files`, () => { quotes: 'single', methods: 'dot', keywords: 'lower', - properties: 'lower', + properties: 'camel', control: 'lower', numbers: 'lower', hex: 'lower', octal: 'lower', binary: 'lower', routines: 'match', + routineMethods: 'camel', systemVariables: 'lower', localVariables: 'match', + structureNames: 'pascal', }, autoFix: true, autoDoc: false, diff --git a/libs/tests/config-resolution/src/lib/resolution.spec.ts b/libs/tests/config-resolution/src/lib/resolution.spec.ts index 26f5d2c93..ff150dfa9 100644 --- a/libs/tests/config-resolution/src/lib/resolution.spec.ts +++ b/libs/tests/config-resolution/src/lib/resolution.spec.ts @@ -46,15 +46,17 @@ describe(`[auto generated] Correctly identify parses and returns config files`, quotes: 'single', methods: 'dot', keywords: 'upper', - properties: 'lower', + properties: 'camel', control: 'lower', numbers: 'lower', hex: 'lower', octal: 'lower', binary: 'lower', routines: 'match', + routineMethods: 'camel', systemVariables: 'lower', localVariables: 'match', + structureNames: 'pascal', }, autoFix: true, autoDoc: false, @@ -74,15 +76,17 @@ describe(`[auto generated] Correctly identify parses and returns config files`, quotes: 'single', methods: 'dot', keywords: 'lower', - properties: 'lower', + properties: 'camel', control: 'upper', numbers: 'lower', hex: 'lower', octal: 'lower', binary: 'lower', routines: 'match', + routineMethods: 'camel', systemVariables: 'lower', localVariables: 'match', + structureNames: 'pascal', }, autoFix: true, autoDoc: false, @@ -102,15 +106,17 @@ describe(`[auto generated] Correctly identify parses and returns config files`, quotes: 'single', methods: 'dot', keywords: 'lower', - properties: 'lower', + properties: 'camel', control: 'lower', numbers: 'lower', hex: 'lower', octal: 'lower', binary: 'lower', routines: 'match', + routineMethods: 'camel', systemVariables: 'lower', localVariables: 'match', + structureNames: 'pascal', }, autoFix: true, autoDoc: false, diff --git a/libs/tests/global-problems/project.json b/libs/tests/global-problems/project.json index e6c65447d..46e11a5c4 100644 --- a/libs/tests/global-problems/project.json +++ b/libs/tests/global-problems/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/global-problems/**/*.ts"] diff --git a/libs/tests/hover-help/project.json b/libs/tests/hover-help/project.json index eb347cc81..f947e9486 100644 --- a/libs/tests/hover-help/project.json +++ b/libs/tests/hover-help/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/hover-help/**/*.ts"] diff --git a/libs/tests/local-global-scope-compile/project.json b/libs/tests/local-global-scope-compile/project.json index 0ed9c4328..7a9297a8d 100644 --- a/libs/tests/local-global-scope-compile/project.json +++ b/libs/tests/local-global-scope-compile/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/local-global-scope-compile/**/*.ts"] diff --git a/libs/tests/local-global-scope-compile/src/lib/docs-below-1.spec.ts b/libs/tests/local-global-scope-compile/src/lib/docs-below-1.spec.ts new file mode 100644 index 000000000..661aff842 --- /dev/null +++ b/libs/tests/local-global-scope-compile/src/lib/docs-below-1.spec.ts @@ -0,0 +1,419 @@ +import { CancellationToken } from '@idl/cancellation-tokens'; +import { GlobalTokens, ICompileOptions } from '@idl/data-types/core'; +import { LogManager } from '@idl/logger'; +import { IDL_INDEX_OPTIONS, IDLIndex } from '@idl/parsing/index'; +import { ILocalTokens } from '@idl/parsing/syntax-tree'; + +IDL_INDEX_OPTIONS.IS_TEST = true; + +describe(`[auto generated] Extract docs below routines`, () => { + it(`[auto generated] for procedure`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;- `, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected local variables + const expectedVars: ILocalTokens = { + func: {}, + pro: { + parse_docs_below: { + input_raster: { + type: 'v', + name: 'input_raster', + pos: [0, 37, 12], + meta: { + display: 'input_raster', + isDefined: true, + usage: [[0, 37, 12]], + docs: 'Thing 1', + source: 'user', + type: [ + { + name: 'ENVIRaster', + display: 'ENVIRaster', + args: [], + meta: {}, + }, + ], + }, + }, + output_raster_uri: { + type: 'v', + name: 'output_raster_uri', + pos: [0, 71, 17], + meta: { + display: 'output_raster_uri', + isDefined: true, + usage: [[0, 71, 17]], + docs: 'Thing 2', + source: 'user', + type: [{ name: 'String', display: 'String', args: [], meta: {} }], + }, + }, + third: { + type: 'v', + name: 'third', + pos: [0, 99, 5], + meta: { + display: 'third', + isDefined: true, + usage: [[0, 99, 5]], + docs: '', + source: 'user', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + }, + }, + e: { + type: 'v', + name: 'e', + pos: [14, 0, 1], + meta: { + display: 'e', + isDefined: true, + usage: [ + [14, 0, 1], + [15, 4, 1], + ], + docs: '', + source: 'user', + type: [{ name: 'ENVI', display: 'ENVI', args: [], meta: {} }], + }, + }, + }, + }, + main: {}, + }; + + // verify results + expect(tokenized.local).toEqual(expectedVars); + + // define expected global variables + const expectedGlobal: GlobalTokens = [ + { + type: 'p', + name: 'parse_docs_below', + pos: [0, 4, 16], + meta: { + source: 'user', + args: {}, + docs: '\n```idl\nparse_docs_below, $\n [ input_raster = ENVIRaster ], $\n [ output_raster_uri = String ], $\n, $\n [ third2 = any ]\n```\n\n\n\n#### Keywords\n\n- **input_raster**: in, optional, ENVIRaster\n\n Thing 1\n\n- **output_raster_uri**: in, optional, String\n\n Thing 2\n\n- **third2**: bidirectional, optional, any\n\n \n\n', + docsLookup: { default: '' }, + display: 'parse_docs_below', + kws: { + input_raster: { + docs: 'Thing 1', + direction: 'in', + source: 'internal', + type: [ + { + name: 'ENVIRaster', + display: 'ENVIRaster', + args: [], + meta: {}, + }, + ], + private: false, + req: false, + display: 'input_raster', + code: true, + pos: [0, 22, 12], + }, + output_raster_uri: { + docs: 'Thing 2', + direction: 'in', + source: 'internal', + type: [{ name: 'String', display: 'String', args: [], meta: {} }], + private: false, + req: false, + display: 'output_raster_uri', + code: true, + pos: [0, 51, 17], + }, + third: { + docs: 'Thing 3', + direction: 'bidirectional', + source: 'internal', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + private: false, + req: false, + display: 'third', + code: false, + pos: [7, 0, 39], + }, + third2: { + docs: '', + private: false, + source: 'internal', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + direction: 'bidirectional', + req: false, + display: 'third2', + code: true, + pos: [0, 90, 6], + }, + }, + private: false, + struct: [], + }, + file: 'not-real', + }, + ]; + + // verify results + expect(tokenized.global).toEqual(expectedGlobal); + + // define expected compile options + const expectedCompile: ICompileOptions = { + func: {}, + pro: { parse_docs_below: ['idl2'] }, + main: [], + }; + + // verify results + expect(tokenized.compile).toEqual(expectedCompile); + }); + + it(`[auto generated] for function`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function parse_docs_below, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;- `, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `return, 1`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected local variables + const expectedVars: ILocalTokens = { + func: { + parse_docs_below: { + input_raster: { + type: 'v', + name: 'input_raster', + pos: [0, 42, 12], + meta: { + display: 'input_raster', + isDefined: true, + usage: [[0, 42, 12]], + docs: 'Thing 1', + source: 'user', + type: [ + { + name: 'ENVIRaster', + display: 'ENVIRaster', + args: [], + meta: {}, + }, + ], + }, + }, + output_raster_uri: { + type: 'v', + name: 'output_raster_uri', + pos: [0, 76, 17], + meta: { + display: 'output_raster_uri', + isDefined: true, + usage: [[0, 76, 17]], + docs: 'Thing 2', + source: 'user', + type: [{ name: 'String', display: 'String', args: [], meta: {} }], + }, + }, + third: { + type: 'v', + name: 'third', + pos: [0, 104, 5], + meta: { + display: 'third', + isDefined: true, + usage: [[0, 104, 5]], + docs: '', + source: 'user', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + }, + }, + e: { + type: 'v', + name: 'e', + pos: [14, 0, 1], + meta: { + display: 'e', + isDefined: true, + usage: [ + [14, 0, 1], + [15, 4, 1], + ], + docs: '', + source: 'user', + type: [{ name: 'ENVI', display: 'ENVI', args: [], meta: {} }], + }, + }, + }, + }, + pro: {}, + main: {}, + }; + + // verify results + expect(tokenized.local).toEqual(expectedVars); + + // define expected global variables + const expectedGlobal: GlobalTokens = [ + { + type: 'f', + name: 'parse_docs_below', + pos: [0, 9, 16], + meta: { + source: 'user', + args: {}, + docs: '\n```idl\nresult = parse_docs_below( [ input_raster = ENVIRaster ], $\n [ output_raster_uri = String ], $\n, $\n [ third2 = any ])\n```\n\n\n\n#### Keywords\n\n- **input_raster**: in, optional, ENVIRaster\n\n Thing 1\n\n- **output_raster_uri**: in, optional, String\n\n Thing 2\n\n- **third2**: bidirectional, optional, any\n\n \n\n', + docsLookup: { default: '' }, + display: 'parse_docs_below', + kws: { + input_raster: { + docs: 'Thing 1', + direction: 'in', + source: 'internal', + type: [ + { + name: 'ENVIRaster', + display: 'ENVIRaster', + args: [], + meta: {}, + }, + ], + private: false, + req: false, + display: 'input_raster', + code: true, + pos: [0, 27, 12], + }, + output_raster_uri: { + docs: 'Thing 2', + direction: 'in', + source: 'internal', + type: [{ name: 'String', display: 'String', args: [], meta: {} }], + private: false, + req: false, + display: 'output_raster_uri', + code: true, + pos: [0, 56, 17], + }, + third: { + docs: 'Thing 3', + direction: 'bidirectional', + source: 'internal', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + private: false, + req: false, + display: 'third', + code: false, + pos: [7, 0, 39], + }, + third2: { + docs: '', + private: false, + source: 'internal', + type: [{ name: 'any', display: 'any', args: [], meta: {} }], + direction: 'bidirectional', + req: false, + display: 'third2', + code: true, + pos: [0, 95, 6], + }, + }, + private: false, + returns: [{ name: 'any', display: 'any', args: [], meta: {} }], + struct: [], + }, + file: 'not-real', + }, + ]; + + // verify results + expect(tokenized.global).toEqual(expectedGlobal); + + // define expected compile options + const expectedCompile: ICompileOptions = { + func: { parse_docs_below: ['idl2'] }, + pro: {}, + main: [], + }; + + // verify results + expect(tokenized.compile).toEqual(expectedCompile); + }); +}); diff --git a/libs/tests/outline/project.json b/libs/tests/outline/project.json index 8ca0e7b2c..f54f5d72b 100644 --- a/libs/tests/outline/project.json +++ b/libs/tests/outline/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/outline/**/*.ts"] diff --git a/libs/tests/semantic-tokens/project.json b/libs/tests/semantic-tokens/project.json index 13763b69c..9837445e6 100644 --- a/libs/tests/semantic-tokens/project.json +++ b/libs/tests/semantic-tokens/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/semantic-tokens/**/*.ts"] diff --git a/libs/tests/syntax-post-processors/project.json b/libs/tests/syntax-post-processors/project.json index 572a63af8..f63598aa8 100644 --- a/libs/tests/syntax-post-processors/project.json +++ b/libs/tests/syntax-post-processors/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/syntax-post-processors/**/*.ts"] diff --git a/libs/tests/syntax-post-processors/src/lib/main.spec.ts b/libs/tests/syntax-post-processors/src/lib/main.spec.ts index 94520f93c..ef14bdb1c 100644 --- a/libs/tests/syntax-post-processors/src/lib/main.spec.ts +++ b/libs/tests/syntax-post-processors/src/lib/main.spec.ts @@ -943,7 +943,7 @@ describe(`[auto generated] Correctly maps main level tokens`, () => { ).toEqual(expectedProblems); }); - it(`[auto generated] ignore only comments`, () => { + it(`[auto generated] ignore only comments 1`, () => { // test code to extract tokens from const code = [ `function myfunc`, @@ -951,7 +951,6 @@ describe(`[auto generated] Correctly maps main level tokens`, () => { ` return,1`, `end`, ``, - `compile_opt idl2`, `; main level`, `; another comment`, ]; @@ -1036,69 +1035,162 @@ describe(`[auto generated] Correctly maps main level tokens`, () => { ], }, { - type: '0', - name: 54, - pos: [5, 0, 11], + type: '1', + name: 15, + pos: [5, 0, 12], + match: ['; main level', 'main level'], idx: 1, - match: [], scope: [], - parseProblems: [33], + parseProblems: [], + }, + { + type: '1', + name: 15, + pos: [6, 0, 17], + match: ['; another comment', 'another comment'], + idx: 2, + scope: [], + parseProblems: [], + }, + ]; + + // verify results + expect(tokenized.tree).toEqual(expectedTree); + + // define expected problems + const expectedProblems: SyntaxProblems = []; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expectedProblems); + }); + + it(`[auto generated] ignore only comments 2`, () => { + // test code to extract tokens from + const code = [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ]; + + // extract tokens + const tokenized = Parser(code, new CancellationToken()); + + // define expected syntax tree + const expectedTree: SyntaxTree = [ + { + type: '0', + name: 69, + pos: [0, 0, 9], + match: ['function ', 'function'], + idx: 0, + scope: [], + parseProblems: [], + end: { pos: [3, 0, 3], match: ['end'] }, kids: [ + { + type: '0', + name: 71, + pos: [0, 9, 6], + match: ['myfunc'], + idx: 0, + scope: [69], + parseProblems: [], + end: { pos: [0, 15, 0], match: [''] }, + kids: [], + }, { type: '0', name: 20, - pos: [5, 0, 11], + pos: [1, 2, 11], match: ['compile_opt'], - idx: 0, - scope: [54], + idx: 1, + scope: [69], parseProblems: [], - end: { pos: [5, 16, 0], match: [''] }, + end: { pos: [1, 18, 0], match: [''] }, kids: [ { type: '1', name: 25, - pos: [5, 12, 4], + pos: [1, 14, 4], match: ['idl2'], idx: 0, - scope: [54, 20], + scope: [69, 20], parseProblems: [], }, ], }, { - type: '1', - name: 15, - pos: [6, 0, 12], - match: ['; main level', 'main level'], - idx: 1, - scope: [54], - parseProblems: [], - }, - { - type: '1', - name: 15, - pos: [7, 0, 17], - match: ['; another comment', 'another comment'], + type: '0', + name: 11, + pos: [2, 2, 6], + match: ['return'], idx: 2, - scope: [54], + scope: [69], parseProblems: [], + end: { pos: [2, 10, 0], match: [''] }, + kids: [ + { + type: '1', + name: 14, + pos: [2, 8, 1], + match: [','], + idx: 0, + scope: [69, 11], + parseProblems: [], + }, + { + type: '1', + name: 56, + pos: [2, 9, 1], + match: ['1'], + idx: 1, + scope: [69, 11], + parseProblems: [], + }, + ], }, ], }, + { + type: '1', + name: 15, + pos: [3, 4, 13], + match: ['; -----------', '-----------'], + idx: 1, + scope: [], + parseProblems: [], + }, + { + type: '1', + name: 15, + pos: [5, 0, 12], + match: ['; main level', 'main level'], + idx: 2, + scope: [], + parseProblems: [], + }, + { + type: '1', + name: 15, + pos: [6, 0, 17], + match: ['; another comment', 'another comment'], + idx: 3, + scope: [], + parseProblems: [], + }, ]; // verify results expect(tokenized.tree).toEqual(expectedTree); // define expected problems - const expectedProblems: SyntaxProblems = [ - { - code: 33, - info: 'Main level program is missing an "end" statement', - start: [7, 0, 1.7976931348623157e308], - end: [7, 0, 1.7976931348623157e308], - }, - ]; + const expectedProblems: SyntaxProblems = []; // verify results expect( diff --git a/libs/tests/syntax-validators/project.json b/libs/tests/syntax-validators/project.json index bad87104c..b6f268ba1 100644 --- a/libs/tests/syntax-validators/project.json +++ b/libs/tests/syntax-validators/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/syntax-validators/**/*.ts"] diff --git a/libs/tests/syntax-validators/src/lib/code.33.unclosed-main.spec.ts b/libs/tests/syntax-validators/src/lib/code.33.unclosed-main.spec.ts index ad5509961..fdc102d26 100644 --- a/libs/tests/syntax-validators/src/lib/code.33.unclosed-main.spec.ts +++ b/libs/tests/syntax-validators/src/lib/code.33.unclosed-main.spec.ts @@ -185,4 +185,43 @@ describe(`[auto generated] Detects missing end to main level program`, () => { tokenized.parseProblems.concat(tokenized.postProcessProblems) ).toEqual(expected); }); + + it(`[auto generated] not problem`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = []; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); }); diff --git a/libs/tests/syntax-validators/src/lib/code.34.empty-main.spec.ts b/libs/tests/syntax-validators/src/lib/code.34.empty-main.spec.ts index be90c8f17..2ec6b647e 100644 --- a/libs/tests/syntax-validators/src/lib/code.34.empty-main.spec.ts +++ b/libs/tests/syntax-validators/src/lib/code.34.empty-main.spec.ts @@ -125,4 +125,43 @@ describe(`[auto generated] Detects empty main level programs`, () => { tokenized.parseProblems.concat(tokenized.postProcessProblems) ).toEqual(expected); }); + + it(`[auto generated] not problem`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = []; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); }); diff --git a/libs/tests/syntax-validators/src/lib/code.38.no-comp-opt.spec.ts b/libs/tests/syntax-validators/src/lib/code.38.no-comp-opt.spec.ts index 0808cfc74..184389e43 100644 --- a/libs/tests/syntax-validators/src/lib/code.38.no-comp-opt.spec.ts +++ b/libs/tests/syntax-validators/src/lib/code.38.no-comp-opt.spec.ts @@ -225,4 +225,43 @@ describe(`[auto generated] Detects missing compile options`, () => { tokenized.parseProblems.concat(tokenized.postProcessProblems) ).toEqual(expected); }); + + it(`[auto generated] ok main`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function myfunc`, + ` compile_opt idl2`, + ` return,1`, + `end ; -----------`, + ``, + `; main level`, + `; another comment`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = []; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); }); diff --git a/libs/tests/syntax-validators/src/lib/docs-problems-when-docs-below.spec.ts b/libs/tests/syntax-validators/src/lib/docs-problems-when-docs-below.spec.ts new file mode 100644 index 000000000..545ee4e8b --- /dev/null +++ b/libs/tests/syntax-validators/src/lib/docs-problems-when-docs-below.spec.ts @@ -0,0 +1,264 @@ +import { CancellationToken } from '@idl/cancellation-tokens'; +import { LogManager } from '@idl/logger'; +import { IDL_INDEX_OPTIONS, IDLIndex } from '@idl/parsing/index'; +import { SyntaxProblems } from '@idl/parsing/problem-codes'; + +IDL_INDEX_OPTIONS.IS_TEST = true; + +describe(`[auto generated] Properly reports problems for docs`, () => { + it(`[auto generated] when blocks are inside procedures`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `pro auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = [ + { + code: 63, + info: 'Documented argument, keyword, or property does not exist: "third"', + start: [7, 0, 39], + end: [7, 0, 39], + }, + { + code: 64, + info: 'Parameter is missing from documentation: "third2"', + start: [0, 97, 6], + end: [0, 97, 6], + }, + { + code: 104, + info: 'Unused variable "input_raster"', + start: [0, 44, 12], + end: [0, 44, 12], + }, + { + code: 104, + info: 'Unused variable "output_raster_uri"', + start: [0, 78, 17], + end: [0, 78, 17], + }, + { + code: 104, + info: 'Unused variable "third"', + start: [0, 106, 5], + end: [0, 106, 5], + }, + ]; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); + + it(`[auto generated] when blocks are inside functions`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third2 = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `rturn, 1`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = [ + { + code: 63, + info: 'Documented argument, keyword, or property does not exist: "third"', + start: [7, 0, 39], + end: [7, 0, 39], + }, + { + code: 64, + info: 'Parameter is missing from documentation: "third2"', + start: [0, 102, 6], + end: [0, 102, 6], + }, + { + code: 52, + info: 'Expected a documentation tag for ":Returns:" since this is a function or function method', + start: [1, 0, 2], + end: [10, 0, 2], + }, + { + code: 104, + info: 'Unused variable "input_raster"', + start: [0, 49, 12], + end: [0, 49, 12], + }, + { + code: 104, + info: 'Unused variable "output_raster_uri"', + start: [0, 83, 17], + end: [0, 83, 17], + }, + { + code: 104, + info: 'Unused variable "third"', + start: [0, 111, 5], + end: [0, 111, 5], + }, + ]; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); + + it(`[auto generated] when blocks are inside functions`, async () => { + // create index + const index = new IDLIndex( + new LogManager({ + alert: () => { + // do nothing + }, + }), + 0 + ); + + // test code to extract tokens from + const code = [ + `;+`, + `; No problems for me!!! Im care free!!!`, + `;-`, + ``, + ``, + `function auto_doc_dont_add_above, input_raster = input_raster, output_raster_uri = output_raster_uri, third = third`, + `;+`, + `; :Keywords:`, + `; input_raster: in, optional, ENVIRaster`, + `; Thing 1`, + `; output_raster_uri: in, optional, String`, + `; Thing 2`, + `; third: bidirectional, optional, any`, + `; Thing 3`, + `;`, + `;-`, + `compile_opt idl2`, + ``, + `; get the current session of ENVI`, + `e = envi(/current)`, + `if (e eq !null) then begin`, + ` message, 'ENVI has not started yet, required!'`, + `endif`, + `idltasktest, input_raster = 5`, + `rturn, 1`, + `end`, + ]; + + // extract tokens + const tokenized = await index.getParsedProCode( + 'not-real', + code, + new CancellationToken(), + { postProcess: true } + ); + + // define expected tokens + const expected: SyntaxProblems = [ + { + code: 52, + info: 'Expected a documentation tag for ":Returns:" since this is a function or function method', + start: [6, 0, 2], + end: [15, 0, 2], + }, + { + code: 104, + info: 'Unused variable "input_raster"', + start: [5, 49, 12], + end: [5, 49, 12], + }, + { + code: 104, + info: 'Unused variable "output_raster_uri"', + start: [5, 83, 17], + end: [5, 83, 17], + }, + { + code: 104, + info: 'Unused variable "third"', + start: [5, 110, 5], + end: [5, 110, 5], + }, + ]; + + // verify results + expect( + tokenized.parseProblems.concat(tokenized.postProcessProblems) + ).toEqual(expected); + }); +}); diff --git a/libs/tests/task-assembler/project.json b/libs/tests/task-assembler/project.json index cd7d93279..52290c73f 100644 --- a/libs/tests/task-assembler/project.json +++ b/libs/tests/task-assembler/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/task-assembler/**/*.ts"] diff --git a/libs/tests/task-assembler/src/lib/envitask-legacy.keywords1.spec.ts b/libs/tests/task-assembler/src/lib/envitask-legacy.keywords1.spec.ts index c4ad30bcc..1def76e2a 100644 --- a/libs/tests/task-assembler/src/lib/envitask-legacy.keywords1.spec.ts +++ b/libs/tests/task-assembler/src/lib/envitask-legacy.keywords1.spec.ts @@ -69,7 +69,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "routine": "mlEFCReportToROI",`, ` "parameters": [`, ` {`, - ` "name": "input_raster",`, + ` "name": "INPUT_RASTER",`, ` "displayName": "Training Data Source Raster",`, ` "keyword": "INPUT_RASTER",`, ` "description": "Specify the original raster that was used to find training data.",`, @@ -78,7 +78,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "dataType": "ENVIRASTER"`, ` },`, ` {`, - ` "name": "input_ecf_report_uri",`, + ` "name": "INPUT_ECF_REPORT_URI",`, ` "displayName": "EFC Report File",`, ` "keyword": "INPUT_ECF_REPORT_URI",`, ` "description": "Specify the ENVI Feature Counting report file (must have a .txt extension).",`, @@ -87,7 +87,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "dataType": "ENVIURI"`, ` },`, ` {`, - ` "name": "output_roi",`, + ` "name": "OUTPUT_ROI",`, ` "displayName": "Output ROI",`, ` "keyword": "OUTPUT_ROI",`, ` "description": "The output ROI file that will contain the pixel locations of our training data.",`, @@ -273,7 +273,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "routine": "mlEFCReportToROI",`, ` "parameters": [`, ` {`, - ` "name": "input_raster",`, + ` "name": "INPUT_RASTER",`, ` "displayName": "Training Data Source Raster",`, ` "keyword": "input_RASTER",`, ` "description": "Specify the original raster that was used to find training data.",`, @@ -282,7 +282,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "dataType": "ENVIRASTER"`, ` },`, ` {`, - ` "name": "input_efc_report_file",`, + ` "name": "INPUT_EFC_REPORT_FILE",`, ` "displayName": "EFC Report File",`, ` "keyword": "INPUT_EFC_REPORT_FILE",`, ` "description": "Specify the ENVI Feature Counting report file (must have a .txt extension).",`, @@ -291,7 +291,7 @@ describe(`[auto generated] Verify keyword formatting for ENVI Task Legacy`, () = ` "dataType": "ENVIURI"`, ` },`, ` {`, - ` "name": "output_roi",`, + ` "name": "OUTPUT_ROI",`, ` "displayName": "Output ROI",`, ` "keyword": "OUTPUT_ROI",`, ` "description": "The output ROI file that will contain the pixel locations of our training data.",`, diff --git a/libs/tests/task-assembler/src/lib/envitask-legacy.parameters1.spec.ts b/libs/tests/task-assembler/src/lib/envitask-legacy.parameters1.spec.ts index 8accf693c..dd03777e7 100644 --- a/libs/tests/task-assembler/src/lib/envitask-legacy.parameters1.spec.ts +++ b/libs/tests/task-assembler/src/lib/envitask-legacy.parameters1.spec.ts @@ -66,7 +66,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Task Legacy`, () ` "routine": "mlEFCReportToROI",`, ` "parameters": [`, ` {`, - ` "name": "INPUT_RASTER",`, + ` "name": "input_raster",`, ` "displayName": "Training Data Source Raster",`, ` "description": "Specify the original raster that was used to find training data.",`, ` "direction": "input",`, @@ -74,7 +74,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Task Legacy`, () ` "dataType": "ENVIRASTER"`, ` },`, ` {`, - ` "name": "INPUT_ECF_REPORT_URI",`, + ` "name": "input_ecf_report_uri",`, ` "displayName": "EFC Report File",`, ` "description": "Specify the ENVI Feature Counting report file (must have a .txt extension).",`, ` "direction": "input",`, @@ -82,7 +82,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Task Legacy`, () ` "dataType": "ENVIURI"`, ` },`, ` {`, - ` "name": "OUTPUT_ROI",`, + ` "name": "output_roi",`, ` "displayName": "Output ROI",`, ` "description": "The output ROI file that will contain the pixel locations of our training data.",`, ` "direction": "output",`, @@ -258,7 +258,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Task Legacy`, () ` "routine": "mlEFCReportToROI",`, ` "parameters": [`, ` {`, - ` "name": "INPUT_RASTER",`, + ` "name": "input_raster",`, ` "displayName": "Training Data Source Raster",`, ` "description": "Specify the original raster that was used to find training data.",`, ` "direction": "input",`, @@ -266,7 +266,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Task Legacy`, () ` "dataType": "ENVIRASTER"`, ` },`, ` {`, - ` "name": "INPUT_EFC_REPORT_FILE",`, + ` "name": "input_efc_report_file",`, ` "displayName": "EFC Report File",`, ` "description": "Specify the ENVI Feature Counting report file (must have a .txt extension).",`, ` "direction": "input",`, diff --git a/libs/tests/task-assembler/src/lib/envitask.keywords1.spec.ts b/libs/tests/task-assembler/src/lib/envitask.keywords1.spec.ts index a34ac44fd..efd691473 100644 --- a/libs/tests/task-assembler/src/lib/envitask.keywords1.spec.ts +++ b/libs/tests/task-assembler/src/lib/envitask.keywords1.spec.ts @@ -74,7 +74,7 @@ describe(`[auto generated] Verify keyword formatting for ENVITasks`, () => { ` "routine": "atAnomalyDetection",`, ` "parameters": [`, ` {`, - ` "name": "input_raster",`, + ` "name": "INPUT_RASTER",`, ` "display_name": "Input Raster",`, ` "keyword": "INPUT_RASTER",`, ` "description": "The raster to run anomaly detection on.",`, @@ -84,7 +84,7 @@ describe(`[auto generated] Verify keyword formatting for ENVITasks`, () => { ` "type": "ENVIRaster"`, ` },`, ` {`, - ` "name": "output_raster_uri",`, + ` "name": "OUTPUT_RASTER_URI",`, ` "display_name": "Output Raster URI",`, ` "keyword": "OUTPUT_RASTER_URI",`, ` "description": "Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.",`, @@ -95,7 +95,7 @@ describe(`[auto generated] Verify keyword formatting for ENVITasks`, () => { ` "auto_extension": ".dat"`, ` },`, ` {`, - ` "name": "output_raster",`, + ` "name": "OUTPUT_RASTER",`, ` "display_name": "Output Raster",`, ` "keyword": "OUTPUT_RASTER",`, ` "description": "This is a reference to an ENVIRaster object.",`, diff --git a/libs/tests/task-assembler/src/lib/envitask.parameters1.spec.ts b/libs/tests/task-assembler/src/lib/envitask.parameters1.spec.ts index e630a897f..14ab88f31 100644 --- a/libs/tests/task-assembler/src/lib/envitask.parameters1.spec.ts +++ b/libs/tests/task-assembler/src/lib/envitask.parameters1.spec.ts @@ -71,7 +71,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Tasks`, () => { ` "routine": "atAnomalyDetection",`, ` "parameters": [`, ` {`, - ` "name": "INPUT_RASTER",`, + ` "name": "input_raster",`, ` "display_name": "Input Raster",`, ` "description": "The raster to run anomaly detection on.",`, ` "direction": "input",`, @@ -80,7 +80,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Tasks`, () => { ` "type": "ENVIRaster"`, ` },`, ` {`, - ` "name": "OUTPUT_RASTER_URI",`, + ` "name": "output_raster_uri",`, ` "display_name": "Output Raster URI",`, ` "description": "Specify a string with the fully-qualified path and filename for OUTPUT_RASTER.",`, ` "direction": "input",`, @@ -90,7 +90,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Tasks`, () => { ` "auto_extension": ".dat"`, ` },`, ` {`, - ` "name": "OUTPUT_RASTER",`, + ` "name": "output_raster",`, ` "display_name": "Output Raster",`, ` "description": "This is a reference to an ENVIRaster object.",`, ` "direction": "output",`, @@ -302,7 +302,7 @@ describe(`[auto generated] Verify parameter formatting for ENVI Tasks`, () => { ` "auto_extension": ".dat"`, ` },`, ` {`, - ` "name": "OUTPUT_RASTER",`, + ` "name": "output_raster",`, ` "display_name": "Output Raster",`, ` "description": "This is a reference to an ENVIRaster object.",`, ` "direction": "output",`, diff --git a/libs/tests/task-assembler/src/lib/idltask.keywords1.spec.ts b/libs/tests/task-assembler/src/lib/idltask.keywords1.spec.ts index e374e3610..c005fcd96 100644 --- a/libs/tests/task-assembler/src/lib/idltask.keywords1.spec.ts +++ b/libs/tests/task-assembler/src/lib/idltask.keywords1.spec.ts @@ -62,7 +62,7 @@ describe(`[auto generated] Verify keyword formatting for IDL Tasks`, () => { ` "routine": "download_S3_URL",`, ` "parameters": [`, ` {`, - ` "name": "s3_url",`, + ` "name": "S3_URL",`, ` "display_name": "S3 URL",`, ` "keyword": "S3_URL",`, ` "description": "The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.",`, @@ -71,7 +71,7 @@ describe(`[auto generated] Verify keyword formatting for IDL Tasks`, () => { ` "type": "String"`, ` },`, ` {`, - ` "name": "local_file",`, + ` "name": "LOCAL_FILE",`, ` "display_name": "Local Filename",`, ` "keyword": "LOCAL_FILE",`, ` "description": "The local file in which to download the S3 resource.",`, @@ -234,7 +234,7 @@ describe(`[auto generated] Verify keyword formatting for IDL Tasks`, () => { ` "routine": "download_S3_URL",`, ` "parameters": [`, ` {`, - ` "name": "s3_url",`, + ` "name": "S3_URL",`, ` "display_name": "S3 URL",`, ` "keyword": "S3_url",`, ` "description": "The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.",`, diff --git a/libs/tests/task-assembler/src/lib/idltask.parameters1.spec.ts b/libs/tests/task-assembler/src/lib/idltask.parameters1.spec.ts index 8762bb432..7c7788b80 100644 --- a/libs/tests/task-assembler/src/lib/idltask.parameters1.spec.ts +++ b/libs/tests/task-assembler/src/lib/idltask.parameters1.spec.ts @@ -60,7 +60,7 @@ describe(`[auto generated] Verify parameter formatting for IDL Tasks`, () => { ` "routine": "download_S3_URL",`, ` "parameters": [`, ` {`, - ` "name": "S3_URL",`, + ` "name": "s3_url",`, ` "display_name": "S3 URL",`, ` "description": "The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.",`, ` "direction": "input",`, @@ -68,7 +68,7 @@ describe(`[auto generated] Verify parameter formatting for IDL Tasks`, () => { ` "type": "String"`, ` },`, ` {`, - ` "name": "LOCAL_FILE",`, + ` "name": "local_file",`, ` "display_name": "Local Filename",`, ` "description": "The local file in which to download the S3 resource.",`, ` "direction": "input",`, @@ -224,7 +224,7 @@ describe(`[auto generated] Verify parameter formatting for IDL Tasks`, () => { ` "routine": "download_S3_URL",`, ` "parameters": [`, ` {`, - ` "name": "S3_URL",`, + ` "name": "s3_url",`, ` "display_name": "S3 URL",`, ` "description": "The S3 URL to download. This must use the HTTP[S] scheme, not S3 scheme.",`, ` "direction": "input",`, diff --git a/libs/tests/task-generation/project.json b/libs/tests/task-generation/project.json index c3df09ea8..b53a9e85b 100644 --- a/libs/tests/task-generation/project.json +++ b/libs/tests/task-generation/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/task-generation/**/*.ts"] diff --git a/libs/tests/task-generation/src/lib/envi.basic.spec.ts b/libs/tests/task-generation/src/lib/envi.basic.spec.ts index 9f90fdbd6..a152b415f 100644 --- a/libs/tests/task-generation/src/lib/envi.basic.spec.ts +++ b/libs/tests/task-generation/src/lib/envi.basic.spec.ts @@ -57,14 +57,14 @@ describe(`[auto generated] Make basic ENVI task`, () => { const expectedTask = { schema: 'envitask_3.3', name: 'envitasktest', - display_name: 'envitasktest', + display_name: 'Envitasktest', base_class: 'ENVITaskFromProcedure', routine: 'envitasktest', description: '', parameters: [ { name: 'input_array', - display_name: 'input_array', + display_name: 'Input Array', description: 'Placeholder docs for argument, keyword, or property', type: 'ENVIRasterArray', required: true, @@ -73,7 +73,7 @@ describe(`[auto generated] Make basic ENVI task`, () => { }, { name: 'input_raster', - display_name: 'input_raster', + display_name: 'Input Raster', description: 'Placeholder docs for argument, keyword, or property', type: 'ENVIRaster', required: true, @@ -81,7 +81,7 @@ describe(`[auto generated] Make basic ENVI task`, () => { }, { name: 'output_raster_uri', - display_name: 'output_raster_uri', + display_name: 'Output Raster Uri', description: 'Placeholder docs for argument, keyword, or property', type: 'ENVIURI', required: true, @@ -99,7 +99,7 @@ describe(`[auto generated] Make basic ENVI task`, () => { }, { name: 'output_vector_uri', - display_name: 'output_vector_uri', + display_name: 'Output Vector Uri', description: 'Placeholder docs for argument, keyword, or property', type: 'ENVIURI', required: true, diff --git a/libs/tests/task-generation/src/lib/idl.basic.spec.ts b/libs/tests/task-generation/src/lib/idl.basic.spec.ts index 76fd02919..5a993c7c1 100644 --- a/libs/tests/task-generation/src/lib/idl.basic.spec.ts +++ b/libs/tests/task-generation/src/lib/idl.basic.spec.ts @@ -57,14 +57,14 @@ describe(`[auto generated] Make basic IDL task`, () => { const expectedTask = { schema: 'idltask_1.2', name: 'idltasktest', - display_name: 'idltasktest', + display_name: 'Idltasktest', base_class: 'IDLTaskFromProcedure', routine: 'idltasktest', description: '', parameters: [ { name: 'input_array', - display_name: 'input_array', + display_name: 'Input Array', description: 'Placeholder docs for argument, keyword, or property', type: 'StringArray', required: true, @@ -73,7 +73,7 @@ describe(`[auto generated] Make basic IDL task`, () => { }, { name: 'input_raster', - display_name: 'input_raster', + display_name: 'Input Raster', description: 'Placeholder docs for argument, keyword, or property', type: 'String', required: true, @@ -81,7 +81,7 @@ describe(`[auto generated] Make basic IDL task`, () => { }, { name: 'output_raster_uri', - display_name: 'output_raster_uri', + display_name: 'Output Raster Uri', description: 'Placeholder docs for argument, keyword, or property', type: 'String', required: true, diff --git a/libs/tests/task-parsing/project.json b/libs/tests/task-parsing/project.json index 3e77a9a86..7223c9923 100644 --- a/libs/tests/task-parsing/project.json +++ b/libs/tests/task-parsing/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/task-parsing/**/*.ts"] diff --git a/libs/tests/textmate-tokenizer/project.json b/libs/tests/textmate-tokenizer/project.json index 63b39786f..479a3319b 100644 --- a/libs/tests/textmate-tokenizer/project.json +++ b/libs/tests/textmate-tokenizer/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/textmate-tokenizer/**/*.ts"] diff --git a/libs/tests/token-at-cursor/project.json b/libs/tests/token-at-cursor/project.json index 5950c9dee..566ac55ef 100644 --- a/libs/tests/token-at-cursor/project.json +++ b/libs/tests/token-at-cursor/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/token-at-cursor/**/*.ts"] diff --git a/libs/tests/token-definition/project.json b/libs/tests/token-definition/project.json index 713b2f6ff..6a9b83736 100644 --- a/libs/tests/token-definition/project.json +++ b/libs/tests/token-definition/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/token-definition/**/*.ts"] diff --git a/libs/tests/tokenizer/project.json b/libs/tests/tokenizer/project.json index 00f0d0872..99003ba68 100644 --- a/libs/tests/tokenizer/project.json +++ b/libs/tests/tokenizer/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/tests/tokenizer/**/*.ts"] diff --git a/libs/translation/project.json b/libs/translation/project.json index 1dc528449..65c1fac90 100644 --- a/libs/translation/project.json +++ b/libs/translation/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/translation/**/*.ts"] diff --git a/libs/translation/src/lib/languages/en/en.ts b/libs/translation/src/lib/languages/en/en.ts index 3805c7222..b271244d5 100644 --- a/libs/translation/src/lib/languages/en/en.ts +++ b/libs/translation/src/lib/languages/en/en.ts @@ -49,8 +49,9 @@ export const EN: ITranslation = { generateTask: 'IDL: Generate ENVI or IDL Task', }, config: { - specifyIDLDirectory: 'IDL: Specify IDL Directory (User)', - specifyIDLDirectoryWorkspace: 'IDL: Specify IDL Directory (Workspace)', + specifyIDLDirectory: 'IDL: Specify IDL Directory (User-level)', + specifyIDLDirectoryWorkspace: + 'IDL: Specify IDL Directory (Workspace-level)', }, debug: { startIDL: 'IDL: Start a Session of IDL', @@ -68,6 +69,10 @@ export const EN: ITranslation = { stopIDL: 'Stop IDL', helpAsNotebook: 'IDL: Convert Help to Notebook', openIDLExample: 'IDL: Open IDL Example Notebook', + openENVIExample: 'IDL: Open ENVI Example Notebook', + resetNotebookExamples: 'IDL: Reset IDL and ENVI Example Notebooks', + newNotebook: 'IDL: Create New IDL Notebook', + notebookToProCode: 'IDL: Convert IDL Notebook to PRO Code', }, terminal: { startIDL: 'IDL: Open an IDL Terminal Window', @@ -119,6 +124,10 @@ export const EN: ITranslation = { stopIDL: 'Error while stopping IDL', helpAsNotebook: 'Error while converting help to notebook', openIDLExample: 'Error while opening IDL example notebook', + openENVIExample: 'Error while opening ENVI example notebook', + resetNotebookExamples: 'Error while resetting example notebooks', + newNotebook: 'Error while creating new notebook', + notebookToProCode: 'Error while converting notebook to PRO code', }, terminal: { startIDL: 'Error while opening IDL terminal indow', @@ -178,6 +187,7 @@ export const EN: ITranslation = { debugMode: 'If set to true, the extension will become very chatty for the purposes of debugging.', + IDL: 'Preferences for IDL', 'IDL.directory': "Specify the folder with IDL's executable (bin directory with idl.exe or idl).", 'IDL.path': @@ -254,8 +264,6 @@ export const EN: ITranslation = { control: 'How are control statements, such as "for", "if", "pro", formatted', hex: 'Indicates formatting for hexadecimal (hex) numbers (either defined with quotes or "0x")', - routines: - 'When we encounter a known routine (function, procedure, and method), how do we format it with respect to the definition', keywords: 'Formatting for keywords, includes binary keywords', localVariables: 'If local variables match the case for the first instance that we find', @@ -264,9 +272,15 @@ export const EN: ITranslation = { 'Controls accents to letters that set the data type and their case', octal: 'Indicates formatting for octal numbers (either defined with quotes or "0o")', - properties: 'Controls if properties are upper or lower case', + properties: 'Controls the case style of properties', quotes: 'For string literals what type of quote we use. Includes numbers defined using quotes.', + routines: + 'When we encounter a known routine (functions and procedures), how do we format it with respect to the definition', + routineMethods: + 'When we encounter a known routine method (function methods and procedure methods), how do we format it with respect to the definition?', + structureNames: + 'When we have a known named structure, how do we format the name?', systemVariables: 'Case formatting for system variables', }, 'IDL.history': { @@ -299,6 +313,8 @@ export const EN: ITranslation = { double: 'Use double quotes for string expressions', upper: 'Use upper case (i.e. "UPPER")', lower: 'Use lower case (i.e. "LOWER")', + camel: 'Use camel case (i.e. "camelCase")', + pascal: 'Use pascal case (i.e. "PascalCase")', match: 'Match case of definition', none: 'Apply no formatting', }, @@ -374,7 +390,8 @@ export const EN: ITranslation = { hoverHelp: HOVER_HELP_EN, envi: { openerTitle: 'ENVI File Opener', - openerText: 'ENVI should attempt to open the image shortly, please wait', + openerText: + 'ENVI should attempt to open the image shortly, please wait.\nTo disable this behavior, view the documentation for the extension "IDL for VSCode".', open: { commandError: 'An unknown error ocurred while trying to open data in ENVI', @@ -478,17 +495,29 @@ export const EN: ITranslation = { }, notebooks: { formatNotebooks: { - name: 'Format Notebook', + name: 'Format Notebook Cells', description: '', }, - openIDLExample: { - name: 'Open IDL Notebook Example', + newNotebook: { + name: 'New IDL Notebook', + description: '', + }, + notebookToProCode: { + name: 'Convert IDL Notebook to PRO Code', description: '', }, openENVIExample: { name: 'Open ENVI Notebook Example', description: '', }, + openIDLExample: { + name: 'Open IDL Notebook Example', + description: '', + }, + resetExampleNotebooks: { + name: 'Reset Example Notebooks', + description: '', + }, }, terminal: { openTerminal: { @@ -577,6 +606,7 @@ export const EN: ITranslation = { onDidChangeNotebook: 'Error responding to notebook change event', onDidCloseNotebook: 'Error responding to notebook close event', onRetrieveDocs: 'Error responding to docs retrieval event', + onNotebookToProCode: 'Error converting notebook to PRO code', }, errors: { unhandled: 'An unknown error ocurred within the IDL Language Server', @@ -607,7 +637,9 @@ export const EN: ITranslation = { errorLoadOutputs: 'Error while loading outputs from notebook cells, please re-run cells to generate outputs', errorSaving: 'Unknown error while saving notebook file', - failedStart: 'The IDL kernel failed to start', + failedStart: 'The notebook session of IDL failed to start', + didntStartRight: + "The notebook session of IDL didn't start or reset right. Not everything may function as expected.", failedExecute: 'Failed to execute notebook cells', crashed: 'IDL crashed or was stopped by the user and needs to be restarted', @@ -623,11 +655,16 @@ export const EN: ITranslation = { 'IDL has not started for notebooks. It automatically starts when you run a code cell.', noExamplesFoundInDocs: 'No examples found in documentation to create notebook from', + saveNotebookFirst: + 'You need to save your notebook to disk before converting', + includeAllCells: + 'Include all cells when converting to PRO code? Non-IDL cells will turn into comments.', }, }, notifications: { noProCode: 'No active PRO file in VSCode', noProCodeOrTaskFile: 'No active PRO file or Task file in VSCode', + noIDLNotebook: 'No active IDL Notebook in VSCode', noIDLDirFound: 'IDL directory not found or configured, cannot start IDL', yes: 'Yes', no: 'No', diff --git a/libs/translation/src/lib/translation.interface.ts b/libs/translation/src/lib/translation.interface.ts index 5967b7c9e..8a35aeeed 100644 --- a/libs/translation/src/lib/translation.interface.ts +++ b/libs/translation/src/lib/translation.interface.ts @@ -57,6 +57,14 @@ export interface ICommandTranslation { helpAsNotebook: string; /** Open IDL example notebook */ openIDLExample: string; + /** Open ENVI example notebook */ + openENVIExample: string; + /** Reset example notebooks */ + resetNotebookExamples: string; + /** Create a new notebook */ + newNotebook: string; + /** Convert a notebook to PRO code */ + notebookToProCode: string; }; /** Terminal commands */ terminal: { @@ -189,6 +197,10 @@ export interface IConfigTranslation { lower: string; /** Case */ upper: string; + /** Case */ + camel: string; + /** Case */ + pascal: string; /** Quotes */ single: string; /** Quotes */ @@ -451,6 +463,8 @@ export interface ITranslation { onDidCloseNotebook: string; /** Retrieving docs */ onRetrieveDocs: string; + /** Convert notebook to PRO code */ + onNotebookToProCode: string; }; /** Misc error reports */ errors: { @@ -531,10 +545,16 @@ export interface ITranslation { notebooks: { /** Format notebook */ formatNotebooks: ITreeInformation; - /** Format notebook */ - openIDLExample: ITreeInformation; + /** Make a new notebook document */ + newNotebook: ITreeInformation; /** Format notebook */ openENVIExample: ITreeInformation; + /** Format notebook */ + openIDLExample: ITreeInformation; + /** Reset example notebooks */ + resetExampleNotebooks: ITreeInformation; + /** Convert notebook to PRO code */ + notebookToProCode: ITreeInformation; }; /** Deprecated, but tree entries for IDL terminals */ terminal: { @@ -575,6 +595,8 @@ export interface ITranslation { failedStart: string; /** if we failed to execute one or more cells */ failedExecute: string; + /** Alert users that IDL for notebooks didn't quite start or reset right */ + didntStartRight: string; /** IDL crashes while running something in the notebook */ crashed: string; /** Error while trying to get graphics */ @@ -594,12 +616,18 @@ export interface ITranslation { idlNotStarted: string; /** No examples when opening notebook */ noExamplesFoundInDocs: string; + /** When a notebook needs to be saved to disk before we process it */ + saveNotebookFirst: string; + /** When converting to PRO file, include all cells? */ + includeAllCells: string; }; }; /** Translations related to notifications in dialogs that pop up in VSCode */ notifications: { /** When no PRO code if found in the editor */ noProCode: string; + /** When we have no IDL notebook in the editor */ + noIDLNotebook: string; /** No pro code or task file */ noProCodeOrTaskFile: string; /** When the IDL directory is not found */ diff --git a/libs/usage-metrics/project.json b/libs/usage-metrics/project.json index 547b6bf77..ab3c48cca 100644 --- a/libs/usage-metrics/project.json +++ b/libs/usage-metrics/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/usage-metrics/**/*.ts"] diff --git a/libs/vscode/client/project.json b/libs/vscode/client/project.json index 59646dba4..213036923 100644 --- a/libs/vscode/client/project.json +++ b/libs/vscode/client/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/client/**/*.ts"] diff --git a/libs/vscode/config/project.json b/libs/vscode/config/project.json index ec5838d43..dc0af04dc 100644 --- a/libs/vscode/config/project.json +++ b/libs/vscode/config/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/config/**/*.ts"] diff --git a/libs/vscode/config/src/index.ts b/libs/vscode/config/src/index.ts index bcfb7047e..60aec493d 100644 --- a/libs/vscode/config/src/index.ts +++ b/libs/vscode/config/src/index.ts @@ -1,3 +1,4 @@ +export * from './lib/helpers/get-workspace-config'; export * from './lib/helpers/send-preference-metrics'; export * from './lib/helpers/update-config'; export * from './lib/idl-config.interface'; diff --git a/libs/vscode/config/src/lib/helpers/send-preference-metrics.ts b/libs/vscode/config/src/lib/helpers/send-preference-metrics.ts index b035071a2..aab67362f 100644 --- a/libs/vscode/config/src/lib/helpers/send-preference-metrics.ts +++ b/libs/vscode/config/src/lib/helpers/send-preference-metrics.ts @@ -136,7 +136,9 @@ export function SendPreferenceUsageMetrics() { pref_octal: code.formattingStyle.octal, pref_binary: code.formattingStyle.binary, pref_routines: code.formattingStyle.routines, + pref_routine_methods: code.formattingStyle.routineMethods, pref_sys_var: code.formattingStyle.systemVariables, + pref_struct_name: code.formattingStyle.structureNames, pref_local_var: code.formattingStyle.localVariables, }); // VSCodeTelemetryLogger('select_item' as any, { diff --git a/libs/vscode/debug/project.json b/libs/vscode/debug/project.json index cf1968044..67079a607 100644 --- a/libs/vscode/debug/project.json +++ b/libs/vscode/debug/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/debug/**/*.ts"] diff --git a/libs/vscode/docs/project.json b/libs/vscode/docs/project.json index d9430f698..43894d38e 100644 --- a/libs/vscode/docs/project.json +++ b/libs/vscode/docs/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/docs/**/*.ts"] diff --git a/libs/vscode/envi-opener/project.json b/libs/vscode/envi-opener/project.json index 94eac5f3c..d65aaaff6 100644 --- a/libs/vscode/envi-opener/project.json +++ b/libs/vscode/envi-opener/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/envi-opener/**/*.ts"] diff --git a/libs/vscode/envi-opener/src/lib/envi-opener.class.ts b/libs/vscode/envi-opener/src/lib/envi-opener.class.ts index 4f7244665..0759427e1 100644 --- a/libs/vscode/envi-opener/src/lib/envi-opener.class.ts +++ b/libs/vscode/envi-opener/src/lib/envi-opener.class.ts @@ -24,7 +24,7 @@ const WEBVIEW_HTML = ` * in order to open and display the image. */ export class ENVIOpenerProvider implements vscode.CustomTextEditorProvider { - private static readonly viewType = ENVI_OPENER_TYPE; + static readonly viewType = ENVI_OPENER_TYPE; /** * Called when our custom editor is opened. diff --git a/libs/vscode/envi-opener/src/lib/initialize-envi-opener.ts b/libs/vscode/envi-opener/src/lib/initialize-envi-opener.ts index 7b88a3159..519750b7f 100644 --- a/libs/vscode/envi-opener/src/lib/initialize-envi-opener.ts +++ b/libs/vscode/envi-opener/src/lib/initialize-envi-opener.ts @@ -1,4 +1,3 @@ -import { ENVI_OPENER_TYPE } from '@idl/shared'; import { IDL_LOGGER } from '@idl/vscode/client'; import { ExtensionContext } from 'vscode'; import * as vscode from 'vscode'; @@ -16,6 +15,9 @@ export function InitializeENVIOpener(ctx: ExtensionContext) { // register and add to extension context ctx.subscriptions.push( - vscode.window.registerCustomEditorProvider(ENVI_OPENER_TYPE, provider) + vscode.window.registerCustomEditorProvider( + ENVIOpenerProvider.viewType, + provider + ) ); } diff --git a/libs/vscode/events/client/project.json b/libs/vscode/events/client/project.json index 9a1b01151..b13e6a66e 100644 --- a/libs/vscode/events/client/project.json +++ b/libs/vscode/events/client/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/events/client/**/*.ts"] diff --git a/libs/vscode/events/messages/project.json b/libs/vscode/events/messages/project.json index ba9a005fe..c253b120d 100644 --- a/libs/vscode/events/messages/project.json +++ b/libs/vscode/events/messages/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/events/messages/**/*.ts"] diff --git a/libs/vscode/events/messages/src/index.ts b/libs/vscode/events/messages/src/index.ts index fc60b2b65..b3815168c 100644 --- a/libs/vscode/events/messages/src/index.ts +++ b/libs/vscode/events/messages/src/index.ts @@ -3,6 +3,7 @@ export * from './lib/generate-task.interface'; export * from './lib/indexing-message.interface'; export * from './lib/lsp-messages.interface'; export * from './lib/message-name-normalizer'; +export * from './lib/notebook-to-pro-code.interface'; export * from './lib/parse-server-message'; export * from './lib/rename.interface'; export * from './lib/retrieve-docs-message.interface'; diff --git a/libs/vscode/events/messages/src/lib/lsp-messages.interface.ts b/libs/vscode/events/messages/src/lib/lsp-messages.interface.ts index 88379e9d1..23476f30c 100644 --- a/libs/vscode/events/messages/src/lib/lsp-messages.interface.ts +++ b/libs/vscode/events/messages/src/lib/lsp-messages.interface.ts @@ -15,6 +15,11 @@ import { IndexingMessage, } from './indexing-message.interface'; import { LoggingMessage } from './logging.message.interface'; +import { + INotebookToProCodePayload, + INotebookToProCodeResponse, + NotebookToProCodeMessage, +} from './notebook-to-pro-code.interface'; import { FileRenameMessage, IFileRenamePayload } from './rename.interface'; import { IRetrieveDocsPayload, @@ -42,39 +47,46 @@ export type LanguageServerMessage = | IndexingMessage | InitWorkspaceConfigMessage | LoggingMessage + | NotebookToProCodeMessage | RetrieveDocsMessage | UsageMetricLSPMessage | WorkspaceConfigMessage; /** Strictly typed payloads to/from the language server */ export type LanguageServerPayload = - T extends WorkspaceConfigMessage - ? IWorkspaceConfigPayload + T extends AddDocsMessage + ? IAddDocsMessagePayload : T extends FileRenameMessage ? IFileRenamePayload - : T extends IndexingMessage - ? IIndexingMessagePayload - : T extends InitWorkspaceConfigMessage - ? IInitWorkspaceConfigPayload - : T extends LoggingMessage - ? ILogOptions - : T extends AddDocsMessage - ? IAddDocsMessagePayload : T extends FolderDeleteMessage ? IFolderDeletePayload : T extends FormatFileMessage ? DocumentFormattingParams : T extends GenerateTaskMessage ? IGenerateTaskPayload + : T extends IndexingMessage + ? IIndexingMessagePayload + : T extends InitWorkspaceConfigMessage + ? IInitWorkspaceConfigPayload + : T extends LoggingMessage + ? ILogOptions + : T extends NotebookToProCodeMessage + ? INotebookToProCodePayload : T extends RetrieveDocsMessage ? IRetrieveDocsPayload : T extends UsageMetricLSPMessage ? IUsageMetricAndPayload + : T extends WorkspaceConfigMessage + ? IWorkspaceConfigPayload : any; /** Strictly typed payloads to/from the language server */ export type LanguageServerResponse = - T extends RetrieveDocsMessage ? IRetrieveDocsResponse : any; + T extends RetrieveDocsMessage + ? IRetrieveDocsResponse + : T extends NotebookToProCodeMessage + ? INotebookToProCodeResponse + : any; /** Strictly typed lookup of language server messages */ export interface ILanguageServerMessages { @@ -94,6 +106,8 @@ export interface ILanguageServerMessages { INIT_WORKSPACE_CONFIG: InitWorkspaceConfigMessage; /** Log content from the LSP */ LOG: LoggingMessage; + /** Convert notebooks to PRO code */ + NOTEBOOK_TO_PRO_CODE: NotebookToProCodeMessage; /** Message to retrieve docs */ RETRIEVE_DOCS: RetrieveDocsMessage; /** Message to update workspace config */ @@ -117,6 +131,7 @@ export const LANGUAGE_SERVER_MESSAGE_LOOKUP: ILanguageServerMessages = { INDEXING: 'indexing', INIT_WORKSPACE_CONFIG: 'init-workspace-config', LOG: 'log', + NOTEBOOK_TO_PRO_CODE: 'notebook/to-pro-code', RETRIEVE_DOCS: 'retrieve-docs', USAGE_METRIC: 'usage-metric-lsp', WORKSPACE_CONFIG: 'workspace-config', diff --git a/libs/vscode/events/messages/src/lib/notebook-to-pro-code.interface.ts b/libs/vscode/events/messages/src/lib/notebook-to-pro-code.interface.ts new file mode 100644 index 000000000..a9deae98e --- /dev/null +++ b/libs/vscode/events/messages/src/lib/notebook-to-pro-code.interface.ts @@ -0,0 +1,31 @@ +import { INotebookToProCodeOptions } from '@idl/notebooks/types'; + +/** + * Message for converting a notebook to PRO code + */ +export type NotebookToProCodeMessage = 'notebook/to-pro-code'; + +/** + * Payload when we convert notebooks to PRO code + */ +export interface INotebookToProCodePayload { + /** + * Notebook URI + */ + uri: string; + /** + * The options when we convert from a notebook to PRO code + */ + options?: Partial; +} + +/** + * Response when we convert a notebooks to PRO code + */ + +export interface INotebookToProCodeResponse { + /** + * The contents of the notebook as a PRO file + */ + code: string; +} diff --git a/libs/vscode/events/server/project.json b/libs/vscode/events/server/project.json index 5d7061219..dd465c5b6 100644 --- a/libs/vscode/events/server/project.json +++ b/libs/vscode/events/server/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/events/server/**/*.ts"] diff --git a/libs/vscode/extension-config/project.json b/libs/vscode/extension-config/project.json index 35f968667..2afe6f45b 100644 --- a/libs/vscode/extension-config/project.json +++ b/libs/vscode/extension-config/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/extension-config/**/*.ts"] diff --git a/libs/vscode/extension-config/src/lib/extension-config.interface.ts b/libs/vscode/extension-config/src/lib/extension-config.interface.ts index 83241b614..9c2ba25ce 100644 --- a/libs/vscode/extension-config/src/lib/extension-config.interface.ts +++ b/libs/vscode/extension-config/src/lib/extension-config.interface.ts @@ -18,6 +18,8 @@ export interface IDLExtensionsConfigKeys { /** Full debug logs for everything */ readonly debugMode: 'debugMode'; + /** Root level IDL preferences */ + IDL: 'IDL'; /** Folder the IDL executable lives in (i.e. the bin directory with idl.exe) */ readonly IDLDirectory: 'IDL.directory'; /** User configured IDL path */ @@ -226,6 +228,7 @@ export interface IDLExtensionConfig { export const IDL_EXTENSION_CONFIG_KEYS: IDLExtensionsConfigKeys = { debugMode: 'debugMode', + IDL: 'IDL', IDLDirectory: 'IDL.directory', IDLPath: 'IDL.path', IDLAddWorkspaceFoldersToPath: 'IDL.addWorkspaceFoldersToPath', diff --git a/libs/vscode/help-view/project.json b/libs/vscode/help-view/project.json index 9770140b5..770bffde1 100644 --- a/libs/vscode/help-view/project.json +++ b/libs/vscode/help-view/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/help-view/**/*.ts"] diff --git a/libs/vscode/initialize-types/project.json b/libs/vscode/initialize-types/project.json index f1b940c7b..49ed4ff06 100644 --- a/libs/vscode/initialize-types/project.json +++ b/libs/vscode/initialize-types/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/initialize-types/**/*.ts"] diff --git a/libs/vscode/notebooks/project.json b/libs/vscode/notebooks/project.json index 3b52db083..45f681986 100644 --- a/libs/vscode/notebooks/project.json +++ b/libs/vscode/notebooks/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/notebooks/**/*.ts"] diff --git a/libs/vscode/notebooks/src/lib/commands/register-notebook-commands.ts b/libs/vscode/notebooks/src/lib/commands/register-notebook-commands.ts index d26007658..3c37cac95 100644 --- a/libs/vscode/notebooks/src/lib/commands/register-notebook-commands.ts +++ b/libs/vscode/notebooks/src/lib/commands/register-notebook-commands.ts @@ -4,10 +4,13 @@ import { DOCS_NOTEBOOK_FOLDER, EXAMPLE_NOTEBOOKS, } from '@idl/notebooks/shared'; +import { INotebookToProCodeOptions } from '@idl/notebooks/types'; import { GetExtensionPath, IDL_COMMANDS, + IDL_LANGUAGE_NAME, IDL_NOTEBOOK_EXTENSION, + IDL_NOTEBOOK_LANGUAGE_NAME, Sleep, } from '@idl/shared'; import { IDL_TRANSLATION } from '@idl/translation'; @@ -18,12 +21,16 @@ import { LogCommandError, LogCommandInfo, } from '@idl/vscode/client'; -import { IRetrieveDocsPayload } from '@idl/vscode/events/messages'; import { + IRetrieveDocsPayload, + LANGUAGE_SERVER_MESSAGE_LOOKUP, +} from '@idl/vscode/events/messages'; +import { + GetActiveIDLNotebookWindow, OpenNotebookInVSCode, VSCodeTelemetryLogger, } from '@idl/vscode/shared'; -import { existsSync, mkdirSync, writeFileSync } from 'fs'; +import { existsSync, mkdirSync, rmSync, writeFileSync } from 'fs'; import { cp } from 'fs/promises'; import { join } from 'path'; import { ExtensionContext } from 'vscode'; @@ -186,6 +193,70 @@ export function RegisterNotebookCommands(ctx: ExtensionContext) { ) ); + ctx.subscriptions.push( + vscode.commands.registerCommand( + IDL_COMMANDS.NOTEBOOKS.NEW_NOTEBOOK, + async () => { + try { + const doc = await vscode.workspace.openNotebookDocument( + IDL_NOTEBOOK_LANGUAGE_NAME + ); + + await vscode.window.showNotebookDocument(doc); + + // return as though we succeeded + return true; + } catch (err) { + LogCommandError( + 'Error creating a new IDL Notebook', + err, + cmdErrors.notebooks.newNotebook + ); + return false; + } + } + ) + ); + + ctx.subscriptions.push( + vscode.commands.registerCommand( + IDL_COMMANDS.NOTEBOOKS.OPEN_ENVI_EXAMPLE, + async () => { + try { + // make folder if it doesnt exist + if (!existsSync(EXAMPLE_NOTEBOOKS)) { + mkdirSync(EXAMPLE_NOTEBOOKS, { recursive: true }); + } + + // get destination path + const exampleUri = join(EXAMPLE_NOTEBOOKS, 'hello-world-envi.idlnb'); + + // if it doesnt exist, copy it + if (!existsSync(exampleUri)) { + await cp( + GetExtensionPath('extension/docs/notebooks'), + EXAMPLE_NOTEBOOKS, + { recursive: true } + ); + } + + // open the notebook in vscode + await OpenNotebookInVSCode(exampleUri, true, false); + + // return as though we succeeded + return true; + } catch (err) { + LogCommandError( + 'Error opening IDL example notebook', + err, + cmdErrors.notebooks.openIDLExample + ); + return false; + } + } + ) + ); + ctx.subscriptions.push( vscode.commands.registerCommand( IDL_COMMANDS.NOTEBOOKS.OPEN_IDL_EXAMPLE, @@ -224,4 +295,136 @@ export function RegisterNotebookCommands(ctx: ExtensionContext) { } ) ); + + ctx.subscriptions.push( + vscode.commands.registerCommand( + IDL_COMMANDS.NOTEBOOKS.NOTEBOOK_TO_PRO_CODE, + async (options?: Partial) => { + try { + // get open notebook + const notebook = GetActiveIDLNotebookWindow(); + + // no notebook, indicate that we didnt run + if (!notebook) { + return false; + } + + /** + * Options object we pass to the API + */ + const useOptions: Partial = {}; + + /** + * If we didnt pass in options, ask the user for some information + */ + if (!options) { + const includeAll = await vscode.window.showInformationMessage( + IDL_TRANSLATION.notebooks.notifications.includeAllCells, + ...[ + { title: IDL_TRANSLATION.notifications.yes }, + { title: IDL_TRANSLATION.notifications.no }, + ] + ); + + if (includeAll === undefined) { + return; + } + + // update flag to include everything + useOptions.includeAllCells = + includeAll.title === IDL_TRANSLATION.notifications.yes + ? true + : false; + } else { + // update the options we use with what was passed in + Object.assign(useOptions, options); + } + + /** + * Track if its a file or not + */ + let isFile = true; + try { + await vscode.workspace.fs.stat(notebook.uri); + } catch (err) { + isFile = false; + } + + // if we couldnt get stats on the file, it hasnt been saved + if (!isFile) { + vscode.window.showWarningMessage( + IDL_TRANSLATION.notebooks.notifications.saveNotebookFirst + ); + return false; + } + + const resp = await LANGUAGE_SERVER_MESSENGER.sendRequest( + LANGUAGE_SERVER_MESSAGE_LOOKUP.NOTEBOOK_TO_PRO_CODE, + { + uri: notebook.uri.toString(), + options: useOptions, + } + ); + + // make sure we didnt have an error + if (!resp) { + return false; + } + + // open a new document with the PRO code + const doc = await vscode.workspace.openTextDocument({ + content: resp.code, + language: IDL_LANGUAGE_NAME, + }); + + // show it + await vscode.window.showTextDocument(doc); + + return true; + } catch (err) { + LogCommandError( + 'Error converting notebook to PRO code', + err, + cmdErrors.notebooks.notebookToProCode + ); + return false; + } + } + ) + ); + + ctx.subscriptions.push( + vscode.commands.registerCommand( + IDL_COMMANDS.NOTEBOOKS.RESET_NOTEBOOK_EXAMPLES, + async () => { + try { + // make folder if it doesnt exist + if (existsSync(EXAMPLE_NOTEBOOKS)) { + rmSync(EXAMPLE_NOTEBOOKS, { recursive: true }); + } + + // make folder if it doesnt exist + if (!existsSync(EXAMPLE_NOTEBOOKS)) { + mkdirSync(EXAMPLE_NOTEBOOKS, { recursive: true }); + } + + await cp( + GetExtensionPath('extension/docs/notebooks'), + EXAMPLE_NOTEBOOKS, + { recursive: true } + ); + + // return as though we succeeded + return true; + } catch (err) { + LogCommandError( + 'Error while resetting example notebooks', + err, + cmdErrors.notebooks.resetNotebookExamples + ); + return false; + } + } + ) + ); } diff --git a/libs/vscode/notebooks/src/lib/controller/idl-notebook-controller.class.ts b/libs/vscode/notebooks/src/lib/controller/idl-notebook-controller.class.ts index dd1124aed..3215f7a3c 100644 --- a/libs/vscode/notebooks/src/lib/controller/idl-notebook-controller.class.ts +++ b/libs/vscode/notebooks/src/lib/controller/idl-notebook-controller.class.ts @@ -6,6 +6,7 @@ import { REGEX_NEW_LINE, } from '@idl/idl'; import { IDL_DEBUG_NOTEBOOK_LOG, IDL_NOTEBOOK_LOG } from '@idl/logger'; +import { NOTEBOOK_FOLDER } from '@idl/notebooks/shared'; import { IDLNotebookEmbeddedItems } from '@idl/notebooks/types'; import { Parser } from '@idl/parser'; import { IDL_PROBLEM_CODES } from '@idl/parsing/problem-codes'; @@ -16,7 +17,7 @@ import { CleanPath, IDL_LANGUAGE_NAME, IDL_NOTEBOOK_CONTROLLER_NAME, - IDL_NOTEBOOK_NAME, + IDL_NOTEBOOK_LANGUAGE_NAME, Sleep, } from '@idl/shared'; import { IDL_TRANSLATION } from '@idl/translation'; @@ -50,7 +51,7 @@ export class IDLNotebookController { /** * Type of notebook */ - readonly notebookType = IDL_NOTEBOOK_NAME; + readonly notebookType = IDL_NOTEBOOK_LANGUAGE_NAME; /** * Label for our controller @@ -425,27 +426,22 @@ export class IDLNotebookController { // see if we need to resolve more if (IDL_EXTENSION_CONFIG.notebooks.embedGraphics) { - // [ - // `.compile idlittool__define`, - // `idlititool__refreshcurrentview`, - // `graphic__define`, - // `graphic__refresh`, - // ] - // await this.evaluate( - // [ - // `.compile idlittool__define`, - // `'${VSCODE_PRO_DIR}/idlititool__refreshcurrentview.pro'`, - // `graphic__define`, - // `'${VSCODE_PRO_DIR}/graphic__refresh.pro'`, - // ].join(' ') - // ); - outputs.push(await this.evaluate('.compile idlittool__define')); + /** + * Handle object graphics and override with our custom method + */ + await this.evaluate('.compile idlittool__define'); + // outputs.push(await this.evaluate('.compile idlittool__define')); outputs.push( await this.evaluate( `.compile '${VSCODE_NOTEBOOK_PRO_DIR}/idlititool__refreshcurrentview.pro'` ) ); - outputs.push(await this.evaluate('.compile graphic__define')); + + /** + * Handle functions graphics and override with our custom method + */ + await this.evaluate('.compile graphic__define'); + // outputs.push(await this.evaluate('.compile graphic__define')); outputs.push( await this.evaluate( `.compile '${VSCODE_NOTEBOOK_PRO_DIR}/graphic__refresh.pro'` @@ -453,12 +449,29 @@ export class IDLNotebookController { ); } - // log output for easy debugging - IDL_LOGGER.log({ - log: IDL_NOTEBOOK_LOG, - type: 'info', - content: [`IDL post-launch and reset output (should be empty)`, outputs], - }); + /** + * Check to see if the notebooks started right or not + */ + if (/%\s*Syntax/gim.test(outputs.join(''))) { + IDL_LOGGER.log({ + log: IDL_NOTEBOOK_LOG, + type: 'error', + content: [ + `Notebook session of IDL failed to start or reset correctly`, + outputs, + ], + alert: IDL_TRANSLATION.notebooks.errors.didntStartRight, + }); + } else { + IDL_LOGGER.log({ + log: IDL_NOTEBOOK_LOG, + type: 'debug', + content: [ + `IDL post-launch and reset output (should be empty)`, + outputs, + ], + }); + } } /** @@ -626,8 +639,11 @@ export class IDLNotebookController { // reset cell output execution.clearOutput(); - /** Folder where we write notebook */ - const nbDir = dirname(CleanPath(cell.notebook.uri.fsPath)); + /** Folder where we write notebook cell */ + const nbDir = + cell.notebook.uri.scheme === 'file' + ? dirname(CleanPath(cell.notebook.uri.fsPath)) + : NOTEBOOK_FOLDER; /** * temp folder for notebook cell diff --git a/libs/vscode/notebooks/src/lib/initialize-notebooks.ts b/libs/vscode/notebooks/src/lib/initialize-notebooks.ts index 62bc1f320..76e29d3a5 100644 --- a/libs/vscode/notebooks/src/lib/initialize-notebooks.ts +++ b/libs/vscode/notebooks/src/lib/initialize-notebooks.ts @@ -1,4 +1,4 @@ -import { IDL_NOTEBOOK_NAME } from '@idl/shared'; +import { IDL_NOTEBOOK_LANGUAGE_NAME } from '@idl/shared'; import { IDL_LOGGER } from '@idl/vscode/client'; import { ExtensionContext } from 'vscode'; import * as vscode from 'vscode'; @@ -30,7 +30,7 @@ export function InitializeNotebooks( }); ctx.subscriptions.push( vscode.workspace.registerNotebookSerializer( - IDL_NOTEBOOK_NAME, + IDL_NOTEBOOK_LANGUAGE_NAME, IDL_NOTEBOOK_SERIALIZER ) ); @@ -46,6 +46,7 @@ export function InitializeNotebooks( // RegisterNotebookHoverProvider(); // RegisterNotebookCompletionProvider(); // RegisterNotebookDefinitionProvider(); + // RegisterNotebookSymbolProvider(); // register notebook commands RegisterNotebookCommands(ctx); diff --git a/libs/vscode/notebooks/src/lib/providers/register-notebook-symbol-provider.ts b/libs/vscode/notebooks/src/lib/providers/register-notebook-symbol-provider.ts new file mode 100644 index 000000000..74e80e74d --- /dev/null +++ b/libs/vscode/notebooks/src/lib/providers/register-notebook-symbol-provider.ts @@ -0,0 +1,74 @@ +import { IDL_NOTEBOOK_CELL_SELECTOR } from '@idl/shared'; +import { LANGUAGE_SERVER_CLIENT } from '@idl/vscode/client'; +import * as vscode from 'vscode'; +import { DocumentSymbol, DocumentSymbolParams } from 'vscode-languageserver'; + +import { GetNotebookCellIndex } from '../helpers/get-notebook-cell-index'; + +/** + * Registers our provider for notebook auto completion + */ +export function RegisterNotebookSymbolProvider() { + vscode.languages.registerDocumentSymbolProvider(IDL_NOTEBOOK_CELL_SELECTOR, { + async provideDocumentSymbols(document, _token) { + /** + * Get notebook and document for index + */ + const doc = GetNotebookCellIndex(document); + + // return if no matching doc + if (doc === undefined) { + return undefined; + } + + /** + * Create hover help parameters - typed for strictness + */ + const params: DocumentSymbolParams = { + textDocument: { + uri: `${doc.notebook.uri.toString()}#${doc.cell}`, + }, + }; + + /** + * Send and wait for a response from the server + */ + const symbols: DocumentSymbol[] = + await LANGUAGE_SERVER_CLIENT.sendRequest( + 'textDocument/documentSymbol', + params + ); + + // return if nothing to do + if (!symbols) { + return undefined; + } + + return symbols.map( + (item) => + new vscode.DocumentSymbol( + item.name, + item.detail, + item.kind as vscode.SymbolKind, + new vscode.Range( + new vscode.Position( + item.range.start.line, + item.range.start.character + ), + new vscode.Position(item.range.end.line, item.range.end.character) + ), + new vscode.Range( + new vscode.Position( + item.selectionRange.start.line, + item.selectionRange.start.character + ), + new vscode.Position( + item.selectionRange.end.line, + item.selectionRange.end.character + ) + ) + ) + ); + }, + }); +} diff --git a/libs/vscode/server/project.json b/libs/vscode/server/project.json index 3035c9ab5..d215a3d55 100644 --- a/libs/vscode/server/project.json +++ b/libs/vscode/server/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/server/**/*.ts"] diff --git a/libs/vscode/server/src/lib/events/custom-events/on-notebook-to-pro-code.ts b/libs/vscode/server/src/lib/events/custom-events/on-notebook-to-pro-code.ts new file mode 100644 index 000000000..d6700ac84 --- /dev/null +++ b/libs/vscode/server/src/lib/events/custom-events/on-notebook-to-pro-code.ts @@ -0,0 +1,102 @@ +import { + DEFAULT_ASSEMBLER_OPTIONS, + FormatterType, + IAssemblerOptions, +} from '@idl/assembling/config'; +import { CancellationToken } from '@idl/cancellation-tokens'; +import { IDL_LSP_LOG } from '@idl/logger'; +import { NotebookToProCode } from '@idl/notebooks/idl-index'; +import { NotebookToIDLNotebook } from '@idl/notebooks/shared'; +import { GetFSPath } from '@idl/shared'; +import { IDL_TRANSLATION } from '@idl/translation'; +import { + INotebookToProCodePayload, + INotebookToProCodeResponse, +} from '@idl/vscode/events/messages'; + +import { IDL_CLIENT_CONFIG } from '../../helpers/track-workspace-config'; +import { IDL_LANGUAGE_SERVER_LOGGER } from '../../initialize-server'; +import { IDL_INDEX } from '../initialize-document-manager'; +import { NOTEBOOK_MANAGER } from '../initialize-notebook-manager'; +import { SERVER_INITIALIZED } from '../is-initialized'; + +/** + * Callback to handle converting notebooks to PRO code + * + * @param event The event from VSCode + */ +export const ON_NOTEBOOK_TO_PRO_CODE = async ( + event: INotebookToProCodePayload +): Promise => { + await SERVER_INITIALIZED; + try { + // log information + IDL_LANGUAGE_SERVER_LOGGER.log({ + log: IDL_LSP_LOG, + type: 'debug', + content: ['Notebook to PRO code request', event], + }); + + /** + * Get our notebook document + */ + const nb = NOTEBOOK_MANAGER.getNotebookDocument(event.uri); + + /** + * Get text for all cells for quick access + */ + const idlNotebook = NotebookToIDLNotebook(nb, NOTEBOOK_MANAGER); + + /** + * Get the path to our notebook on disk + */ + const fsPath = GetFSPath(event.uri); + + /** + * Make default formatting config for info.fsPath + * + * Use settings from VSCode client as our default + */ + const clientConfig: IAssemblerOptions = { + ...DEFAULT_ASSEMBLER_OPTIONS, + ...IDL_CLIENT_CONFIG.code.formatting, + style: IDL_CLIENT_CONFIG.code.formattingStyle, + }; + + // // log information + // IDL_LANGUAGE_SERVER_LOGGER.log({ + // log: IDL_LSP_LOG, + // type: 'debug', + // content: ['Client config', clientConfig], + // }); + + /** Formatting config for info.fsPath */ + const config = IDL_INDEX.getConfigForFile(fsPath, clientConfig); + + // // log information + // IDL_LANGUAGE_SERVER_LOGGER.log({ + // log: IDL_LSP_LOG, + // type: 'debug', + // content: ['Formatting config', config], + // }); + + return { + code: await NotebookToProCode( + IDL_INDEX, + fsPath, + idlNotebook, + config, + new CancellationToken(), + event.options || {} + ), + }; + } catch (err) { + IDL_LANGUAGE_SERVER_LOGGER.log({ + log: IDL_LSP_LOG, + type: 'error', + content: ['Error converting notebook to PRO code', err], + alert: IDL_TRANSLATION.lsp.events.onDocumentFormatting, + }); + return null; + } +}; diff --git a/libs/vscode/server/src/lib/events/documents/on-did-close.ts b/libs/vscode/server/src/lib/events/documents/on-did-close.ts index 783a1f0d1..0b762c306 100644 --- a/libs/vscode/server/src/lib/events/documents/on-did-close.ts +++ b/libs/vscode/server/src/lib/events/documents/on-did-close.ts @@ -4,6 +4,7 @@ import { TextDocumentChangeEvent } from 'vscode-languageserver/node'; import { TextDocument } from 'vscode-languageserver-textdocument'; import { CacheValid } from '../../helpers/cache-valid'; +import { IsURIFile } from '../../helpers/is-uri-file'; import { ResolveFSPathAndCodeForURI } from '../../helpers/resolve-fspath-and-code-for-uri'; import { SendProblems } from '../../helpers/send-problems'; import { IDL_LANGUAGE_SERVER_LOGGER } from '../../initialize-server'; @@ -20,6 +21,11 @@ export const ON_DID_CLOSE = async ( ) => { await SERVER_INITIALIZED; try { + // if we had a temporary file, return + if (!IsURIFile(event.document.uri)) { + return; + } + // return if our cache is valid and the content has not changed if (CacheValid(event.document.uri)) { return; diff --git a/libs/vscode/server/src/lib/events/documents/on-document-symbol.ts b/libs/vscode/server/src/lib/events/documents/on-document-symbol.ts index bf6478a06..0f5f49ead 100644 --- a/libs/vscode/server/src/lib/events/documents/on-document-symbol.ts +++ b/libs/vscode/server/src/lib/events/documents/on-document-symbol.ts @@ -4,7 +4,6 @@ import { IDL_TRANSLATION } from '@idl/translation'; import { DocumentSymbol, DocumentSymbolParams, - SymbolInformation, } from 'vscode-languageserver/node'; import { ResolveFSPathAndCodeForURI } from '../../helpers/resolve-fspath-and-code-for-uri'; @@ -17,7 +16,7 @@ import { SERVER_INITIALIZED } from '../is-initialized'; */ export const ON_DOCUMENT_SYMBOL = async ( event: DocumentSymbolParams -): Promise => { +): Promise => { await SERVER_INITIALIZED; try { IDL_LANGUAGE_SERVER_LOGGER.log({ diff --git a/libs/vscode/server/src/lib/events/initialize-custom-event-handler.ts b/libs/vscode/server/src/lib/events/initialize-custom-event-handler.ts index 59ae25581..da24bf77f 100644 --- a/libs/vscode/server/src/lib/events/initialize-custom-event-handler.ts +++ b/libs/vscode/server/src/lib/events/initialize-custom-event-handler.ts @@ -6,6 +6,7 @@ import { ON_DID_RENAME } from './custom-events/on-did-rename'; import { ON_FOLDER_DELETE } from './custom-events/on-folder-delete'; import { ON_GENERATE_TASK } from './custom-events/on-generate-task'; import { ON_INIT_WORKSPACE_CONFIG } from './custom-events/on-init-workspace-config'; +import { ON_NOTEBOOK_TO_PRO_CODE } from './custom-events/on-notebook-to-pro-code'; import { ON_RETRIEVE_DOCS } from './custom-events/on-retrieve-docs'; import { ON_WORKSPACE_CONFIG } from './custom-events/on-workspace-config'; import { ON_DOCUMENT_FORMATTING } from './documents/on-document-formatting'; @@ -62,4 +63,10 @@ export function InitializeCustomEventHandler() { LANGUAGE_SERVER_MESSAGE_LOOKUP.RETRIEVE_DOCS, ON_RETRIEVE_DOCS ); + + // listen for converting notebooks to PRO code + SERVER_EVENT_MANAGER.onRequest( + LANGUAGE_SERVER_MESSAGE_LOOKUP.NOTEBOOK_TO_PRO_CODE, + ON_NOTEBOOK_TO_PRO_CODE + ); } diff --git a/libs/vscode/server/src/lib/helpers/is-uri-file.ts b/libs/vscode/server/src/lib/helpers/is-uri-file.ts new file mode 100644 index 000000000..106abb03d --- /dev/null +++ b/libs/vscode/server/src/lib/helpers/is-uri-file.ts @@ -0,0 +1,8 @@ +import { URI } from 'vscode-uri'; + +/** + * Parses a URI from VSCode and determines if we have a file scheme or not + */ +export function IsURIFile(uri: string) { + return URI.parse(uri).scheme === 'file'; +} diff --git a/libs/vscode/server/src/lib/initialize-server.ts b/libs/vscode/server/src/lib/initialize-server.ts index 612216948..ba422b4d7 100644 --- a/libs/vscode/server/src/lib/initialize-server.ts +++ b/libs/vscode/server/src/lib/initialize-server.ts @@ -1,6 +1,9 @@ import { IDL_LSP_CONSOLE, LogManager } from '@idl/logger'; import { SEMANTIC_TOKEN_LEGEND } from '@idl/parsing/semantic-tokens'; -import { COMPLETION_TRIGGER_CHARACTERS, IDL_NOTEBOOK_NAME } from '@idl/shared'; +import { + COMPLETION_TRIGGER_CHARACTERS, + IDL_NOTEBOOK_LANGUAGE_NAME, +} from '@idl/shared'; import { IDL_TRANSLATION, InitializeTranslation } from '@idl/translation'; import { LANGUAGE_SERVER_MESSAGE_LOOKUP } from '@idl/vscode/events/messages'; import { VSCodeServerEventManager } from '@idl/vscode/events/server'; @@ -190,7 +193,7 @@ export function InitializeServer() { { notebook: { scheme: 'file', - notebookType: IDL_NOTEBOOK_NAME, + notebookType: IDL_NOTEBOOK_LANGUAGE_NAME, }, }, ], diff --git a/libs/vscode/shared/project.json b/libs/vscode/shared/project.json index 04c3bf9c2..981aa1e1d 100644 --- a/libs/vscode/shared/project.json +++ b/libs/vscode/shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/shared/**/*.ts"] diff --git a/libs/vscode/shared/src/index.ts b/libs/vscode/shared/src/index.ts index a3a65eb00..4f485679e 100644 --- a/libs/vscode/shared/src/index.ts +++ b/libs/vscode/shared/src/index.ts @@ -1,3 +1,4 @@ +export * from './lib/get-active-idl-notebook-widnow'; export * from './lib/get-active-pro-code-or-task-window'; export * from './lib/get-active-pro-code-window'; export * from './lib/idl-command-action.interface'; diff --git a/libs/vscode/shared/src/lib/get-active-idl-notebook-widnow.ts b/libs/vscode/shared/src/lib/get-active-idl-notebook-widnow.ts new file mode 100644 index 000000000..b9c2b2661 --- /dev/null +++ b/libs/vscode/shared/src/lib/get-active-idl-notebook-widnow.ts @@ -0,0 +1,40 @@ +import { IDL_NOTEBOOK_LANGUAGE_NAME } from '@idl/shared'; +import { IDL_TRANSLATION } from '@idl/translation'; +import * as vscode from 'vscode'; + +/** + * Gets the current notebook editor in VSCode and checks if it is an IDL Notebook or not + * + * Returns undefined if no file is found + */ +export function GetActiveIDLNotebookWindow( + alert = true +): vscode.NotebookDocument | undefined { + // get active editor + const editor = vscode.window.activeNotebookEditor; + + // check how to proceed + switch (true) { + // no editor + case !editor: + if (alert) { + vscode.window.showInformationMessage( + IDL_TRANSLATION.notifications.noIDLNotebook + ); + } + return undefined; + + // IDL notebook + case editor.notebook.notebookType === IDL_NOTEBOOK_LANGUAGE_NAME: + return editor.notebook; + + // nothing we care about + default: + if (alert) { + vscode.window.showInformationMessage( + IDL_TRANSLATION.notifications.noProCode + ); + } + return undefined; + } +} diff --git a/libs/vscode/shared/src/lib/vscode-commands.interface.ts b/libs/vscode/shared/src/lib/vscode-commands.interface.ts index d8b83ec74..3c8020dc6 100644 --- a/libs/vscode/shared/src/lib/vscode-commands.interface.ts +++ b/libs/vscode/shared/src/lib/vscode-commands.interface.ts @@ -38,6 +38,10 @@ export const VSCODE_COMMANDS = { * Add code cell to top */ NOTEBOOK_INSERT_CODE_CELL_AT_TOP: 'notebook.cell.insertCodeCellAtTop', + /** + * Add code cell below + */ + NOTEBOOK_INSERT_CODE_CELL_AT_BOTTOM: 'notebook.cell.insertCodeCellBelow', /** * Run all notebook cells */ diff --git a/libs/vscode/terminal/project.json b/libs/vscode/terminal/project.json index f84c8cd9e..538c2e61a 100644 --- a/libs/vscode/terminal/project.json +++ b/libs/vscode/terminal/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/terminal/**/*.ts"] diff --git a/libs/vscode/tree-view/project.json b/libs/vscode/tree-view/project.json index 22892b1a1..583d59ecf 100644 --- a/libs/vscode/tree-view/project.json +++ b/libs/vscode/tree-view/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/tree-view/**/*.ts"] diff --git a/libs/vscode/tree-view/src/lib/idl-tree-view-provider.ts b/libs/vscode/tree-view/src/lib/idl-tree-view-provider.ts index ac5e5affe..061059566 100644 --- a/libs/vscode/tree-view/src/lib/idl-tree-view-provider.ts +++ b/libs/vscode/tree-view/src/lib/idl-tree-view-provider.ts @@ -114,7 +114,7 @@ export class IDLTreeViewProvider implements vscode.TreeDataProvider { IDL_TRANSLATION.idl.tree.parents.debugging, '', vscode.TreeItemCollapsibleState.Expanded, - 'assessment.svg', + 'idlicon.svg', '' ); this.tree[IDL_TRANSLATION.idl.tree.parents.debugging] = diff --git a/libs/vscode/tree-view/src/lib/trees/notebook-actions.tree.interface.ts b/libs/vscode/tree-view/src/lib/trees/notebook-actions.tree.interface.ts index 25c5edc72..2b8425ce9 100644 --- a/libs/vscode/tree-view/src/lib/trees/notebook-actions.tree.interface.ts +++ b/libs/vscode/tree-view/src/lib/trees/notebook-actions.tree.interface.ts @@ -8,6 +8,20 @@ import { IChild } from '../idl-tree-view.interface'; * Buttons for our code actions */ export const NOTEBOOK_ACTIONS: IChild[] = [ + { + name: IDL_TRANSLATION.idl.tree.children.notebooks.newNotebook.name, + description: + IDL_TRANSLATION.idl.tree.children.notebooks.newNotebook.description, + icon: 'add-box.svg', + commandName: IDL_COMMANDS.NOTEBOOKS.NEW_NOTEBOOK, + }, + { + name: IDL_TRANSLATION.idl.tree.children.notebooks.notebookToProCode.name, + description: + IDL_TRANSLATION.idl.tree.children.notebooks.notebookToProCode.description, + icon: 'transform.svg', + commandName: IDL_COMMANDS.NOTEBOOKS.NOTEBOOK_TO_PRO_CODE, + }, { name: IDL_TRANSLATION.idl.tree.children.notebooks.formatNotebooks.name, description: @@ -19,14 +33,14 @@ export const NOTEBOOK_ACTIONS: IChild[] = [ name: IDL_TRANSLATION.idl.tree.children.notebooks.openIDLExample.name, description: IDL_TRANSLATION.idl.tree.children.notebooks.openIDLExample.description, - icon: 'idlicon.png', + icon: 'idlicon.svg', commandName: IDL_COMMANDS.NOTEBOOKS.OPEN_IDL_EXAMPLE, }, - // { - // name: IDL_TRANSLATION.idl.tree.children.notebooks.openENVIExample.name, - // description: - // IDL_TRANSLATION.idl.tree.children.notebooks.openENVIExample.description, - // icon: 'idlicon.png', - // commandName: VSCODE_COMMANDS.FORMAT_NOTEBOOK, - // }, + { + name: IDL_TRANSLATION.idl.tree.children.notebooks.openENVIExample.name, + description: + IDL_TRANSLATION.idl.tree.children.notebooks.openENVIExample.description, + icon: 'enviicon.svg', + commandName: IDL_COMMANDS.NOTEBOOKS.OPEN_ENVI_EXAMPLE, + }, ]; diff --git a/libs/vscode/webview-shared/project.json b/libs/vscode/webview-shared/project.json index 67f21a120..ab634dbd3 100644 --- a/libs/vscode/webview-shared/project.json +++ b/libs/vscode/webview-shared/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/webview-shared/**/*.ts"] diff --git a/libs/vscode/webview/project.json b/libs/vscode/webview/project.json index 8c233216d..6de215eea 100644 --- a/libs/vscode/webview/project.json +++ b/libs/vscode/webview/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/vscode/webview/**/*.ts"] diff --git a/libs/workers/parsing/project.json b/libs/workers/parsing/project.json index c1b3e421a..9ab615e4e 100644 --- a/libs/workers/parsing/project.json +++ b/libs/workers/parsing/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/workers/parsing/**/*.ts"] diff --git a/libs/workers/vscode/project.json b/libs/workers/vscode/project.json index 1f7159d5d..fc1b4ee03 100644 --- a/libs/workers/vscode/project.json +++ b/libs/workers/vscode/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/workers/vscode/**/*.ts"] diff --git a/libs/workers/workerio/project.json b/libs/workers/workerio/project.json index 3983ae9a9..6ce3459f6 100644 --- a/libs/workers/workerio/project.json +++ b/libs/workers/workerio/project.json @@ -5,7 +5,7 @@ "projectType": "library", "targets": { "lint": { - "executor": "@nx/linter:eslint", + "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], "options": { "lintFilePatterns": ["libs/workers/workerio/**/*.ts"] diff --git a/nx.json b/nx.json index b04640867..c7d11bdc8 100644 --- a/nx.json +++ b/nx.json @@ -1,17 +1,7 @@ { - "npmScope": "idl", "affected": { "defaultBase": "main" }, - "tasksRunnerOptions": { - "default": { - "runner": "nx/tasks-runners/default", - "options": { - "cacheableOperations": ["build", "lint", "test", "e2e"], - "parallel": 1 - } - } - }, "cli": { "packageManager": "npm" }, @@ -52,16 +42,20 @@ "targetDefaults": { "build": { "dependsOn": ["^build"], - "inputs": ["production", "^production"] + "inputs": ["production", "^production"], + "cache": true }, "e2e": { - "inputs": ["default", "^production"] + "inputs": ["default", "^production"], + "cache": true }, "test": { - "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"] + "inputs": ["default", "^production", "{workspaceRoot}/jest.preset.js"], + "cache": true }, "lint": { - "inputs": ["default", "{workspaceRoot}/.eslintrc.json"] + "inputs": ["default", "{workspaceRoot}/.eslintrc.json"], + "cache": true } }, "namedInputs": { @@ -75,5 +69,6 @@ "!{projectRoot}/.eslintrc.json", "!{projectRoot}/src/test-setup.[jt]s" ] - } + }, + "parallel": 1 } diff --git a/package-lock.json b/package-lock.json index d1dde99c4..104309039 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,20 +1,20 @@ { "name": "idl-for-vscode", - "version": "3.2.4", + "version": "4.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "idl-for-vscode", - "version": "3.2.4", + "version": "4.0.0", "license": "MIT", "dependencies": { - "@analytics-debugger/ga4mp": "^0.0.8", - "@vscode/debugadapter": "^1.63.0", - "@vscode/debugprotocol": "^1.63.0", + "@vscode/debugadapter": "^1.64.0", + "@vscode/debugprotocol": "^1.64.0", "ajv": "^8.11.2", "ansi-styles": "^6.1.0", "await-notify": "^1.0.1", + "case-anything": "^2.1.13", "chalk": "^4.1.2", "compare-versions": "^6.1.0", "deepmerge": "^4.2.2", @@ -27,11 +27,11 @@ "nanoid": "^3.3.4", "rxjs": "~6.6.0", "tslib": "^2.3.0", - "vscode-languageclient": "^9.0.0", - "vscode-languageserver": "^9.0.0", - "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-textdocument": "^1.0.11", "vscode-textmate": "^9.0.0", - "vscode-uri": "^3.0.3", + "vscode-uri": "^3.0.8", "zone.js": "0.13.0" }, "devDependencies": { @@ -55,47 +55,47 @@ "@angular/platform-browser": "16.2.6", "@angular/platform-browser-dynamic": "16.2.6", "@angular/router": "16.2.6", - "@deck.gl/core": "^8.9.30", - "@deck.gl/geo-layers": "^8.9.30", - "@deck.gl/layers": "^8.9.30", - "@deck.gl/mesh-layers": "^8.9.30", + "@deck.gl/core": "^8.9.32", + "@deck.gl/geo-layers": "^8.9.32", + "@deck.gl/layers": "^8.9.32", + "@deck.gl/mesh-layers": "^8.9.32", "@mapbox/geojson-extent": "^1.0.1", - "@mdi/js": "^7.0.96", + "@mdi/js": "^7.3.67", "@ngbracket/ngx-layout": "^16.1.3", "@ngneat/transloco": "^4.3.0", - "@nx/angular": "16.8.1", - "@nx/cypress": "16.8.1", - "@nx/esbuild": "16.8.1", - "@nx/eslint-plugin": "16.8.1", - "@nx/jest": "16.8.1", - "@nx/js": "16.8.1", - "@nx/linter": "16.8.1", - "@nx/node": "16.8.1", - "@nx/web": "16.8.1", - "@nx/workspace": "16.8.1", + "@nx/angular": "17.0.2", + "@nx/cypress": "17.0.2", + "@nx/esbuild": "17.0.2", + "@nx/eslint": "17.0.2", + "@nx/eslint-plugin": "17.0.2", + "@nx/jest": "17.0.2", + "@nx/js": "17.0.2", + "@nx/node": "17.0.2", + "@nx/web": "17.0.2", + "@nx/workspace": "17.0.2", "@schematics/angular": "16.2.3", "@types/jest": "29.4.4", - "@types/mapbox__geojson-extent": "^1.0.0", - "@types/minilog": "^2.0.29", + "@types/mapbox__geojson-extent": "^1.0.2", + "@types/minilog": "^2.0.31", "@types/node": "^20.2.3", - "@types/plist": "^3.0.2", - "@types/progress": "^2.0.5", + "@types/plist": "^3.0.4", + "@types/progress": "^2.0.6", "@types/vscode": "^1.82.0", "@types/vscode-notebook-renderer": "^1.72.0", - "@types/web": "^0.0.115", + "@types/web": "^0.0.119", "@typescript-eslint/eslint-plugin": "5.60.1", "@typescript-eslint/parser": "5.60.1", - "@vscode/test-electron": "^2.3.4", - "@vscode/vsce": "^2.21.0", + "@vscode/test-electron": "^2.3.6", + "@vscode/vsce": "2.21", "@vscode/webview-ui-toolkit": "^1.2.0", "@webcomponents/webcomponentsjs": "^2.8.0", - "angular-material-css-vars": "^5.0.2", + "angular-material-css-vars": "^5.0.3", "axios": "^1.5.0", "chart.js": "^4.4.0", "cypress": "^13.0.0", "esbuild": "0.19.2", "eslint": "8.46.0", - "eslint-config-prettier": "8.1.0", + "eslint-config-prettier": "9.0.0", "eslint-plugin-cypress": "2.13.4", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-unused-imports": "^2.0.0", @@ -106,20 +106,20 @@ "jest-environment-node": "^29.4.1", "jest-preset-angular": "13.1.1", "json-stringify-pretty-compact": "^3.0.0", - "material-icons": "^1.13.11", + "material-icons": "^1.13.12", "node-html-markdown": "^1.2.0", "npm-run-all": "^4.1.5", - "nx": "16.8.1", + "nx": "17.0.2", "plist": "^3.0.6", "prettier": "2.7.1", "progress": "^2.0.3", - "rimraf": "^5.0.0", + "rimraf": "^5.0.5", "terser-webpack-plugin": "^5.3.1", "ts-jest": "29.1.0", "ts-node": "10.9.1", "typescript": "5.1.6", "vscode-oniguruma": "^2.0.1", - "yaml": "^2.3.1" + "yaml": "^2.3.3" }, "engines": { "node": ">=18.12.1", @@ -149,6 +149,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -157,26 +158,6 @@ "node": ">=6.0.0" } }, - "node_modules/@analytics-debugger/ga4mp": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@analytics-debugger/ga4mp/-/ga4mp-0.0.8.tgz", - "integrity": "sha512-KAAUhakcw6TGFtU5YrmrJESR3OYHWkDs4sZnxGQUxee9bamfDQQtRogK+TFxW4KzbNkR2K1DvIB5kvbXvoEANA==", - "dependencies": { - "@babel/core": "^7.20.5", - "@babel/plugin-transform-object-assign": "^7.18.6", - "@babel/preset-env": "^7.20.2", - "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-terser": "^0.2.0", - "rollup": "^3.7.1", - "rollup-plugin-license": "^3.0.1" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/thyngster" - } - }, "node_modules/@angular-devkit/architect": { "version": "0.1602.3", "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.3.tgz", @@ -1404,6 +1385,7 @@ "version": "7.22.13", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, "dependencies": { "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" @@ -1416,6 +1398,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1427,6 +1410,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1440,6 +1424,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -1448,6 +1433,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -1456,6 +1442,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1467,6 +1454,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1475,6 +1463,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.20.tgz", "integrity": "sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==", + "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.13", @@ -1504,6 +1493,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", @@ -1518,6 +1508,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1531,6 +1522,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1554,6 +1546,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1565,6 +1558,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -1576,6 +1570,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.15", @@ -1591,6 +1586,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1599,6 +1595,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.5", @@ -1621,6 +1618,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1629,6 +1627,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", @@ -1645,6 +1644,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -1653,6 +1653,7 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -1668,17 +1669,33 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1688,6 +1705,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1699,6 +1717,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -1710,6 +1729,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.15" }, @@ -1721,6 +1741,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.20.tgz", "integrity": "sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -1739,6 +1760,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1750,6 +1772,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1758,6 +1781,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -1774,6 +1798,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-member-expression-to-functions": "^7.22.15", @@ -1790,6 +1815,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1801,6 +1827,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1812,6 +1839,7 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1823,6 +1851,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1831,6 +1860,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1839,6 +1869,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1847,6 +1878,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", "@babel/template": "^7.22.15", @@ -1860,6 +1892,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1873,6 +1906,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/traverse": "^7.22.15", @@ -1886,6 +1920,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", "@babel/parser": "^7.22.15", @@ -1899,6 +1934,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -1912,6 +1948,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -1923,6 +1960,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -1936,6 +1974,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, "engines": { "node": ">=0.8.0" } @@ -1944,6 +1983,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "engines": { "node": ">=4" } @@ -1952,6 +1992,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -1960,9 +2001,10 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.16", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", - "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1974,6 +2016,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1988,6 +2031,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -2019,23 +2063,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz", @@ -2059,6 +2086,7 @@ "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, "engines": { "node": ">=6.9.0" }, @@ -2087,6 +2115,7 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2110,6 +2139,7 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -2121,6 +2151,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2150,6 +2181,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2161,6 +2193,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -2172,6 +2205,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2186,6 +2220,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2200,6 +2235,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2211,6 +2247,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2237,6 +2274,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2248,6 +2286,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2259,6 +2298,7 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -2270,6 +2310,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2281,6 +2322,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2292,6 +2334,7 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -2303,6 +2346,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2317,6 +2361,7 @@ "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -2346,6 +2391,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -2361,6 +2407,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2375,6 +2422,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", + "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -2392,6 +2440,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", @@ -2408,6 +2457,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2422,6 +2472,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2436,6 +2487,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2451,6 +2503,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", @@ -2467,6 +2520,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.22.15", @@ -2489,6 +2543,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/template": "^7.22.5" @@ -2504,6 +2559,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2518,6 +2574,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2533,6 +2590,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2547,6 +2605,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -2562,6 +2621,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2577,6 +2637,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -2592,6 +2653,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2606,6 +2668,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.5", "@babel/helper-function-name": "^7.22.5", @@ -2622,6 +2685,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -2637,6 +2701,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2651,6 +2716,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -2666,6 +2732,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2680,6 +2747,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2695,6 +2763,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", @@ -2711,6 +2780,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", + "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-module-transforms": "^7.22.9", @@ -2728,6 +2798,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2743,6 +2814,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2758,6 +2830,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2772,6 +2845,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -2787,6 +2861,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -2798,24 +2873,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.22.5.tgz", - "integrity": "sha512-iDhx9ARkXq4vhZ2CYOSnQXkmxkDgosLi3J8Z17mKz7LyzthtkdVchLD7WZ3aXeCuvJDOW3+1I5TpJmwIbF9MKQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", "@babel/helper-compilation-targets": "^7.22.15", @@ -2834,6 +2896,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.5" @@ -2849,6 +2912,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -2864,6 +2928,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", @@ -2880,6 +2945,7 @@ "version": "7.22.15", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2894,6 +2960,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -2909,6 +2976,7 @@ "version": "7.22.11", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-create-class-features-plugin": "^7.22.11", @@ -2926,6 +2994,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2940,6 +3009,7 @@ "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "regenerator-transform": "^0.15.2" @@ -2955,6 +3025,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -2998,6 +3069,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3012,6 +3084,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" @@ -3027,6 +3100,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3041,6 +3115,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3055,6 +3130,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3087,6 +3163,7 @@ "version": "7.22.10", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -3101,6 +3178,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -3116,6 +3194,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -3131,6 +3210,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" @@ -3146,6 +3226,7 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.20", "@babel/helper-compilation-targets": "^7.22.15", @@ -3239,6 +3320,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -3247,6 +3329,7 @@ "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", @@ -3278,12 +3361,14 @@ "node_modules/@babel/regjsgen": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true }, "node_modules/@babel/runtime": { "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -3295,6 +3380,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", @@ -3305,18 +3391,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.20.tgz", - "integrity": "sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", + "@babel/generator": "^7.23.0", "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.22.5", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.16", - "@babel/types": "^7.22.19", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -3325,11 +3412,12 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.0", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -3339,12 +3427,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.19", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz", - "integrity": "sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.19", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3461,9 +3550,9 @@ } }, "node_modules/@deck.gl/core": { - "version": "8.9.30", - "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.9.30.tgz", - "integrity": "sha512-cgaqJ25IxKVtQ7zapICF6WedAy4Lh0Kv9rX40lqgc5zfYFH/QdB0JkGB6CzHMpCSp+vO5uDSh6lfu+2Q0oAlcA==", + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-8.9.32.tgz", + "integrity": "sha512-LQA2wPYxuWqZyxrlFZMsLOr3tBHdOFXMMVz4wBNATCyObbc9THly8FgW2N48tHT6OY2fM2N5wmbw9uRLsCg1kw==", "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", @@ -3484,9 +3573,9 @@ } }, "node_modules/@deck.gl/extensions": { - "version": "8.9.30", - "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-8.9.30.tgz", - "integrity": "sha512-OTECUkSx8KLltuvpp3iSrqwx8fWTJijKT/0i0c4cvTyb6AWztimZVZs2BF587Rl9mvehP5mV+OjlUfU5gm6RQA==", + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-8.9.32.tgz", + "integrity": "sha512-v2ALtHRnIj8F4MA6jwDq+rqZIl/1gU2d+kA9+MgLMiO2GW4o+IcR8IuCfL/wXe2e10Wjhmc7LlhpVc13ljOWlw==", "dev": true, "peer": true, "dependencies": { @@ -3503,9 +3592,9 @@ } }, "node_modules/@deck.gl/geo-layers": { - "version": "8.9.30", - "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-8.9.30.tgz", - "integrity": "sha512-1uVMJn9pBhfeMmpJq/AtfIFM6b2wvAL6bxkxgYhHlNUgYwPYL8BLLLhNRJJvEGZgO5N8XJ5p+4OYaDmgja96Xg==", + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-8.9.32.tgz", + "integrity": "sha512-yJe96Z47qhdvnkN0u2DkDIAS2SGBS9XxWWT06lQpRIJnJl8PXStcHK0rvcZgdfMBW8INtcAfF8LnkEhqzbWnAQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", @@ -3536,9 +3625,9 @@ } }, "node_modules/@deck.gl/layers": { - "version": "8.9.30", - "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-8.9.30.tgz", - "integrity": "sha512-qz12cAyMF0/G1Fom0XdxdHbx58etrTpZ7bnL9ofHUjgUbMa7LHf28gjVxZ0kZ+jNLvX1TNtzOUSSw05g2D0wNQ==", + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-8.9.32.tgz", + "integrity": "sha512-UuUBbRvBnL42pG70YY12YLspl6t/OacP4f/E3Ty0lliXe0m/5jJFW+moubsz3goBV0adMI+CQf57cdlqlfQ4AQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", @@ -3558,9 +3647,9 @@ } }, "node_modules/@deck.gl/mesh-layers": { - "version": "8.9.30", - "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-8.9.30.tgz", - "integrity": "sha512-KjoTXqD3WiMUi1WXGD9jF/Hy1M+au6SR6IishhWtlNoraugcRp3nHJhcuo6sIKNLETnFMLDtP2xWwzwAu0LuPg==", + "version": "8.9.32", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-8.9.32.tgz", + "integrity": "sha512-6bsy54PrBHjZriEe3Rf1iBVAI8Afy3L1qAXqKemxYaH56rc5EYlrmD0E/zKcACikIRFmE7bgQz/i6hlSt7dBHg==", "dev": true, "dependencies": { "@babel/runtime": "^7.0.0", @@ -4532,6 +4621,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -4545,6 +4635,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -4553,6 +4644,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -4561,6 +4653,7 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -4569,12 +4662,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -5869,9 +5964,9 @@ } }, "node_modules/@mdi/js": { - "version": "7.2.96", - "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.2.96.tgz", - "integrity": "sha512-paR9M9ZT7rKbh2boksNUynuSZMHhqRYnEZOm/KrZTjQ4/FzyhjLHuvw/8XYzP+E7fS4+/Ms/82EN1pl/OFsiIA==", + "version": "7.3.67", + "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz", + "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw==", "dev": true }, "node_modules/@microsoft/fast-element": { @@ -6153,94 +6248,85 @@ } }, "node_modules/@nrwl/angular": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/angular/-/angular-16.8.1.tgz", - "integrity": "sha512-aMHFxbbK+ukFfVaipaIlmiZGF8m1jUDMw4pZKB1VIk4GaAnbvimaKiBBf9rX/FDsleV1gERqBlQoweeU6SPJSA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/angular/-/angular-17.0.2.tgz", + "integrity": "sha512-GheVvG6IiOWfJySLvJY8JMf+O9vaM5KDn4eWaFvT5Vx41UCk1/h36ePlWiOA5Is9wboKCBbijzc9TgW/F3QkiA==", "dev": true, "dependencies": { - "@nx/angular": "16.8.1", + "@nx/angular": "17.0.2", "tslib": "^2.3.0" } }, "node_modules/@nrwl/cypress": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-16.8.1.tgz", - "integrity": "sha512-set8MUV6b1QpHCSqQ4It01BM9u6hf0e6s02DZdi/1OW3h/JYo5kqcLrYQra3AKCIimGByXdoHtCUjyFT0pMrdg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/cypress/-/cypress-17.0.2.tgz", + "integrity": "sha512-lV3JCBtB7QZXIp3BDmnDbtUDTYt9LHgUePoEG1ohO7D+J71hsx4s8iRo6lOr+HxemlxdBmhSLJlqMTKZv4B1iQ==", "dev": true, "dependencies": { - "@nx/cypress": "16.8.1" + "@nx/cypress": "17.0.2" } }, "node_modules/@nrwl/devkit": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.8.1.tgz", - "integrity": "sha512-Y7yYDh62Hi4q99Q4+ipIQ3K9iLuAld3WcwjLv6vtl6Livu+TU3eqbraBEno7DQL8JuIuwgBT4lX7Bp3w3N9RDg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-17.0.2.tgz", + "integrity": "sha512-zgqTFYmvs80D3T/TwmR/EBdV1OU2c96YYHngAe3DX8kXhjlV3dq+VPZVBROM0AzYLGaSckW3mHBhgL+JrDp5Pg==", "dev": true, "dependencies": { - "@nx/devkit": "16.8.1" + "@nx/devkit": "17.0.2" } }, "node_modules/@nrwl/esbuild": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/esbuild/-/esbuild-16.8.1.tgz", - "integrity": "sha512-dzvnErSGawDDitrahiZdMkE+bSXDsMzxqpVsBP7ZwcARcnclV2rhWM+xAmXjGNPTItzfHo/knL5Fk/tFemSk6A==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/esbuild/-/esbuild-17.0.2.tgz", + "integrity": "sha512-DUrxLcfLYakRBS1eU7WPadcipStmFUOMRxvjQnb1fqUV7eCeQGoR0Pc5WVBYAtl5LVaTLdNgXK7DR0+/D1eHtw==", "dev": true, "dependencies": { - "@nx/esbuild": "16.8.1" + "@nx/esbuild": "17.0.2" } }, "node_modules/@nrwl/eslint-plugin-nx": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.8.1.tgz", - "integrity": "sha512-Vdy+XGQAbDE76ovWis3Bg/bWlsozcfBXIXK8OiAEQfjyqceWXtH6B2EFTVU0GiHNDydpZR9ahcGJDAuoKDOo3A==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-17.0.2.tgz", + "integrity": "sha512-kVsyHqaFgWPgCk7C+aimctq1MNnmqQEqCwmB/EC7kPYWPLvF5l7JqlTrDZAmIaCDBKIUUqJsZLO9d46vT5Z9xw==", "dev": true, "dependencies": { - "@nx/eslint-plugin": "16.8.1" + "@nx/eslint-plugin": "17.0.2" } }, "node_modules/@nrwl/jest": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-16.8.1.tgz", - "integrity": "sha512-shOjtGwGRktUzCUwIIxzW/z5QaoGsYaEF1ihCVA10zai3XsNLkkPPfyEO85RegAu/RGk78PRXTOXdZaJNbraTw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-17.0.2.tgz", + "integrity": "sha512-917A/kc3OvwZxi6f5LByp5/j1cByARc7t1yQx+qHW4vl4wtMPcK1Pcl619tLb+DURI/z5Zz9MQvSsdzr4F6ZWg==", "dev": true, "dependencies": { - "@nx/jest": "16.8.1" + "@nx/jest": "17.0.2" } }, "node_modules/@nrwl/js": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-16.8.1.tgz", - "integrity": "sha512-I5kCtk0TUvcvJXnD6fbOI1+L4EBHbSZCXVCkv3eXKOeAj0cJ6cOt2g6S7DpWPf2P7zTq22XOPNJy3C8u9tCbgQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-17.0.2.tgz", + "integrity": "sha512-qHqZ6V6IP3piyzb9s7HUlcV3X2O/BDmqikg0yoZGitRpyugY5K1BNZITGRmFEzLklfHxVUqI1qsURnClgax+pA==", "dev": true, "dependencies": { - "@nx/js": "16.8.1" - } - }, - "node_modules/@nrwl/linter": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/linter/-/linter-16.8.1.tgz", - "integrity": "sha512-o7DhyvNk7qXG8qdhivEd4kYw1XGqOPlXHgDBJJHeL5ASN2HWl5EBclCvKJmoci1xIJGw/9q+mJxc1/mL8Zq3dQ==", - "dev": true, - "dependencies": { - "@nx/linter": "16.8.1" + "@nx/js": "17.0.2" } }, "node_modules/@nrwl/node": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/node/-/node-16.8.1.tgz", - "integrity": "sha512-d2L3pBkHqPHFsn13H7P/dNETTnTRGygLMoeYwcjC0+8C8Hwc1QCYIiKdPsZMEfwClj5K0evFRbpCLSPedwd5OQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/node/-/node-17.0.2.tgz", + "integrity": "sha512-G7nOcwnSV+fP/WahBo6Rl9q6uelFeCSHP5sm9UcPhMFb0TC8UeFMK4XkrqW4HA+tyHMeHzNZ92De31wHMfVfgg==", "dev": true, "dependencies": { - "@nx/node": "16.8.1" + "@nx/node": "17.0.2" } }, "node_modules/@nrwl/tao": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.8.1.tgz", - "integrity": "sha512-hgGFLyEgONSofxnJsXN9NlUx4J8/YSLUkfZKdR8Qa97+JGZT8FEuk7NLFJOWdYYqROoCzXLHK0d+twFFNPS5BQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-17.0.2.tgz", + "integrity": "sha512-H+htIRzQR6Ibael34rhQkpNkpFFFmaSTsIzdqkBqL4j5+FzSpZh67NJnWSY8vsYQGQL8Ncc+MHvpQC+7pyfgGw==", "dev": true, "dependencies": { - "nx": "16.8.1", + "nx": "17.0.2", "tslib": "^2.3.0" }, "bin": { @@ -6248,46 +6334,47 @@ } }, "node_modules/@nrwl/web": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-16.8.1.tgz", - "integrity": "sha512-GgpAt0OsnEzz+0rVtiPdO911AKvBtljP2hcVlhReQRohBeZ3F472uYVPq/OF/G+ELZU4toXgIuGr2Ggfd6XM8g==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/web/-/web-17.0.2.tgz", + "integrity": "sha512-+kSGZ0DOEl6MoWmfCtxcDlmZV/+mqY+pGS+qSB3kZGwfRkpwbv1spAPcYyfUB2wNed9js/lSRGt9sBcwWcIY0Q==", "dev": true, "dependencies": { - "@nx/web": "16.8.1" + "@nx/web": "17.0.2" } }, "node_modules/@nrwl/webpack": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-16.8.1.tgz", - "integrity": "sha512-z4Np2OzIICL/hMYkC1wI9vEaTdaP1nTaovWBMPw2Y+TG2RLdpFEV4YZkd/q1YI53twp6WQZhsKXSdtN2dg3pvQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/webpack/-/webpack-17.0.2.tgz", + "integrity": "sha512-5Kx9drlEGchWDlE8x7uxRIqZEzm8TZll07NUTm++wKWukHhCZZksqojRQkRLq28iO2BFQm12boa78Ku0u3Ob4g==", "dev": true, "dependencies": { - "@nx/webpack": "16.8.1" + "@nx/webpack": "17.0.2" } }, "node_modules/@nrwl/workspace": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-16.8.1.tgz", - "integrity": "sha512-KFxcUoOfzCEc5Krq3h+EC6kOYHCwuSPyc2v1fWvTgP7a91uw5NPsMKGt4l0QXElkX3/qbBvjex6fJOcjf+odYQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-17.0.2.tgz", + "integrity": "sha512-ntX+cE6Gs1MOdG027MHkueyEze4yNbRy54uXhWhOCUy5gcP4eNmsrxOOccajP7tVrvAW83wrp9PXJ1wQhNWOYA==", "dev": true, "dependencies": { - "@nx/workspace": "16.8.1" + "@nx/workspace": "17.0.2" } }, "node_modules/@nx/angular": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-16.8.1.tgz", - "integrity": "sha512-jd9otEgcHiCXcdAcxk1IYYs2gFPxyuhFt2/A+qjHxktGmMJ8xfrEkW4W4JInn4TPm1auBD5y6u9ECgalWuebZw==", - "dev": true, - "dependencies": { - "@nrwl/angular": "16.8.1", - "@nx/cypress": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/jest": "16.8.1", - "@nx/js": "16.8.1", - "@nx/linter": "16.8.1", - "@nx/webpack": "16.8.1", - "@nx/workspace": "16.8.1", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/angular/-/angular-17.0.2.tgz", + "integrity": "sha512-I3C9ImpFYChIVWrXLI2cZy1uiJ6zzoHTDd+y1tuhWF+OWMoeCi/iVKyk4DWucdU2AUlpgfJWRVWqCQcMR32U1Q==", + "dev": true, + "dependencies": { + "@nrwl/angular": "17.0.2", + "@nx/cypress": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/eslint": "17.0.2", + "@nx/jest": "17.0.2", + "@nx/js": "17.0.2", + "@nx/web": "17.0.2", + "@nx/webpack": "17.0.2", + "@nx/workspace": "17.0.2", "@phenomnomnominal/tsquery": "~5.0.1", "@typescript-eslint/type-utils": "^5.36.1", "chalk": "^4.1.0", @@ -6365,15 +6452,15 @@ "dev": true }, "node_modules/@nx/cypress": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-16.8.1.tgz", - "integrity": "sha512-Yao0YWb0PVyAKDWXKjHsLjwuULx7GPUsoAuz8qr990YeKDuhqFKOPmSPSv8a8VAOo7yltCWuBmzvL1X8xF2amQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/cypress/-/cypress-17.0.2.tgz", + "integrity": "sha512-lkdhz6CHaLA/ZhNnqwXBp4Mlg1eTtCO09pYYHMx43D7EPObO1XbYtm6rivWg6kDzEmz84+Jwo0RucK7loMlHqA==", "dev": true, "dependencies": { - "@nrwl/cypress": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", - "@nx/linter": "16.8.1", + "@nrwl/cypress": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/eslint": "17.0.2", + "@nx/js": "17.0.2", "@phenomnomnominal/tsquery": "~5.0.1", "detect-port": "^1.5.1", "semver": "7.5.3", @@ -6422,12 +6509,12 @@ "dev": true }, "node_modules/@nx/devkit": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.8.1.tgz", - "integrity": "sha512-I+Cg+lXk0wRz6KC9FZbWFuJWQTXAt5O3bNl9ksISmzqmEyuy72Cv+/MBHvF7o54Sq80DNw+RKWB1re5HFOsqCA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-17.0.2.tgz", + "integrity": "sha512-gtJNrFtGZa96qAM4ijAvoCLj/LuUr+Jq91QITsYE4cvYL0qan4zGcAOBMclzpaXVN9pwpko+veDwHwnmp/SXTg==", "dev": true, "dependencies": { - "@nrwl/devkit": "16.8.1", + "@nrwl/devkit": "17.0.2", "ejs": "^3.1.7", "enquirer": "~2.3.6", "ignore": "^5.0.4", @@ -6436,7 +6523,7 @@ "tslib": "^2.3.0" }, "peerDependencies": { - "nx": ">= 15 <= 17" + "nx": ">= 16 <= 18" } }, "node_modules/@nx/devkit/node_modules/enquirer": { @@ -6485,14 +6572,14 @@ "dev": true }, "node_modules/@nx/esbuild": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-16.8.1.tgz", - "integrity": "sha512-YFURge1u8v2iyXvED9oTJVTzx0iB016JGvuIgaGvicT4bQ+KHZ/d54EQ6vI2qzyh6zWBeJSKCEwIWlYxEW1jFA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/esbuild/-/esbuild-17.0.2.tgz", + "integrity": "sha512-mKs2j0PGQy5z8t21Zw56OT1Inrfxcr7oULL5pAuxlbdH+bkPaqaWV3ba3uM5wm4uLMZIsRyMPwcQwXYrcwVSww==", "dev": true, "dependencies": { - "@nrwl/esbuild": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", + "@nrwl/esbuild": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", "chalk": "^4.1.0", "fast-glob": "3.2.7", "fs-extra": "^11.1.0", @@ -6524,15 +6611,36 @@ "node": ">=8" } }, + "node_modules/@nx/eslint": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/eslint/-/eslint-17.0.2.tgz", + "integrity": "sha512-mZXavg/m+A0GqmWORq5jNRt7ku0q9OoX2212ldivvLYI1zHHr2VFYoRxhS+NzaZBK5/EiKs/5P8dHhYb4/v7Bw==", + "dev": true, + "dependencies": { + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", + "@nx/linter": "17.0.2", + "tslib": "^2.3.0", + "typescript": "~5.1.3" + }, + "peerDependencies": { + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, "node_modules/@nx/eslint-plugin": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-16.8.1.tgz", - "integrity": "sha512-UhOtC1zeGytfMtsVSa3r3FbUIUtXLjtvBtZvr/vr8Ff1QSMVfTYwhVOqctYsBVYDpJonwyz3vm95SOHbBlSw6A==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-17.0.2.tgz", + "integrity": "sha512-ZI/vthG7wYG9+xA3inYnJ+XP8itMlZpIYT63SZm4h05MRYQG4MkShkrOkSWYBtT2j5b1AgSzSemkpCGuG798pQ==", "dev": true, "dependencies": { - "@nrwl/eslint-plugin-nx": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", + "@nrwl/eslint-plugin-nx": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", "@typescript-eslint/type-utils": "^5.60.1", "@typescript-eslint/utils": "^5.60.1", "chalk": "^4.1.0", @@ -6543,7 +6651,7 @@ }, "peerDependencies": { "@typescript-eslint/parser": "^5.60.1", - "eslint-config-prettier": "^8.1.0" + "eslint-config-prettier": "^9.0.0" }, "peerDependenciesMeta": { "eslint-config-prettier": { @@ -6734,16 +6842,16 @@ "dev": true }, "node_modules/@nx/jest": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-16.8.1.tgz", - "integrity": "sha512-/EoJehHiOnRDKTi96Q9mTKt+kIcQSzwMLmWdZYvhdvpTdCjK51ElwK8W3Lt4HdXp4C45gfihLE3jJlJ8q4/5aA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/jest/-/jest-17.0.2.tgz", + "integrity": "sha512-kpkziUOZpKsVvi5iicirX4EVwfKXaGuiv5bgzj1uiexD83tlds5ne8J2qN/K1ea5jIC+bxHzqJF5s7rF52T0cg==", "dev": true, "dependencies": { "@jest/reporters": "^29.4.1", "@jest/test-result": "^29.4.1", - "@nrwl/jest": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", + "@nrwl/jest": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", "@phenomnomnominal/tsquery": "~5.0.1", "chalk": "^4.1.0", "identity-obj-proxy": "3.0.0", @@ -6755,32 +6863,35 @@ } }, "node_modules/@nx/js": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-16.8.1.tgz", - "integrity": "sha512-SznU6GH/yxj2ro1pgUWDSaoiSiP7UgxMvb2qlyhU1iRB9sdOBhduzVq6+yTgrje2sVSnAWSGbWiQaYkxFLaKWw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/js/-/js-17.0.2.tgz", + "integrity": "sha512-dYvWDd0jwNF4h4V8yjd1ZMSJ38GcpvwrDUVYGYNkZmDqYzkBvqykpY00hRLUYZspiR+iG7uWmyxItZYpCk0WyA==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", - "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-decorators": "^7.22.7", "@babel/plugin-transform-runtime": "^7.22.9", "@babel/preset-env": "^7.22.9", "@babel/preset-typescript": "^7.22.5", "@babel/runtime": "^7.22.6", - "@nrwl/js": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/workspace": "16.8.1", + "@nrwl/js": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/workspace": "17.0.2", "@phenomnomnominal/tsquery": "~5.0.1", "babel-plugin-const-enum": "^1.0.1", "babel-plugin-macros": "^2.8.0", "babel-plugin-transform-typescript-metadata": "^0.3.1", "chalk": "^4.1.0", + "columnify": "^1.6.0", "detect-port": "^1.5.1", "fast-glob": "3.2.7", "fs-extra": "^11.1.0", "ignore": "^5.0.4", "js-tokens": "^4.0.0", "minimatch": "3.0.5", + "npm-package-arg": "11.0.1", + "npm-run-path": "^4.0.1", + "ora": "5.3.0", "semver": "7.5.3", "source-map-support": "0.5.19", "ts-node": "10.9.1", @@ -6812,6 +6923,27 @@ "node": ">=8" } }, + "node_modules/@nx/js/node_modules/hosted-git-info": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.1.tgz", + "integrity": "sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/@nx/js/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6824,6 +6956,43 @@ "node": ">=10" } }, + "node_modules/@nx/js/node_modules/npm-package-arg": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.1.tgz", + "integrity": "sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@nx/js/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@nx/js/node_modules/semver": { "version": "7.5.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", @@ -6865,47 +7034,32 @@ "dev": true }, "node_modules/@nx/linter": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-16.8.1.tgz", - "integrity": "sha512-I4DVpLpolj9vpiKsU2Pe93tTBGd2efyPcyhX2sltITED9H6P/WuEqe9WR1sJomxVq7D6uQYhrUjARBMeMZWxtw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/linter/-/linter-17.0.2.tgz", + "integrity": "sha512-cXCrx/qcZc53GKqOLRIPTqACdby9/plOpfQlo0BlHMOrwvkkKjzXsnoJgR6XRWdegDKVkqUWHWDAjDI3/aMshA==", "dev": true, "dependencies": { - "@nrwl/linter": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", - "@phenomnomnominal/tsquery": "~5.0.1", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "typescript": "~5.1.3" - }, - "peerDependencies": { - "eslint": "^8.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "@nx/eslint": "17.0.2" } }, "node_modules/@nx/node": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/node/-/node-16.8.1.tgz", - "integrity": "sha512-ZCUJ7iSxTuAhe4zNZa344u+xqet3UI2mseXk6+N60GNBxoBrW7qLFLAckwGYeMnv38dn/MBxVXiEPA1R7mXJ1w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/node/-/node-17.0.2.tgz", + "integrity": "sha512-//FC3FuSFcMg9j6r3EucCLxJCoLUK56xfLGy6iDilW7LsEX54SB8lau0kq2ymDbBRRT/piI1s7RH+Lk777yBIw==", "dev": true, "dependencies": { - "@nrwl/node": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/jest": "16.8.1", - "@nx/js": "16.8.1", - "@nx/linter": "16.8.1", - "@nx/workspace": "16.8.1", + "@nrwl/node": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/eslint": "17.0.2", + "@nx/jest": "17.0.2", + "@nx/js": "17.0.2", "tslib": "^2.3.0" } }, "node_modules/@nx/nx-darwin-arm64": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.8.1.tgz", - "integrity": "sha512-xOflqyIVcyLPzdJOZcucI+5ClwnTgK8zIvpjbxHokrO9McJJglhfUyP0bbTHpEpWqzA+GaPA/6/Qdu0ATzqQBQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-17.0.2.tgz", + "integrity": "sha512-OSZLRfV8VplYPEqMcIg3mbAsJXlXEHKrdlJ0KUTk8Hih2+wl7cxuSEwG7X7qfBUOz+ognxaqicL+hueNrgwjlQ==", "cpu": [ "arm64" ], @@ -6919,9 +7073,9 @@ } }, "node_modules/@nx/nx-darwin-x64": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.8.1.tgz", - "integrity": "sha512-JJGrlOvEpDMWnM6YKaA1WOnzHgiw5vRKEowX9ba+jxhmCvtdjbLSxi228kv92JtQPPQ91zvtsNM+BFY0EbPOlA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-17.0.2.tgz", + "integrity": "sha512-olGt5R2dWYwdl1+I2RfJ8LdZO1elqhr9yDPnMIx//ZuN6T6wJA+Wdp2P3qpM1bY0F1lI/6AgjqzRyrTLUZ9cDA==", "cpu": [ "x64" ], @@ -6935,9 +7089,9 @@ } }, "node_modules/@nx/nx-freebsd-x64": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.8.1.tgz", - "integrity": "sha512-aZdJQ7cIQfXOmfk4vRXvVYxuV68xz8YyhNZ0IvBfJ16uZQ+YNl4BpklRLEIdaloSbwz9M1NNewmL+AgklEBxlA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-17.0.2.tgz", + "integrity": "sha512-+mta0J2G2byd+rfZ275oZs0aYXC/s92nI9ySBFQFQZnKJ6bsAagdZHe+uETsnE4xdhFXD8kvNMJU1WTGlyFyjg==", "cpu": [ "x64" ], @@ -6951,9 +7105,9 @@ } }, "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.8.1.tgz", - "integrity": "sha512-JzjrTf7FFgikoVUbRs0hKvwHRR6SyqT4yIdk/YyiCt2mWY9w4m5DWtHM/9kJzhckkH9MY66m+X/zG6+NKsEMvg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-17.0.2.tgz", + "integrity": "sha512-m80CmxHHyNAJ8j/0rkjc0hg/eGQlf6V2sLsV+gEJkz2sTEEdgSOK4DvnWcZRWO/SWBnqigxoHX4Kf5TH1nmoHA==", "cpu": [ "arm" ], @@ -6967,9 +7121,9 @@ } }, "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.8.1.tgz", - "integrity": "sha512-CF0s981myBWusW7iW2+fKPa7ceYYe+NO5EdKe9l27fpHDkcA71KZU3q7U823QpO/7tYvVdBevJp3CCn2/GBURQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-17.0.2.tgz", + "integrity": "sha512-AsD1H6wt68MK1u6vkmtNaFaxDMcyuk6dpo5kq1YT9cfUd614ys3qMUjVp3P2CXxzXh+0UDZeGrc6qotNKOkpJw==", "cpu": [ "arm64" ], @@ -6983,9 +7137,9 @@ } }, "node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.8.1.tgz", - "integrity": "sha512-X4TobxRt1dALvoeKC3/t1CqZCMUqtEhGG+KQLT/51sG54HdxmTAWRFlvj8PvLH0QSBk4e+uRZAo45qpt3iSnBg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-17.0.2.tgz", + "integrity": "sha512-f8pUFoZHBFQtHnopHgTEuwIiu0Rzem0dD7iK8SyyBy/lRAADtHCAHxaPAG+iatHAJ9h4DFIB50k9ybYxDtH2mg==", "cpu": [ "arm64" ], @@ -6999,9 +7153,9 @@ } }, "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.8.1.tgz", - "integrity": "sha512-lHvv2FD14Lpxh7muMLStH2tC1opQOaepO4nXwb1LaaoIpMym7kBgCK8AQuI98/oNQiMDXMNDKWQZCjxnJGDIPw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-17.0.2.tgz", + "integrity": "sha512-PISrHjLTxv5w8bz50vPZH6puYos88xu28o4IbVyYWrUrhoFsAx9Zbn1D6gWDPMSaKJU32v1l+5bTciQjQJU8fQ==", "cpu": [ "x64" ], @@ -7015,9 +7169,9 @@ } }, "node_modules/@nx/nx-linux-x64-musl": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.8.1.tgz", - "integrity": "sha512-c4gQvNgIjggD1A5sYhftQEC1PtAhV3sEnv60X00v9wmjl57Wj4Ty0TgyzpYglLysVRiko/B58S8NYS0jKvMmeA==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-17.0.2.tgz", + "integrity": "sha512-2wsqyBRjsxmAjxW+0lnGFtJLTk+AxgW7gjMv8NgLK8P1bc/sJYQB+g0o5op2z+szXRG3Noi0RZ9C0fG39EPFZw==", "cpu": [ "x64" ], @@ -7031,9 +7185,9 @@ } }, "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.8.1.tgz", - "integrity": "sha512-GKHPy/MyGFoV9cdKgcWLZZK2vDdxt5bQ53ss0k+BDKRP+YwLKm7tJl23eeM7JdB4GLCBntEQPC+dBqxOA8Ze/w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-17.0.2.tgz", + "integrity": "sha512-Sc3sQUcS5xdk05PABe/knG6orG5rmHZdSUj6SMRpvYfN2tM3ziNn6/wCF/LJoW6n70OxrOEXXwLSRK/5WigXbA==", "cpu": [ "arm64" ], @@ -7047,9 +7201,9 @@ } }, "node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.8.1.tgz", - "integrity": "sha512-yHZ5FAcx54rVc31R0yIpniepkHMPwaxG23l8E/ZYbL1iPwE/Wc1HeUzUvxUuSXtguRp7ihcRhaUEPkcSl2EAVw==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-17.0.2.tgz", + "integrity": "sha512-XhET0BDk6fbvTBCs7m5gZii8+2WhLpiC1sZchJw4LAJN2VJBiy3I3xnvpQYGFOAWaCb/iUGpuN/qP/NlQ+LNgA==", "cpu": [ "x64" ], @@ -7063,14 +7217,14 @@ } }, "node_modules/@nx/web": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/web/-/web-16.8.1.tgz", - "integrity": "sha512-3dOOJk81lnqIiS8T6tRmQ8XFcQuYpi0416es/HhJ9F6z40RJhg5T0U6DYPC2DtqqYdsmmGYY/lsWYWH+Q9lT3w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/web/-/web-17.0.2.tgz", + "integrity": "sha512-M8bausXzgkeFlNn43uO3pxtn/1EDoIs/7xgWPoGAdqV4l4RKG0JHqeLi68tP6YVA30RSAZ7UmvKQlKo14uDp0w==", "dev": true, "dependencies": { - "@nrwl/web": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", + "@nrwl/web": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", "chalk": "^4.1.0", "detect-port": "^1.5.1", "http-server": "^14.1.0", @@ -7078,15 +7232,15 @@ } }, "node_modules/@nx/webpack": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-16.8.1.tgz", - "integrity": "sha512-O5uRW0xQp7HoR+vj82/SNS8MwgsOsIX9/bKSpvF4VPBDMfzNw+75YTmaYYC4aB2AqkfkSL1jZHQouJzbMPBF9w==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/webpack/-/webpack-17.0.2.tgz", + "integrity": "sha512-TnC+Cpg7MPc6vl1Vu2sVzav/F+6mhmev3tH3nCUFywTwHXrK+i/NQhuvXWEixVt+l77V4Di6VhMKfHaGryfU6Q==", "dev": true, "dependencies": { "@babel/core": "^7.22.9", - "@nrwl/webpack": "16.8.1", - "@nx/devkit": "16.8.1", - "@nx/js": "16.8.1", + "@nrwl/webpack": "17.0.2", + "@nx/devkit": "17.0.2", + "@nx/js": "17.0.2", "autoprefixer": "^10.4.9", "babel-loader": "^9.1.2", "browserslist": "^4.21.4", @@ -7368,18 +7522,16 @@ } }, "node_modules/@nx/workspace": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-16.8.1.tgz", - "integrity": "sha512-wz5AwqdmRU80slva/Q3UmJAqDRYiPluEcqoBJcr2qW8zhoKYX/uDsYuAdCqr4uP5RokZca3LcXqNdpkOfFJtXg==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-17.0.2.tgz", + "integrity": "sha512-z2xit36dxdJuQmBDadNbbaYCKUYNk6mUWG/GEeBdgGXvFixqAUZ4lbWARlauCQS/+rEjXGOxtvn+u2d8u9mTSA==", "dev": true, "dependencies": { - "@nrwl/workspace": "16.8.1", - "@nx/devkit": "16.8.1", + "@nrwl/workspace": "17.0.2", + "@nx/devkit": "17.0.2", "chalk": "^4.1.0", "enquirer": "~2.3.6", - "ignore": "^5.0.4", - "nx": "16.8.1", - "rxjs": "^7.8.0", + "nx": "17.0.2", "tslib": "^2.3.0", "yargs-parser": "21.1.1" } @@ -7396,39 +7548,6 @@ "node": ">=8.6" } }, - "node_modules/@nx/workspace/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", - "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.2.1", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher/node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node_modules/@phenomnomnominal/tsquery": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", @@ -7476,117 +7595,7 @@ "integrity": "sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==", "dev": true, "dependencies": { - "@babel/runtime": "^7.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", - "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.0.0.tgz", - "integrity": "sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.1.tgz", - "integrity": "sha512-nsbUg588+GDSu8/NS8T4UAshO6xeaOfINNuXeVHcKV02LJtoRaM1SiOacClw4kws1SFiNhdLGxlbMY9ga/zs/w==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.2.1.tgz", - "integrity": "sha512-hV52c8Oo6/cXZZxVVoRNBb4zh+EKSHS4I1sedWV5pf0O+hTLSkrf6w86/V0AZutYtwBguB6HLKwz89WDBfwGOA==", - "dependencies": { - "serialize-javascript": "^6.0.0", - "smob": "^0.0.6", - "terser": "^5.15.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.4.tgz", - "integrity": "sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@babel/runtime": "^7.0.0" } }, "node_modules/@schematics/angular": { @@ -7825,7 +7834,7 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -7838,7 +7847,7 @@ "version": "7.6.5", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.0.0" } @@ -7847,7 +7856,7 @@ "version": "7.4.2", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -7857,7 +7866,7 @@ "version": "7.20.2", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "devOptional": true, + "dev": true, "dependencies": { "@babel/types": "^7.20.7" } @@ -7923,7 +7932,8 @@ "node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "dev": true }, "node_modules/@types/express": { "version": "4.17.17", @@ -8037,9 +8047,9 @@ "dev": true }, "node_modules/@types/mapbox__geojson-extent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/mapbox__geojson-extent/-/mapbox__geojson-extent-1.0.0.tgz", - "integrity": "sha512-RJBeVDv7LDmW4gO3VD8pr/OYuToQtF77H/VRDG733fmA6chzztBTz6yi9/llRD8SpM7fznxhP6B43Izaj4ufoA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/mapbox__geojson-extent/-/mapbox__geojson-extent-1.0.2.tgz", + "integrity": "sha512-CvdGdRsK4iMcYapHQPGscutacwv9zWRr+WyGzHQosSIBAW5ezrvM3LtYwaMXroFJeExqU4DF1Haj8Au8oTuJKg==", "dev": true, "dependencies": { "@types/geojson": "*" @@ -8052,9 +8062,9 @@ "dev": true }, "node_modules/@types/minilog": { - "version": "2.0.29", - "resolved": "https://registry.npmjs.org/@types/minilog/-/minilog-2.0.29.tgz", - "integrity": "sha512-TVUyrnCq82bya9i4e2JqQKpLFo8LOWkTXarWhqelXa7XWyAR0HyLW5Ova4+rbBKG8XejhxbaayecMkUG4sf8hQ==", + "version": "2.0.31", + "resolved": "https://registry.npmjs.org/@types/minilog/-/minilog-2.0.31.tgz", + "integrity": "sha512-m+49oneU3gGxdZeTCUbFewYllgtYBuxt6dgqHcgbYKIW+jYK8L+/yZaziH57CVSef4dzIWIq5JEi9N6J6xL6Og==", "dev": true }, "node_modules/@types/node": { @@ -8076,9 +8086,9 @@ "dev": true }, "node_modules/@types/plist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.2.tgz", - "integrity": "sha512-ULqvZNGMv0zRFvqn8/4LSPtnmN4MfhlPNtJCTpKuIIxGVGZ2rYWzFXrvEBoh9CVyqSE7D6YFRJ1hydLHI6kbWw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.4.tgz", + "integrity": "sha512-pTa9xUFQFM9WJGSWHajYNljD+DbVylE1q9IweK1LBhUYJdJ28YNU8j3KZ4Q1Qw+cSl4+QLLLOVmqNjhhvVO8fA==", "dev": true, "dependencies": { "@types/node": "*", @@ -8086,9 +8096,9 @@ } }, "node_modules/@types/progress": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.5.tgz", - "integrity": "sha512-ZYYVc/kSMkhH9W/4dNK/sLNra3cnkfT2nJyOAIDY+C2u6w72wa0s1aXAezVtbTsnN8HID1uhXCrLwDE2ZXpplg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.6.tgz", + "integrity": "sha512-VMoR0SmxPQFOZ7Sege+q2gswFNq/bHDSMcWv3sEaPqAkbvYYzCOJJzpmAupgYqXn3AXWWmyAWlw8x5tzRDNR7g==", "dev": true, "dependencies": { "@types/node": "*" @@ -8106,11 +8116,6 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", "dev": true }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -8199,9 +8204,9 @@ "dev": true }, "node_modules/@types/web": { - "version": "0.0.115", - "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.115.tgz", - "integrity": "sha512-IBtUgtxnITC7WTCg4tv6kCnSP0T+fM+3PzQPIzLzJY1DDlhBFKM/9+uMURw14YweWPDiFNIZ94Gc1bJtwow97g==", + "version": "0.0.119", + "resolved": "https://registry.npmjs.org/@types/web/-/web-0.0.119.tgz", + "integrity": "sha512-CQVOcEWrxr0MXbQbR3rrw6GHo2mcr8WlhLHQkOKDhhySTjz15/35jk0Zm2FbHRyCvSEjr/J7A2iDD5GRrGxE2A==", "dev": true }, "node_modules/@types/ws": { @@ -8693,25 +8698,25 @@ } }, "node_modules/@vscode/debugadapter": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.63.0.tgz", - "integrity": "sha512-d2eAnYCZkKJ0C28gT93KPi5YXFav8VyagcxkJ94LZ8qqgJ27+2ct26MOHGYKB8L25ZdDs8A4YmyJO32J0afhNQ==", + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@vscode/debugadapter/-/debugadapter-1.64.0.tgz", + "integrity": "sha512-XygE985qmNCzJExDnam4bErK6FG9Ck8S5TRPDNESwkt7i3OXqw5a3vYb7Dteyhz9YMEf7hwhFoT46Mjc45nJUg==", "dependencies": { - "@vscode/debugprotocol": "1.63.0" + "@vscode/debugprotocol": "1.64.0" }, "engines": { "node": ">=14" } }, "node_modules/@vscode/debugprotocol": { - "version": "1.63.0", - "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.63.0.tgz", - "integrity": "sha512-7gewwv69pA7gcJUhtJsru5YN7E1AwwnlBrF5mJY4R/NGInOUqOYOWHlqQwG+4AXn0nXWbcn26MHgaGI9Q26SqA==" + "version": "1.64.0", + "resolved": "https://registry.npmjs.org/@vscode/debugprotocol/-/debugprotocol-1.64.0.tgz", + "integrity": "sha512-Zhf3KvB+J04M4HPE2yCvEILGVtPixXUQMLBvx4QcAtjhc5lnwlZbbt80LCsZO2B+2BH8RMgVXk3QQ5DEzEne2Q==" }, "node_modules/@vscode/test-electron": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.4.tgz", - "integrity": "sha512-eWzIqXMhvlcoXfEFNWrVu/yYT5w6De+WZXR/bafUQhAp8+8GkQo95Oe14phwiRUPv8L+geAKl/QM2+PoT3YW3g==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.3.6.tgz", + "integrity": "sha512-M31xGH0RgqNU6CZ4/9g39oUMJ99nLzfjA+4UbtIQ6TcXQ6+2qkjOOxedmPBDDCg26/3Al5ubjY80hIoaMwKYSw==", "dev": true, "dependencies": { "http-proxy-agent": "^4.0.1", @@ -8724,9 +8729,9 @@ } }, "node_modules/@vscode/vsce": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.0.tgz", - "integrity": "sha512-KuxYqScqUY/duJbkj9eE2tN2X/WJoGAy54hHtxT3ZBkM6IzrOg7H7CXGUPBxNlmqku2w/cAjOUSrgIHlzz0mbA==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/@vscode/vsce/-/vsce-2.21.1.tgz", + "integrity": "sha512-f45/aT+HTubfCU2oC7IaWnH9NjOWp668ML002QiFObFRVUCoLtcwepp9mmql/ArFUy+HCHp54Xrq4koTcOD6TA==", "dev": true, "dependencies": { "azure-devops-node-api": "^11.0.1", @@ -9124,6 +9129,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -9298,9 +9304,9 @@ } }, "node_modules/angular-material-css-vars": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/angular-material-css-vars/-/angular-material-css-vars-5.0.2.tgz", - "integrity": "sha512-k23Mgik7eTnbFlk4rbQULTc1mVV3tOxJySADd4SBMCO2LVNt02o2z+J0HFU9cNdHD8hr5+gAb5g8gxZnv/y7OQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/angular-material-css-vars/-/angular-material-css-vars-5.0.3.tgz", + "integrity": "sha512-KWDwyBP2twHFR3q3c+U6rTSNJSKNSO6I05WJjniE1JtQQnOUl2JH/pUG8JWUdXkig7SL4XShT6XiMcaupyTvtQ==", "dev": true, "dependencies": { "@ctrl/tinycolor": "^3.4.0", @@ -9475,6 +9481,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -9635,9 +9642,9 @@ "dev": true }, "node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", + "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -9925,6 +9932,7 @@ "version": "0.4.5", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", "@babel/helper-define-polyfill-provider": "^0.4.2", @@ -9938,6 +9946,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "bin": { "semver": "bin/semver.js" } @@ -9946,6 +9955,7 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2", "core-js-compat": "^3.31.0" @@ -9958,6 +9968,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.4.2" }, @@ -10211,6 +10222,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -10237,6 +10249,7 @@ "version": "4.21.10", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10330,18 +10343,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/builtins": { "version": "5.0.1", @@ -10449,6 +10452,7 @@ "version": "1.0.30001538", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001538.tgz", "integrity": "sha512-HWJnhnID+0YMtGlzcp3T9drmBJUVDchPJ08tpUGFLs9CYlwWPH2uLgpHn8fND5pCgXVtnGS3H4QR9XLMHVNkHw==", + "dev": true, "funding": [ { "type": "opencollective", @@ -10464,6 +10468,17 @@ } ] }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -10729,14 +10744,17 @@ } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/clone": { @@ -10782,6 +10800,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "devOptional": true, "dependencies": { "color-name": "1.1.3" } @@ -10789,7 +10808,8 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "devOptional": true }, "node_modules/color-support": { "version": "1.1.3", @@ -10812,6 +10832,19 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -10833,11 +10866,6 @@ "node": ">= 6" } }, - "node_modules/commenting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/commenting/-/commenting-1.1.0.tgz", - "integrity": "sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==" - }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -10918,7 +10946,8 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true }, "node_modules/confusing-browser-globals": { "version": "1.0.11", @@ -10965,7 +10994,8 @@ "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -11078,6 +11108,7 @@ "version": "3.32.2", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", + "dev": true, "dependencies": { "browserslist": "^4.21.10" }, @@ -12119,7 +12150,8 @@ "node_modules/electron-to-chromium": { "version": "1.4.526", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.526.tgz", - "integrity": "sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q==" + "integrity": "sha512-tjjTMjmZAx1g6COrintLTa2/jcafYKxKoiEkdQOrVdbLaHh2wCt2nsAF8ZHweezkrP+dl/VG9T5nabcYoo0U5Q==", + "dev": true }, "node_modules/emittery": { "version": "0.13.1", @@ -12427,6 +12459,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, "engines": { "node": ">=6" } @@ -12535,9 +12568,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz", - "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -12852,15 +12885,11 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -13717,12 +13746,14 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -13735,7 +13766,8 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "devOptional": true }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -13792,6 +13824,7 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -13898,19 +13931,19 @@ "dev": true }, "node_modules/glob": { - "version": "10.3.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.5.tgz", - "integrity": "sha512-bYUpUD7XDEHI4Q2O5a7PXGvyw4deKR70kHiDxzQbe925wbZknhOzUt2xBgTkYL6RBcVeXYuD9iNYeqoWbBZQnA==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -13988,6 +14021,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -14105,6 +14139,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "devOptional": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -14663,6 +14698,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -14671,7 +14707,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "devOptional": true }, "node_modules/ini": { "version": "4.1.1", @@ -14822,20 +14859,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -14864,6 +14887,7 @@ "version": "2.13.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "devOptional": true, "dependencies": { "has": "^1.0.3" }, @@ -15000,11 +15024,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -15361,9 +15380,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.3.tgz", - "integrity": "sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -16442,7 +16461,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -16554,6 +16574,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -16647,6 +16668,7 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -17189,12 +17211,14 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "devOptional": true }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", @@ -17356,6 +17380,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -17364,6 +17389,7 @@ "version": "0.30.1", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -17509,9 +17535,9 @@ } }, "node_modules/material-icons": { - "version": "1.13.11", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.11.tgz", - "integrity": "sha512-kp2oAdaqo/Zp6hpTZW01rOgDPWmxBUszSdDzkRm1idCjjNvdUMnqu8qu58cll6CObo+o0cydOiPLdoSugLm+mQ==", + "version": "1.13.12", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.12.tgz", + "integrity": "sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA==", "dev": true }, "node_modules/math.gl": { @@ -17958,14 +17984,6 @@ "dev": true, "optional": true }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, "node_modules/mrmime": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", @@ -18184,6 +18202,7 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "dev": true, + "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -18289,7 +18308,8 @@ "node_modules/node-releases": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true }, "node_modules/nopt": { "version": "4.0.3", @@ -18675,31 +18695,30 @@ "dev": true }, "node_modules/nx": { - "version": "16.8.1", - "resolved": "https://registry.npmjs.org/nx/-/nx-16.8.1.tgz", - "integrity": "sha512-K5KrwNdPz0eEe6SY5wrnhZcigjfIJkttPrIJRXNBQTE50NGcOfz1TjMXPdTWBxBCCua5PAealO3OrE8jpv+QnQ==", + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/nx/-/nx-17.0.2.tgz", + "integrity": "sha512-utk9ufxLlRd210nEV6cKjMLVK0gup2ZMlNT41lLgUX/gp3Q59G1NkyLo3o29DxBh3AhNJ9q5MKgybmzDNdpudA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@nrwl/tao": "16.8.1", - "@parcel/watcher": "2.0.4", + "@nrwl/tao": "17.0.2", "@yarnpkg/lockfile": "^1.1.0", "@yarnpkg/parsers": "3.0.0-rc.46", "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", + "axios": "^1.5.1", "chalk": "^4.1.0", "cli-cursor": "3.1.0", "cli-spinners": "2.6.1", - "cliui": "^7.0.2", + "cliui": "^8.0.1", "dotenv": "~16.3.1", "dotenv-expand": "~10.0.0", "enquirer": "~2.3.6", - "fast-glob": "3.2.7", "figures": "3.2.0", "flat": "^5.0.2", "fs-extra": "^11.1.0", "glob": "7.1.4", "ignore": "^5.0.4", + "jest-diff": "^29.4.1", "js-yaml": "4.1.0", "jsonc-parser": "3.2.0", "lines-and-columns": "~2.0.3", @@ -18719,23 +18738,24 @@ "yargs-parser": "21.1.1" }, "bin": { - "nx": "bin/nx.js" + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" }, "optionalDependencies": { - "@nx/nx-darwin-arm64": "16.8.1", - "@nx/nx-darwin-x64": "16.8.1", - "@nx/nx-freebsd-x64": "16.8.1", - "@nx/nx-linux-arm-gnueabihf": "16.8.1", - "@nx/nx-linux-arm64-gnu": "16.8.1", - "@nx/nx-linux-arm64-musl": "16.8.1", - "@nx/nx-linux-x64-gnu": "16.8.1", - "@nx/nx-linux-x64-musl": "16.8.1", - "@nx/nx-win32-arm64-msvc": "16.8.1", - "@nx/nx-win32-x64-msvc": "16.8.1" + "@nx/nx-darwin-arm64": "17.0.2", + "@nx/nx-darwin-x64": "17.0.2", + "@nx/nx-freebsd-x64": "17.0.2", + "@nx/nx-linux-arm-gnueabihf": "17.0.2", + "@nx/nx-linux-arm64-gnu": "17.0.2", + "@nx/nx-linux-arm64-musl": "17.0.2", + "@nx/nx-linux-x64-gnu": "17.0.2", + "@nx/nx-linux-x64-musl": "17.0.2", + "@nx/nx-win32-arm64-msvc": "17.0.2", + "@nx/nx-win32-x64-msvc": "17.0.2" }, "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" + "@swc-node/register": "^1.6.7", + "@swc/core": "^1.3.85" }, "peerDependenciesMeta": { "@swc-node/register": { @@ -18764,22 +18784,6 @@ "node": ">=8.6" } }, - "node_modules/nx/node_modules/fast-glob": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", - "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nx/node_modules/glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -18934,6 +18938,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -19141,17 +19146,6 @@ "node": ">=6" } }, - "node_modules/package-name-regex": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/package-name-regex/-/package-name-regex-2.0.6.tgz", - "integrity": "sha512-gFL35q7kbE/zBaPA3UKhp2vSzcPYx2ecbYuwv1ucE9Il6IIgBDweBlH8D68UFGZic2MkllKa2KHCfC1IQBQUYA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/dword-design" - } - }, "node_modules/pacote": { "version": "15.2.0", "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", @@ -19335,6 +19329,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -19351,7 +19346,8 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "devOptional": true }, "node_modules/path-scurry": { "version": "1.10.1", @@ -19421,7 +19417,8 @@ "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -20367,6 +20364,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -20740,12 +20738,14 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "10.1.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -20756,12 +20756,14 @@ "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -20793,6 +20795,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -20809,6 +20812,7 @@ "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -20820,6 +20824,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" } @@ -20909,6 +20914,7 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "devOptional": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -21036,15 +21042,15 @@ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "node_modules/rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "dependencies": { - "glob": "^10.2.5" + "glob": "^10.3.7" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" + "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": ">=14" @@ -21057,6 +21063,7 @@ "version": "3.29.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.2.tgz", "integrity": "sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==", + "dev": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -21068,82 +21075,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-license": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-license/-/rollup-plugin-license-3.1.0.tgz", - "integrity": "sha512-Cny2H2hJ7K+VdcJkH1pNcYRVhqIhZNu/fPusedW53fNZQOIwpXiznJ220EFvDkJbFUEkLqIDsDB5bEr/N9qfqw==", - "dependencies": { - "commenting": "~1.1.0", - "glob": "~7.2.0", - "lodash": "~4.17.21", - "magic-string": "~0.30.0", - "mkdirp": "~3.0.0", - "moment": "~2.29.3", - "package-name-regex": "~2.0.6", - "spdx-expression-validate": "~2.0.0", - "spdx-satisfies": "~5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.0.0 || ^2.0.0 || ^3.0.0" - } - }, - "node_modules/rollup-plugin-license/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup-plugin-license/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rollup-plugin-license/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup-plugin-license/node_modules/spdx-satisfies": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz", - "integrity": "sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==", - "dependencies": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -21219,6 +21150,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -21454,6 +21386,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -21792,11 +21725,6 @@ "npm": ">= 3.0.0" } }, - "node_modules/smob": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/smob/-/smob-0.0.6.tgz", - "integrity": "sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw==" - }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -21891,6 +21819,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -21900,6 +21829,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -21908,6 +21838,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", + "optional": true, "dependencies": { "array-find-index": "^1.0.2", "spdx-expression-parse": "^3.0.0", @@ -21927,34 +21858,30 @@ "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "devOptional": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "devOptional": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "node_modules/spdx-expression-validate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-validate/-/spdx-expression-validate-2.0.0.tgz", - "integrity": "sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==", - "dependencies": { - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/spdx-license-ids": { "version": "3.0.15", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", - "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==" + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", + "devOptional": true }, "node_modules/spdx-ranges": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", - "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==" + "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==", + "optional": true }, "node_modules/spdx-satisfies": { "version": "4.0.1", @@ -22415,6 +22342,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -22607,6 +22535,7 @@ "version": "5.19.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -22735,7 +22664,8 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true }, "node_modules/test-exclude": { "version": "6.0.0", @@ -22901,6 +22831,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } @@ -23032,15 +22963,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.4", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.4.tgz", - "integrity": "sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.0.tgz", + "integrity": "sha512-LLlB/pkB4q9mW2yLdFMnK3dEHbrBjeZTYguaaIfusyojBgAGf5kF+O6KcWqiGzWqHk0LBsoolrp4VftEURhybg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -23378,6 +23310,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, "engines": { "node": ">=4" } @@ -23386,6 +23319,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -23398,6 +23332,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, "engines": { "node": ">=4" } @@ -23406,6 +23341,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, "engines": { "node": ">=4" } @@ -23477,6 +23413,7 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, "funding": [ { "type": "opencollective", @@ -24100,13 +24037,13 @@ } }, "node_modules/vscode-languageclient": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.0.tgz", - "integrity": "sha512-EXP4vhSlEj0DtyxrcWVp5aiFrY0WczKSnKSyrMmSbU7qhASPhM+pfcUzY/z8TQCfOhKvq39fidbdTbq9LnBi7g==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-9.0.1.tgz", + "integrity": "sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==", "dependencies": { "minimatch": "^5.1.0", "semver": "^7.3.7", - "vscode-languageserver-protocol": "3.17.4" + "vscode-languageserver-protocol": "3.17.5" }, "engines": { "vscode": "^1.82.0" @@ -24132,34 +24069,34 @@ } }, "node_modules/vscode-languageserver": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.0.tgz", - "integrity": "sha512-npT72Iu28Tjsm94MsCbwJmIu5ycCF3UEPj3Eb3725T1Hqf4d+Vj2W4GC+F8l4n9yNItJuvE/AHYvomvAs9Dj8A==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", "dependencies": { - "vscode-languageserver-protocol": "3.17.4" + "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "node_modules/vscode-languageserver-protocol": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.4.tgz", - "integrity": "sha512-IpaHLPft+UBWf4dOIH15YEgydTbXGz52EMU2h16SfFpYu/yOQt3pY14049mtpJu+4CBHn+hq7S67e7O0AwpRqQ==", + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", "dependencies": { "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.4" + "vscode-languageserver-types": "3.17.5" } }, "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", - "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==" + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" }, "node_modules/vscode-languageserver-types": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.4.tgz", - "integrity": "sha512-9YXi5pA3XF2V+NUQg6g+lulNS0ncRCKASYdK3Cs7kiH9sVFXWq27prjkC/B8M/xJLRPPRSPCHVMuBTgRNFh2sQ==" + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==" }, "node_modules/vscode-oniguruma": { "version": "2.0.1", @@ -24173,9 +24110,9 @@ "integrity": "sha512-Cl65diFGxz7gpwbav10HqiY/eVYTO1sjQpmRmV991Bj7wAoOAjGQ97PpQcXorDE2Uc4hnGWLY17xme+5t6MlSg==" }, "node_modules/vscode-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", - "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" }, "node_modules/w3c-hr-time": { "version": "1.0.2", @@ -24847,7 +24784,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -24938,12 +24876,13 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "node_modules/yaml": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", - "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", + "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", "dev": true, "engines": { "node": ">= 14" @@ -24976,20 +24915,6 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 5e0adafe7..77093cb6f 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "idl-for-vscode", "displayName": "%packageJSON.displayName%", "description": "%packageJSON.description%", - "version": "3.2.4", + "version": "4.0.0", "publisher": "idl", "license": "MIT", "encryption": "yes", @@ -51,12 +51,12 @@ "post-migrate": "rimraf ./node_modules/.cache" }, "dependencies": { - "@analytics-debugger/ga4mp": "^0.0.8", - "@vscode/debugadapter": "^1.63.0", - "@vscode/debugprotocol": "^1.63.0", + "@vscode/debugadapter": "^1.64.0", + "@vscode/debugprotocol": "^1.64.0", "ajv": "^8.11.2", "ansi-styles": "^6.1.0", "await-notify": "^1.0.1", + "case-anything": "^2.1.13", "chalk": "^4.1.2", "compare-versions": "^6.1.0", "deepmerge": "^4.2.2", @@ -69,11 +69,11 @@ "nanoid": "^3.3.4", "rxjs": "~6.6.0", "tslib": "^2.3.0", - "vscode-languageclient": "^9.0.0", - "vscode-languageserver": "^9.0.0", - "vscode-languageserver-textdocument": "^1.0.8", + "vscode-languageclient": "^9.0.1", + "vscode-languageserver": "^9.0.1", + "vscode-languageserver-textdocument": "^1.0.11", "vscode-textmate": "^9.0.0", - "vscode-uri": "^3.0.3", + "vscode-uri": "^3.0.8", "zone.js": "0.13.0" }, "optionalDependencies": { @@ -100,47 +100,47 @@ "@angular/platform-browser": "16.2.6", "@angular/platform-browser-dynamic": "16.2.6", "@angular/router": "16.2.6", - "@deck.gl/core": "^8.9.30", - "@deck.gl/geo-layers": "^8.9.30", - "@deck.gl/layers": "^8.9.30", - "@deck.gl/mesh-layers": "^8.9.30", + "@deck.gl/core": "^8.9.32", + "@deck.gl/geo-layers": "^8.9.32", + "@deck.gl/layers": "^8.9.32", + "@deck.gl/mesh-layers": "^8.9.32", "@mapbox/geojson-extent": "^1.0.1", - "@mdi/js": "^7.0.96", + "@mdi/js": "^7.3.67", "@ngbracket/ngx-layout": "^16.1.3", "@ngneat/transloco": "^4.3.0", - "@nx/angular": "16.8.1", - "@nx/cypress": "16.8.1", - "@nx/esbuild": "16.8.1", - "@nx/eslint-plugin": "16.8.1", - "@nx/jest": "16.8.1", - "@nx/js": "16.8.1", - "@nx/linter": "16.8.1", - "@nx/node": "16.8.1", - "@nx/web": "16.8.1", - "@nx/workspace": "16.8.1", + "@nx/angular": "17.0.2", + "@nx/cypress": "17.0.2", + "@nx/esbuild": "17.0.2", + "@nx/eslint": "17.0.2", + "@nx/eslint-plugin": "17.0.2", + "@nx/jest": "17.0.2", + "@nx/js": "17.0.2", + "@nx/node": "17.0.2", + "@nx/web": "17.0.2", + "@nx/workspace": "17.0.2", "@schematics/angular": "16.2.3", "@types/jest": "29.4.4", - "@types/mapbox__geojson-extent": "^1.0.0", - "@types/minilog": "^2.0.29", + "@types/mapbox__geojson-extent": "^1.0.2", + "@types/minilog": "^2.0.31", "@types/node": "^20.2.3", - "@types/plist": "^3.0.2", - "@types/progress": "^2.0.5", + "@types/plist": "^3.0.4", + "@types/progress": "^2.0.6", "@types/vscode": "^1.82.0", "@types/vscode-notebook-renderer": "^1.72.0", - "@types/web": "^0.0.115", + "@types/web": "^0.0.119", "@typescript-eslint/eslint-plugin": "5.60.1", "@typescript-eslint/parser": "5.60.1", - "@vscode/test-electron": "^2.3.4", - "@vscode/vsce": "^2.21.0", + "@vscode/test-electron": "^2.3.6", + "@vscode/vsce": "2.21", "@vscode/webview-ui-toolkit": "^1.2.0", "@webcomponents/webcomponentsjs": "^2.8.0", - "angular-material-css-vars": "^5.0.2", + "angular-material-css-vars": "^5.0.3", "axios": "^1.5.0", "chart.js": "^4.4.0", "cypress": "^13.0.0", "esbuild": "0.19.2", "eslint": "8.46.0", - "eslint-config-prettier": "8.1.0", + "eslint-config-prettier": "9.0.0", "eslint-plugin-cypress": "2.13.4", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-unused-imports": "^2.0.0", @@ -151,20 +151,20 @@ "jest-environment-node": "^29.4.1", "jest-preset-angular": "13.1.1", "json-stringify-pretty-compact": "^3.0.0", - "material-icons": "^1.13.11", + "material-icons": "^1.13.12", "node-html-markdown": "^1.2.0", "npm-run-all": "^4.1.5", - "nx": "16.8.1", + "nx": "17.0.2", "plist": "^3.0.6", "prettier": "2.7.1", "progress": "^2.0.3", - "rimraf": "^5.0.0", + "rimraf": "^5.0.5", "terser-webpack-plugin": "^5.3.1", "ts-jest": "29.1.0", "ts-node": "10.9.1", "typescript": "5.1.6", "vscode-oniguruma": "^2.0.1", - "yaml": "^2.3.1" + "yaml": "^2.3.3" }, "engines": { "vscode": "^1.82.0", @@ -276,6 +276,18 @@ "command": "idl.notebooks.helpAsNotebook", "title": "%commands.idl.notebooks.helpAsNotebook%" }, + { + "command": "idl.notebooks.newNotebook", + "title": "%commands.idl.notebooks.newNotebook%" + }, + { + "command": "idl.notebooks.notebookToProCode", + "title": "%commands.idl.notebooks.notebookToProCode%" + }, + { + "command": "idl.notebooks.openENVIExample", + "title": "%commands.idl.notebooks.openENVIExample%" + }, { "command": "idl.notebooks.openIDLExample", "title": "%commands.idl.notebooks.openIDLExample%" @@ -288,6 +300,10 @@ "dark": "extension/images/dark/renew.svg" } }, + { + "command": "idl.notebooks.resetNotebookExamples", + "title": "%commands.idl.notebooks.resetNotebookExamples%" + }, { "command": "idl.notebooks.stopIDL", "title": "%commands.idl.notebooks.stopIDL%", @@ -463,48 +479,50 @@ "quotes": "single", "methods": "dot", "keywords": "lower", - "properties": "lower", + "properties": "camel", "control": "lower", "numbers": "lower", "hex": "lower", "octal": "lower", "binary": "lower", "routines": "match", + "routineMethods": "camel", "systemVariables": "lower", - "localVariables": "match" + "localVariables": "match", + "structureNames": "pascal" }, "properties": { - "quotes": { + "binary": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.quotes%", + "description": "%configuration.properties.code.formattingStyle.binary%", "enum": [ - "single", - "double", + "lower", + "upper", "none" ], "enumDescriptions": [ - "%configuration.enumDescriptions.formatting.style.single%", - "%configuration.enumDescriptions.formatting.style.double%", + "%configuration.enumDescriptions.formatting.style.lower%", + "%configuration.enumDescriptions.formatting.style.upper%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "methods": { + "control": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.methods%", + "description": "%configuration.properties.code.formattingStyle.control%", "enum": [ - "dot", - "arrow", + "lower", + "upper", "none" ], "enumDescriptions": [ - "%configuration.enumDescriptions.formatting.style.dot%", - "%configuration.enumDescriptions.formatting.style.arrow%", + "%configuration.enumDescriptions.formatting.style.lower%", + "%configuration.enumDescriptions.formatting.style.upper%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "keywords": { + "hex": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.keywords%", + "description": "%configuration.properties.code.formattingStyle.hex%", "enum": [ "lower", "upper", @@ -516,9 +534,9 @@ "%configuration.enumDescriptions.formatting.style.none%" ] }, - "properties": { + "keywords": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.properties%", + "description": "%configuration.properties.code.formattingStyle.keywords%", "enum": [ "lower", "upper", @@ -530,37 +548,35 @@ "%configuration.enumDescriptions.formatting.style.none%" ] }, - "control": { + "localVariables": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.control%", + "description": "%configuration.properties.code.formattingStyle.localVariables%", "enum": [ - "lower", - "upper", + "match", "none" ], "enumDescriptions": [ - "%configuration.enumDescriptions.formatting.style.lower%", - "%configuration.enumDescriptions.formatting.style.upper%", + "%configuration.enumDescriptions.formatting.style.match%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "numbers": { + "methods": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.numbers%", + "description": "%configuration.properties.code.formattingStyle.methods%", "enum": [ - "lower", - "upper", + "dot", + "arrow", "none" ], "enumDescriptions": [ - "%configuration.enumDescriptions.formatting.style.lower%", - "%configuration.enumDescriptions.formatting.style.upper%", + "%configuration.enumDescriptions.formatting.style.dot%", + "%configuration.enumDescriptions.formatting.style.arrow%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "hex": { + "numbers": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.hex%", + "description": "%configuration.properties.code.formattingStyle.numbers%", "enum": [ "lower", "upper", @@ -586,31 +602,37 @@ "%configuration.enumDescriptions.formatting.style.none%" ] }, - "binary": { + "properties": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.binary%", + "description": "%configuration.properties.code.formattingStyle.properties%", "enum": [ "lower", "upper", + "match", + "camel", + "pascal", "none" ], "enumDescriptions": [ "%configuration.enumDescriptions.formatting.style.lower%", "%configuration.enumDescriptions.formatting.style.upper%", + "%configuration.enumDescriptions.formatting.style.match%", + "%configuration.enumDescriptions.formatting.style.camel%", + "%configuration.enumDescriptions.formatting.style.pascal%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "systemVariables": { + "quotes": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.systemVariables%", + "description": "%configuration.properties.code.formattingStyle.quotes%", "enum": [ - "lower", - "upper", + "single", + "double", "none" ], "enumDescriptions": [ - "%configuration.enumDescriptions.formatting.style.lower%", - "%configuration.enumDescriptions.formatting.style.upper%", + "%configuration.enumDescriptions.formatting.style.single%", + "%configuration.enumDescriptions.formatting.style.double%", "%configuration.enumDescriptions.formatting.style.none%" ] }, @@ -619,22 +641,60 @@ "description": "%configuration.properties.code.formattingStyle.routines%", "enum": [ "match", + "camel", + "pascal", "none" ], "enumDescriptions": [ "%configuration.enumDescriptions.formatting.style.match%", + "%configuration.enumDescriptions.formatting.style.camel%", + "%configuration.enumDescriptions.formatting.style.pascal%", "%configuration.enumDescriptions.formatting.style.none%" ] }, - "localVariables": { + "routineMethods": { "type": "string", - "description": "%configuration.properties.code.formattingStyle.localVariables%", + "description": "%configuration.properties.code.formattingStyle.routineMethods%", "enum": [ "match", + "camel", + "pascal", "none" ], "enumDescriptions": [ "%configuration.enumDescriptions.formatting.style.match%", + "%configuration.enumDescriptions.formatting.style.camel%", + "%configuration.enumDescriptions.formatting.style.pascal%", + "%configuration.enumDescriptions.formatting.style.none%" + ] + }, + "structureNames": { + "type": "string", + "description": "%configuration.properties.code.formattingStyle.structureNames%", + "enum": [ + "match", + "camel", + "pascal", + "none" + ], + "enumDescriptions": [ + "%configuration.enumDescriptions.formatting.style.match%", + "%configuration.enumDescriptions.formatting.style.camel%", + "%configuration.enumDescriptions.formatting.style.pascal%", + "%configuration.enumDescriptions.formatting.style.none%" + ] + }, + "systemVariables": { + "type": "string", + "description": "%configuration.properties.code.formattingStyle.systemVariables%", + "enum": [ + "lower", + "upper", + "none" + ], + "enumDescriptions": [ + "%configuration.enumDescriptions.formatting.style.lower%", + "%configuration.enumDescriptions.formatting.style.upper%", "%configuration.enumDescriptions.formatting.style.none%" ] } @@ -972,9 +1032,15 @@ { "filenamePattern": "*.jp2000" }, + { + "filenamePattern": "*.nitf" + }, { "filenamePattern": "*.ntf" }, + { + "filenamePattern": "*.r0" + }, { "filenamePattern": "*.tif" }, @@ -982,7 +1048,7 @@ "filenamePattern": "*.tiff" } ], - "priority": "default" + "priority": "option" } ], "debuggers": [ diff --git a/tsconfig.base.json b/tsconfig.base.json index 999bef91e..b1cc1b2c5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -41,7 +41,7 @@ ], "@idl/idl": ["libs/idl/src/index.ts"], "@idl/logger": ["libs/logger/src/index.ts"], - "@idl/notebooks/index": ["libs/notebooks/index/src/index.ts"], + "@idl/notebooks/idl-index": ["libs/notebooks/idl-index/src/index.ts"], "@idl/notebooks/shared": ["libs/notebooks/shared/src/index.ts"], "@idl/notebooks/types": ["libs/notebooks/types/src/index.ts"], "@idl/parser": ["libs/parsing/parser/src/index.ts"],