diff --git a/.github/actions/package.json b/.github/actions/package.json index 138dca714f..a17bd7960c 100644 --- a/.github/actions/package.json +++ b/.github/actions/package.json @@ -5,9 +5,10 @@ "type": "module", "devDependencies": { "@sourceacademy/modules-repotools": "workspace:^", + "@types/lodash": "^4.14.198", "@types/node": "^22.15.30", "typescript": "^5.8.2", - "vitest": "^4.0.4" + "vitest": "^4.0.18" }, "dependencies": { "@actions/artifact": "^2.3.2", diff --git a/devserver/package.json b/devserver/package.json index 53e90ea654..36e80d80ea 100644 --- a/devserver/package.json +++ b/devserver/package.json @@ -9,15 +9,15 @@ "devserver": "./bin.js" }, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@commander-js/extra-typings": "^14.0.0", "@sourceacademy/modules-lib": "workspace:^", "@vitejs/plugin-react": "^5.1.0", "ace-builds": "^1.25.1", "classnames": "^2.3.1", "commander": "^14.0.0", - "js-slang": "^1.0.81", + "js-slang": "^1.0.85", "re-resizable": "^6.9.11", "react": "^18.3.1", "react-ace": "^10.1.0", @@ -29,13 +29,13 @@ "@sourceacademy/modules-buildtools": "workspace:^", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.1", - "@vitest/browser-playwright": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", "eslint": "^9.35.0", "playwright": "^1.55.1", "sass": "^1.85.0", "typescript": "^5.8.2", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "scripts": { "dev": "vite", diff --git a/devserver/src/components/__tests__/Playground.test.tsx b/devserver/src/components/__tests__/Playground.test.tsx index 3ce156486f..530bae58b5 100644 --- a/devserver/src/components/__tests__/Playground.test.tsx +++ b/devserver/src/components/__tests__/Playground.test.tsx @@ -48,7 +48,8 @@ describe('Playground tests', () => { const settingsButton = component.getByRole('button').filter({ hasText: /^$/ }); await userEvent.click(settingsButton); - const compiledTabsToggle = component.baseElement.getElementsByClassName('bp5-switch').item(0); + const compiledTabsToggle = component.baseElement.getElementsByClassName('bp6-switch').item(0); + expect(compiledTabsToggle).not.toBeNull(); await userEvent.click(compiledTabsToggle!); await userEvent.click(settingsButton); diff --git a/devserver/src/components/sideContent/SideContent.tsx b/devserver/src/components/sideContent/SideContent.tsx index 74fef9c542..82f6bbdefd 100644 --- a/devserver/src/components/sideContent/SideContent.tsx +++ b/devserver/src/components/sideContent/SideContent.tsx @@ -37,7 +37,7 @@ interface TabIconProps { function TabIcon({ iconName, tooltip, shouldAlert }: TabIconProps) { return
- +
; } diff --git a/docs/src/buildtools/5-builders/2-docs.md b/docs/src/buildtools/5-builders/2-docs.md index d1820b91b4..64f53a7792 100644 --- a/docs/src/buildtools/5-builders/2-docs.md +++ b/docs/src/buildtools/5-builders/2-docs.md @@ -11,7 +11,7 @@ Firstly, the `buildtools build docs` is called on each bundle. This produces two 1. `build/jsons/[bundle_name].json`, which is the JSON documentation used by `js-slang` and the frontend 2. `docs.json`, which is JSON documentation format used by `typedoc` to generate the HTML documentation later -Second, `buildtools manifest` is called, which then takes the `docs.json` files from each bundle and uses the [`merge` entry point strategy](https://typedoc.org/documents/Options.Input.html#merge) to create the HTML +Second, `buildtools html` is called, which then takes the `docs.json` files from each bundle and uses the [`merge` entry point strategy](https://typedoc.org/documents/Options.Input.html#merge) to create the HTML documentation > [!NOTE] @@ -20,6 +20,36 @@ documentation This allows each bundle to have its own Typedoc option set. +## Custom Checks + +There are two important custom checks that our documentation generation must perform: + +### Typing Variables as Functions + +Because Typedoc no longer automatically considers function-like types as functions, developers must use the `@function` tag to allow +Typedoc to properly infer that a function-like variable should be documented as a function. + +When generating the documentation, we simply check if the corresponding item has been assigned a variable type while having function signatures. If this +is the case, then we print a warning advising the developer that they may have forgotten the `@function` tag. + +### Hiding Type Guards + +Typescript has a feature called type guards that allow the compiler to better narrow types, increasing the type safety of module code. + +When Typedoc encounters a type guard, it documents the return type of that type guard as is. + +```ts +export function is_boolean(obj: unknown): obj is boolean { + return typeof obj === 'boolean'; +} +``` + +The function above has its return type rendered as `obj is boolean`. However, this might confuse cadets as type guards are not a concept in Source, +and the return type as rendered also hides the fact that `is_boolean` returns a `boolean` and not some other special value. + +To remedy this, when generating the documentation for type guards, we simply replace the return type of the signature with `boolean` (or `void` if +it's an asserts guard). This modification is done on "conversion" by hooking into the `Converter.EVENT_CREATE_SIGNATURE` event. + ## HTML Generation It is not possible to generate the HTML documentation on a per-bundle basis. Thus, when HTML documentation needs to be regenerated, the source files of every single bundle needs to be processed. diff --git a/docs/src/modules/2-bundle/4-conventions/1-basic.md b/docs/src/modules/2-bundle/4-conventions/1-basic.md index fcb48d0794..ea52fb94d9 100644 --- a/docs/src/modules/2-bundle/4-conventions/1-basic.md +++ b/docs/src/modules/2-bundle/4-conventions/1-basic.md @@ -2,6 +2,8 @@ This section contains some conventions to follow when writing your bundle. +[[toc]] + ## 1. Cadet facing functions should not have default or rest parameters The function signature below takes in two booleans, the second of which is optional. This is not supported for Module functions in Source, but is fine if your function @@ -211,3 +213,55 @@ Note that not every export from `js-slang` is currently supported. Below is the - `js-slang/dist/utils/stringify` - `js-slang/dist/parser/parser` - `js-slang/dist/cse-machine/interpreter` + +## 6. Cadet Facing Type Guard Conventions + +A [type guard](https://www.typescriptlang.org/docs/handbook/2/narrowing.html) is a function that checks if the provided object has the desired type. +In Typescript, there are two kinds of type guards. Cadet facing type guards should favour the boolean returning form and should begin with the +`is` prefix. Also, the parameter the type guard validates should be of type `unknown`. + +Anywhere you use a boolean check followed by a type assertion: +```ts +// Simple boolean type guard +export function is_sound(obj: unknown): boolean { + return obj instanceof Sound; +} + +function play(obj: Sound) { + // Simple boolean check + if (!is_sound(obj)) return false; + + // followed by type assertion, since obj is still of type unknown + const sound = obj as Sound; + // ...implementatation details +} +``` + +you should replace with a type guard: +```ts +// Typescript boolean Type Guard +export function is_sound(obj: unknown): obj is Sound { + return obj instanceof Sound; +} + +function play(obj: Sound) { + // Check using a type guard + if (!is_sound(obj)) return false; + + // Type assertion is no longer required. Typescript knows that obj + // is a Sound here + + // ...implementatation details +} +``` + +Note that for simple checks (like `instanceof`), Typescript (later versions) is able to automatically infer when you are writing a type guard, +meaning that explicitly typing your type guard may be unnecessary. + +However, if the checks you need to perform are complex, Typescript might +only be able to narrow the return type of your type guard to `boolean`. In such a case you will have to write the return type explicitly. + +> [!TIP] Type Guards in Documentation +> Type guards have a specific syntax for their return types (e.g. `value is null`) that isn't Source compliant. +> These types get replaced with `boolean` when the documentation is generated, so you don't have to worry +> about type guard types appearing in your documentation. diff --git a/docs/src/modules/2-bundle/5-documentation/1-cadet/1-cadet.md b/docs/src/modules/2-bundle/5-documentation/1-cadet/1-cadet.md index a00b746c6a..5eb0fd3f2a 100644 --- a/docs/src/modules/2-bundle/5-documentation/1-cadet/1-cadet.md +++ b/docs/src/modules/2-bundle/5-documentation/1-cadet/1-cadet.md @@ -21,6 +21,7 @@ Documentation should be written in [Markdown](https://www.markdownguide.org/gett the markdown is converted to raw HTML. ::: details Type Aware annotations + [JSDoc](https://jsdoc.app) (and TSDoc) both support annotations that express type information directly like `@type` or annotations that can optionally contain type information like `@param` and `@returns`. Since modules are already written in Typescript, there is no need to use type-aware annotations to document the type of an object. @@ -131,7 +132,8 @@ export const draw_connected = createDrawFunction('none', 'lines', '2D', false); The export will now be correctly recognized as a function: ![](./drawFunc.png) -There is no automatic way to make this distinction, so it is up to the bundle authors to make sure that this convention is adhered to. +The buildtools are configured to emit a warning if a variable is detected to have function signatures but cannot automatically rectify +this problem. ### Variables/Constants @@ -195,11 +197,81 @@ This causes `type_map` to be removed from the documentation, even if it is expor > Bundle `type_map`s are supposed to be internal implementation details hidden from users. If you forget to apply a `@hidden` tag to > your bundle's type map export, the build tools will show a warning. +### Use of `@example` + +`@example` blocks allow the developer to provide code snippets that serve as examples for for how the function/variable is intended to be +used. Consider an example from the `midi` bundle below: + +```ts {10-13} +/** + * Converts a letter name to its corresponding MIDI note. + * The letter name is represented in standard pitch notation. + * Examples are "A5", "Db3", "C#7". + * Refer to this mapping from + * letter name to midi notes. + * + * @param note given letter name + * @return the corresponding midi note + * @example + * ``` + * letter_name_to_midi_note('C4'); // Returns 60 + * ``` + * @function + */ +export function letter_name_to_midi_note(note: NoteWithOctave): MIDINote {} +``` + +When the documentation is renderered, a code block is produced: + +![](./docExample.png) + +Note that your code examples should be surrounded in a Markdown code block (using the triple backticks ```` ``` ````). This will +help Typedoc figure out what content belongs to your code block. The language specifier is not required here as it is assumed that +your code examples are written in Typescript. + +::: details Why you should use a code block + +If you use an inline code example, Typedoc might include things in your example that you didn't mean to include. Consider +a modified version of the example above: + +```ts {10} +/** + * Converts a letter name to its corresponding MIDI note. + * The letter name is represented in standard pitch notation. + * Examples are "A5", "Db3", "C#7". + * Refer to this mapping from + * letter name to midi notes. + * + * @param note given letter name + * @return the corresponding midi note + * @example letter_name_to_midi_note("C4"); // Returns 60 + * @function + */ +export function letter_name_to_midi_note(note: NoteWithOctave): MIDINote {} +``` + +Typedoc ends up including the `@function` tag as part of the code block: + +![](./wrongDocExample.png) + +Using a code block makes it clear exactly what is intended to be part of your example code block. +::: + +During documentation generation, the code in your code block will be parsed by a Typescript parser to ensure that you have written +valid Typescript code. It will print a warning message if your example code doesn't produce syntactically valid Typescript. + ### Other Tags There are a variety of tags that Typedoc supports. This list can be found [here](https://typedoc.org/documents/Tags.html). When writing your documentation you should use these tags to the best of your ability to help make your documentation as comprehensive as possible. +> [!INFO] Configuring Supported Tags +> There is an ESLint rule configured to error when you use an unknown tag. By default, the rule includes all tags supported by JSDoc, but Typedoc +> actually supports many more tags intended for customizing documentaton output. +> +> If you want to use a Typedoc supported tag that hasn't been configured for use, you can simply modify the `jsdoc/check-tag-names` +> rule to include your tag. + ## HTML Documentation The human readable documentation resides in the `build/documentation` folder. You can view its output [here](https://source-academy.github.io/modules/documentation). This is what the output for `make_point` looks like: diff --git a/docs/src/modules/2-bundle/5-documentation/1-cadet/docExample.png b/docs/src/modules/2-bundle/5-documentation/1-cadet/docExample.png new file mode 100644 index 0000000000..21fc942850 Binary files /dev/null and b/docs/src/modules/2-bundle/5-documentation/1-cadet/docExample.png differ diff --git a/docs/src/modules/2-bundle/5-documentation/1-cadet/wrongDocExample.png b/docs/src/modules/2-bundle/5-documentation/1-cadet/wrongDocExample.png new file mode 100644 index 0000000000..44f02de1a0 Binary files /dev/null and b/docs/src/modules/2-bundle/5-documentation/1-cadet/wrongDocExample.png differ diff --git a/docs/src/modules/2-bundle/6-compiling.md b/docs/src/modules/2-bundle/6-compiling.md index 7a5a35c931..8c9c2847a2 100644 --- a/docs/src/modules/2-bundle/6-compiling.md +++ b/docs/src/modules/2-bundle/6-compiling.md @@ -64,7 +64,7 @@ If you intend for your bundle to be consumed from other bundles, do the followin "./*": "./dist/*.js" }, "scripts": { - "postinstall": "yarn buildtools tsc" + "postinstall": "buildtools compile" } } ``` diff --git a/docs/src/repotools/2-linting.md b/docs/src/repotools/2-linting.md index 7cd580e3bb..ceb44479a4 100644 --- a/docs/src/repotools/2-linting.md +++ b/docs/src/repotools/2-linting.md @@ -25,7 +25,7 @@ When changing a rule's configuration, leave a comment explaining what the origin Where possible, also provide an explanation for why that rule has been configured as such: -<<< ../../../eslint.config.js#typescript {21} +<<< ../../../eslint.config.js#typescript {23} ## Linting Markdown Code Examples @@ -35,6 +35,15 @@ provides a processor that makes these code blocks available to ESLint. Because `typescript-eslint` requires a `tsconfig` to be able to lint any kind of Typescript code, it can't actually be used with any type-aware rules. Furthermore, code examples are usually incomplete snippets of Typescript/Javascript, so a lot of the typical rules in use don't really apply to these. Thus, code examples have their own separate configurations. +## Linting JSDoc Code Examples + +The `eslint-plugin-jsdoc` package provides an ESLint processor that can be used to extract `@example` code blocks and process them for linting. The processor actually +considers the example code blocks as Markdown code examples, so the same block used for configuring those is also used to configure JSDoc code examples. + +Similar to Markdown code blocks, the type-aware rules also do not work with JSDoc code examples. + +The code example processor is configured to only lint code examples that are contained within Markdown code blocks. + ## Linting JSON Files For the most part, there are only stylistic rules that need to be applied to JSON files. This is why this repository doesn't use the official `@eslint/json` package for linting JSON files. diff --git a/docs/src/repotools/6-docserver/1-overview.md b/docs/src/repotools/6-docserver/1-overview.md index 78fe8e9c4e..89fd93678f 100644 --- a/docs/src/repotools/6-docserver/1-overview.md +++ b/docs/src/repotools/6-docserver/1-overview.md @@ -7,13 +7,31 @@ Originally most of the developer documentation was contained within the Github r This documentation server is powered by [Vitepress](https://vitepress.dev), which takes Markdown files and renders them into a (mostly) static site. -## File Structure +## Base URL + +The entire developer documentation server is designed to be deployed at [](https://source-academy.github.io/modules/devdocs), which means that all links throughout +the docserver's source code will be calculated relative to this URL. This setting is controlled by the `base` option in the Vitepress config file. + +## Directory Structure All pages for the server are contained under `src`. [`vitepress-sidebar`](https://vitepress-sidebar.cdget.com) is being used to generate the sidebar for the server. This means that entries in the sidebar appear sorted according to the file/folder names from which they originate. This is why some folder have contents that are labelled `1-something`, `2-something` etc. Each item's value is taken from file's frontmatter, or if not present, the file's first header. -Folders produce item groups, the name of which can be customized using an `index.md` file within that folder. +If there is a file with the same name as its parent folder, then that file is used as the target for the path. For example: + +```dirtree +name: 1-bundles +children: +- 1-bundles.md +- name: example.png + comment: Picture that's displayed in 1-bundles.md +``` + +then the link `./1-bundles.html` will automatically display the `1-bundles.md` page. Using a folder this way lets you group assets intended for a single page. + +If instead you use an `index.md` page, then the the sidebar displays a menu group, the title of which is taken from the `index.md` page. +For example: ```dirtree name: bundles @@ -46,6 +64,8 @@ children: The above file structure produces the menu below: ![image](./menu.png) +Each page can then be referred to using `./bundles/1-getting-started/1-overview.html` or `./bundles/2-bundle/1-overview.html` etc. + Each item takes its title value from either the frontmatter (if available) or the first heading of each page. `index.md` files are only used to title the menus, they are not intended for navigation, though are navigable to if the user enters the address manually, so it is still recommended to keep some basic documentation in those pages or create rewrites so that users are automatically redirected away from those pages. Here are the contents of 2-bundle/index.md: diff --git a/docs/src/repotools/6-docserver/2-dirtree.md b/docs/src/repotools/6-docserver/2-dirtree.md index a59b2a2626..a8280686b4 100644 --- a/docs/src/repotools/6-docserver/2-dirtree.md +++ b/docs/src/repotools/6-docserver/2-dirtree.md @@ -2,14 +2,89 @@ The idea behind this plugin was inspired by [this](https://tree.nathanfriend.com/?) ASCII tree generator. + + +## Plugin Structure + +The plugin itself consists of 3 components: + +### 1. `markdown-it` plugin + +This component hooks into the Markdown code block renderer, allowing us to replace the rendering logic for code blocks when we detect the `dirtree` language. + +The directory plugin is located in the `markdown-tree` folder under the `lib` directory. Because of some of the `lodash` dependencies that get bundled, the plugin needs to be built to CJS rather than ESM. + ::: details Creating a Markdown-It Plugin The documentation for developers looking to create a Markdown-It plugin are woefully inadequate. Thus, most of this plugin was written based on the implementations of other plugins, such as the Vitepress Mermaid plugin and Vitepress Code snippet plugin. -It basically works by detecting when a code block has been assigned the `dirtree` language, parses the code block's content as YAML and converts that object into the directory structure that can then be rendered as text. - ::: +In this case, we first parse the YAML configuration, then render the directory tree as a string before passing it back to the Markdown code renderer so that the +directory tree gets rendered as a code block. + +### 2. Textmate grammar for the `dirtree` language + +To provide the colouring for the rendered directory trees, we first need to instruct Vitepress' builtin highlighter `shiki` on how to parse our rendered directory trees so that it can figure out what elements +need to be highlighted. + +`shiki` relies on [Textmate Grammars](https://macromates.com/manual/en/language_grammars) for parsing, so the plugin defines a grammar so that `shiki` can identify the different components of the directory tree: + + + + + + + + + + + + + + + + + + + + + + + + + + +
ComponentExplanationExamples
BranchGroups of 4 characters that together make up the graphic part of the "tree" +
    +
  •     
  • +
  • │   
  • +
  • ├── 
  • +
  • └── 
  • +
+
IdentifierThe name of a file or directory +
    +
  • filename.js
  • +
  • bin
  • +
+
CommentOptional comment describing the entry, beginning with two forward slashes // that gets rendered at the end the line// This is a comment
+ +Each line in the directory must consist of at least 1 branch (if it's not the root) and exactly 1 identifier. The comment is optional. + +Passing `shiki` this grammar also registers the `dirtree` langauge with `shiki`, so it doesn't get confused when trying to find highlighters. + +### 3. Highlighter for `shiki` + +`shiki` uses the grammar to parse each line of the directory tree, which then breaks that line into an array of tokens that gets passed to the code transformer. +Each token contains one of the aforementioned components. + +Since each branch component has a length of 4, we can determine the level to which each token belongs by dividing its position from the start of the line by 4 (i.e a branch token at +8 characters offset from line start is at level 2). Then we simply assign the colour corresponding to that indent level to that token. + +Vitepress uses the themes from Github by default, so the transformer is configured to select from a set of colours chosen from the `github-dark` and `github-light` themes. + +## Using the plugin within Markdown + To create your own directory tree, use the `dirtree` language with your markdown code block: ````md {1} diff --git a/docs/src/repotools/7-workflows/1-actions.md b/docs/src/repotools/7-workflows/1-actions.md index 694399e1b7..43fbed7fce 100644 --- a/docs/src/repotools/7-workflows/1-actions.md +++ b/docs/src/repotools/7-workflows/1-actions.md @@ -25,6 +25,8 @@ In the case of bundles or tabs, it also retrieves the name of the bundle or tab. In case of changes to the lockfile, it also determines which packages need to be rebuilt. This can happen when dependencies of dependencies change, so no change is present in the package's source code itself, but the lockfile itself has changed. +More detail about detecting changes can be found in [this section](./4-changes.md). + This information is used by both the initializer action and the workflows to determine the what tasks need to be executed. ## Initializer Action (`init/action.yml`) @@ -35,9 +37,24 @@ The initializer action combines the initialization steps that are necessary for 2. Install dependencies for that workspace (using `yarn workspaces focus`) 3. Install playwright if necessary (using `yarn playwright install --with-deps`) -> [!INFO] -> Though theoretically this action should also include `actions/checkout` since that action is repeated across -> the different packages, because the initializer action is a custom action, the code for the action needs to be -> checked out before this action can be run. +> [!INFO] What about actions/checkout? +> Theoretically this action should also include `actions/checkout` since this action is repeated across +> the different packages. However, the code for this action sits in the repository, so for Github to be able to execute +> the init action, it needs to first obtain its code, which means the repository must be checked out before this action +> can run. > > Thus, the initializer action has to run _after_ `actions/checkout` has completed and so it has to be a separate step. + +## Load Artifacts Action (`load-artifacts/action.yml`) + +When the CI executes, it will build any tab that has changes relative to the master branch. If the devserver also has +changes, then its tests will run. Since the devserver requires the compiled version of all tabs, we must build all +tabs before running the devserver's tests. + +Since some tabs might already have been built, there is no reason for us to go through the lengthy process of +installing those tabs' dependencies and rebuilding them. Instead, if we save the built tabs as workflow artifacts, +we can restore those tabs before running the devserver's tasks. All that remains then is to build the tabs that +haven't already been built. + +This action does this exact job: figuring out which tabs have already been built successfully and thus can be downloaded +and which tabs need to be built from scratch. diff --git a/docs/src/repotools/7-workflows/2-pull-request.md b/docs/src/repotools/7-workflows/2-pull-request.md index f97ba8ffc3..d915c2ec62 100644 --- a/docs/src/repotools/7-workflows/2-pull-request.md +++ b/docs/src/repotools/7-workflows/2-pull-request.md @@ -16,9 +16,13 @@ This job executes first, using the [Information Action](./1-actions.md#informati > The info action runs `git --no-pager diff master [directory]` from a package's root directory to determine if there > are any changes in the package. Because of this, it is also necessary to run a `git fetch`. +This job does find all the packages within the repository and writes their information to the Github Actions summary. However, it will only output packages +that have changes. This is so that when the following matrix jobs execute, we avoid creating jobs that basically require a single runner to be spun up just +for it to determine that the job need not execute. + ## 2. `libraries`, `bundles` and `tabs` -These three jobs are matrix jobs that run tasks for the individual packages. If the package has changes, then the job will run tests and `tsc` for the package. +These three jobs are matrix jobs that run tasks for the individual packages. The job will run tests and `tsc` for the package. This means that if the package requires `playwright` to run its tests, it will be installed during the init step. @@ -30,10 +34,24 @@ For libraries in particular, the job is run with both the `ubuntu-latest` and `w The `devserver` jobs only executes if there were changes within the dev server. Since it relies on bundles and tabs being compiled, it does rely on both the `bundles` and the `tabs` jobs to have completed. +Because the there might not have been any bundles or tabs with changes, those matrix jobs might not be considered 'completed', so if we just used the `needs` field, +the `devserver` job would not execute if there were no bundle or tab jobs. + +This is why we have to configure the `if` field to use the complex expression it does: if there were bundle and tab jobs that executed, then +check that they all completed successfully before running the devserver job (if necessary). If there weren't, then run the devserver job if there were changes +made to the devserver. + ## 4. `docserver` The `docserver` job only executes if there were changes made to the modules library or the docs themselves. It doesn't deploy the docs here, so it the call to `yarn build` only serves as to way to check that the docs can be generated without errors like dead links. +Similar to the `devserver` job, the `docserver` job must also be configured to execute even if no bundle, tab or library jobs execute. + ## 5. `repo-tasks` This job consists of checking `yarn constraints` and running ESLint for the entire repository. It doesn't rely on any of the other jobs, so it runs in parallel to all of them. + +## 6. `test` + +The final `test` job is a summary step: it only executes if every other job that was supposed to execute did so successfully. The successful completion of this +job represents a successful execution of the entire workflow. diff --git a/docs/src/repotools/7-workflows/4-changes.md b/docs/src/repotools/7-workflows/4-changes.md new file mode 100644 index 0000000000..e96ac7dc10 --- /dev/null +++ b/docs/src/repotools/7-workflows/4-changes.md @@ -0,0 +1,205 @@ +--- +title: Rebuilding Packages +--- +# Determining When to Rebuild a Package + +For this section, it is important to understand the distinction between workspace packages and Yarn packages: + + + + + + + + + + + + + + + + + + + + + +
WorkspaceYarn
SourceContained entirely within this repositoryPublished to and installed from a remote repository like npm.
Version range looks likeworkspace:^^1.8.1
+ +Specifically, we are concerned with detecting when to rebuild a workspace package. + +There are many workspace packages contained within this repository. It would be entirely unnecessary to rerun building and +testing for every single workspace package if changes were only made to one. It thus makes sense to implement some kind of +dependency tracking system to rebuild workspace packages only if they were affected by a change. + +Importantly, for the CI/CD pipeline, we are concerned only with changes relative to the **master** branch. + +For each workspace package, there are two main kinds of changes we must detect: +1. Non-transitive +2. Transitive + +## Non-Transitive Changes + +A non-transitive change is the simplest to determine: we can do this by checking if the directory containing the +workspace package contains any diffs relative to the master branch. This can be done using the following git command: + +```sh +git --no-pager diff --quiet origin/master -- directory +``` + +This git command exits with a non-zero exit code if it detected changes and zero if it did not. Programatically, +this is done by using the `@actions/exec` library's `getExecOutput` function: + +```js +const { exitCode } = await getExecOutput( + 'git', + ['--no-pager', 'diff', '--quiet', 'origin/master', '--', directory], + { + failOnStdErr: false, + ignoreReturnCode: true + } +); +return exitCode !== 0; +``` + +## Transitive Changes + +Transitive changes occur when one of the current workspace package's dependencies contain changes. For example, the `sound` bundle +relies on the `midi` bundle, so if the `midi` bundle has changes (and thus needs to be rebuilt), the `sound` bundle would +also need to be rebuilt, even if the `sound` bundle did not contain any changes. +Since the `plotly` bundle relies on the `sound` bundle, it too would also need to be rebuilt. + +```mermaid +graph LR + A[midi] + B[sound] + C[plotly] + + A -- rebuild triggers --> B + B -- rebuild triggers --> C +``` + +However, a workspace package is often dependent on more than just other workspace packages. In fact, most workspace packages +also rely on some Yarn packages, which in turn are also dependent on other Yarn packages. Normally, this dependency resolution process +is handled automatically by Yarn. + +When a change is made to a workspace package's dependencies (e.g. upgrading from `v1.0` to `v2.0` of `gl-matrix` to take advantage +of new features), that workspace package's `package.json` must reflect this change. Then, the [above](#non-transitive-changes) method +will be able to detect that that workspace package needs to be rebuilt. However, a workspace package's dependencies can change even +if there were no changes to its `package.json`. + +This can occur because of [semantic versioning](https://semver.org). Often, the version range specified in a `package.json` doesn't +specify a specific version to be used. For example, the `package.json` below actually specifies that the `curve` bundle is +compatible with anything that is a minor revision to version 2 of `gl-matrix`: + +```jsonc +{ + "name": "@sourceacademy/bundle-curve", + "dependencies": { + "gl-matrix": "^2.0.0" + } +} +``` + +This is good, because it provides us some flexibility: we're able to use newer versions of the same package that are mostly compatible but +might come with things like bug fixes. + +Now suppose that `gl-matrix` itself relies on another Yarn package like `lodash`: + +```jsonc +{ + "name": "gl-matrix", + "dependencies": { + "lodash": "^4.17.0" + } +} +``` + +Because we can only use 1 version of a package at any time, Yarn has to pick from the list of allowed available versions. In this case the +version range allows for `4.17.0` or `4.17.1` or several other possible versions of `lodash`. This process is called "resolution". + +Once Yarn finishes resolving all of these version ranges, it stores these resolutions in the lockfile. This allows us to use the same +resolutions and thus the same versions of packages across multiple machines. + +Suppose that Yarn determines that the version of `lodash` it wants to use for `gl-matrix` is `4.17.0`. This is installed +and the lockfile reflects that `lodash@^4.17.0` got resolved to `lodash@4.17.0` (note the absence of `^`). + +```mermaid +graph LR + A[curve] + B[gl-matrix] + C[lodash] + + D[2.0.0] + E[4.17.0] + + A -- requires --> B + B -- resolved to --> D + B -- requires --> C + C -- resolved to --> E +``` + +Now, suppose that the publishers of `lodash` find a minor bug in one of their functions and release a small patch to rectify it. They +publish this new version as version `4.17.1`. Notice that this version is still compatible with the `^4.17.0` specification. + +When the repository's automated dependency upgrading bot (Renovate Bot) detects this, it will attempt to cause Yarn to install version `4.17.1` +instead of `4.17.0` for `lodash`. It does this by updating the lockfile. But now we have a problem: the `curve` bundle transitively relies +on `lodash` through `gl-matrix`. + +```mermaid +graph LR + A[curve] + B[gl-matrix] + C[lodash] + + D[2.0.0] + E[4.17.0] + F[4.17.1] + + A -- requires --> B + B -- resolved to --> D + B -- requires --> C + C -- X --> E + C -- resolved to --> F +``` + +The `curve` bundle's dependency tree has changed, so we need to rebuild and test it (to make sure that it works with this new version of `lodash`). + +Yet, because there were no changes made to its `package.json` or to the code of the `curve` bundle, the `git diff` method won't be able +to detect that we need to rebuild the `curve` bundle. + +There is, however, one file that definitely changed: the lockfile. Thus, by parsing the difference between the lockfile on the master branch +and the local lockfile, we can determine which package resolutions changed. + +Then, using the `yarn why` command, we can determine which package is reliant on those specific resolutions. We can do this recursively +until we reach one of our workspace packages, at which point we know that that particular workspace needs to be rebuilt. + +Let us work through the above example: +1. Using `git diff`, we determine that the lockfile has changed relative to the master branch. +2. We compare the local lockfile with the master lockfile and determine that that `lodash@4.17.0` is present in the master lockfile, +while `lodash@4.17.1` is not. So now we know that we need to determine why `lodash@4.17.1` has been included. +3. We run `yarn why lodash` (without the version since the `why` command doesn't accept it) to obtain the list of packages that are +dependent on `lodash`. +4. For each package dependent on `lodash`, we check that that particular package actually depends on `lodash@4.17.1`, since they might +be dependent on other versions of `lodash`. In this case, we see that `gl-matrix@2.0.0` needs `lodash@4.17.1`. +5. We do this recursively until we reach our workspace package, and thus determine that it needs to be rebuilt. In this case, we see +that the `curve` bundle requires `gl-matrix@2.0.0` and thus relies on `lodash@4.17.1`, so it needs to be rebuilt. + +## Building the Dependency Tree + +Once we determine which workspace packages contain either transitive or non-transitive changes, we must then go through the rest of the +workspace packages to determine which other ones need to be rebuilt. From the example above, if the `midi` bundle needs to be rebuilt +because there were changes made to its code, we need to be able to determine that the `sound` bundle also needs to be rebuilt. And since +the `sound` bundle needs to be rebuilt, then the `plotly` bundle also needs to be rebuilt. + +This is done by building a simple dependency graph and then creating a topological ordering. Starting with the workspace packages that aren't +dependent on any other workspace packages and working our way to the end of the topological sort, we are able to determine exactly which +workspace packages need to be rebuilt. + +::: details Circular Dependency Graph + +A topological sort of course requires that our dependency graph doesn't contain a cycle. Yarn won't actually let you create a dependency +graph that is cyclic via workspace dependencies, so we're good to always assume that such a topological sort is possible. + +::: diff --git a/eslint.config.js b/eslint.config.js index 788d9a165b..bd5a53239b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -8,7 +8,7 @@ import stylePlugin from '@stylistic/eslint-plugin'; import vitestPlugin from '@vitest/eslint-plugin'; import { defineConfig } from 'eslint/config'; import * as importPlugin from 'eslint-plugin-import'; -import jsdocPlugin from 'eslint-plugin-jsdoc'; +import jsdocPlugin, { getJsdocProcessorPlugin } from 'eslint-plugin-jsdoc'; import * as mdx from 'eslint-plugin-mdx'; import reactPlugin from 'eslint-plugin-react'; import reactHooksPlugin from 'eslint-plugin-react-hooks'; @@ -123,7 +123,13 @@ export default defineConfig( name: 'Global JS/TS Stylistic Rules', plugins: { jsdoc: jsdocPlugin, + jsdocExamples: getJsdocProcessorPlugin({ + parser: tseslint.parser, + // Only lint markdown code blocks + exampleCodeRegex: /^[\s*]*```(?:[jt]s\s)?([\s\S]*)```\s*/ + }) }, + processor: 'jsdocExamples/examples', files: [ '**/*.{js,cjs,mjs}', '**/*.{ts,cts,tsx}', @@ -236,6 +242,15 @@ export default defineConfig( checkDestructured: false, disableMissingParamChecks: true }], + 'jsdoc/check-tag-names': ['error', { + // NOTE: Not all Typedoc supported tags are present here. Feel free to add any other + // Typedoc supported tags to this list + definedTags: ['category', 'categoryDescription', 'hidden', 'title'], + inlineTags: ['link', 'see'], + }], + 'jsdoc/empty-tags': ['error', { + tags: ['hidden'] + }], 'import/first': 'warn', 'import/newline-after-import': 'warn', @@ -301,6 +316,13 @@ export default defineConfig( rules: { 'no-unused-vars': 'off', // Use the typescript eslint rule instead + 'import/no-unresolved': [ + // disable in the CI since we don't install packages so all node packages + // become unresolvable + process.env.CI ? 'off' : 'error', + { ignore: [ 'js-slang/context', '^virtual:.+$' ] } + ], + 'jsdoc/no-types': 'warn', '@stylistic/type-annotation-spacing': ['warn', { overrides: { colon: { before: false, after: true } } }], @@ -315,6 +337,12 @@ export default defineConfig( // '@typescript-eslint/no-unnecessary-type-assertion': 'error', '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], // Was 'error' '@typescript-eslint/only-throw-error': 'error' + }, + settings: { + 'import/resolver': { + typescript: true, + node: true + } } }, // #endregion typescript @@ -461,10 +489,14 @@ export default defineConfig( 'vitest/expect-expect': ['error', { assertFunctionNames: ['expect*'], }], + 'vitest/hoisted-apis-on-top': 'error', 'vitest/no-alias-methods': 'off', // was 'error' 'vitest/no-conditional-expect': 'off', // was 'error' + 'vitest/no-disabled-tests': 'off', // was 'warn' 'vitest/no-focused-tests': ['warn', { fixable: false }], + 'vitest/no-standalone-expect': 'off', // was 'error' 'vitest/prefer-describe-function-title': 'warn', + 'vitest/prefer-import-in-mock': 'warn', 'vitest/require-top-level-describe': 'off', // was 'error' 'vitest/valid-describe-callback': 'off', // was 'error' 'vitest/valid-expect-in-promise': 'error', @@ -485,7 +517,10 @@ export default defineConfig( '**/vitest.config.{js,ts}' ], rules: { - 'import/extensions': ['error', 'ignorePackages'], + 'import/extensions': ['error', 'ignorePackages', { + ts: 'never', + cts: 'never' + }], } }, { diff --git a/lib/__test_mocks__/src/bundles/test0/src/index.ts b/lib/__test_mocks__/src/bundles/test0/src/index.ts index 7a93a435ab..af8549788d 100644 --- a/lib/__test_mocks__/src/bundles/test0/src/index.ts +++ b/lib/__test_mocks__/src/bundles/test0/src/index.ts @@ -19,3 +19,7 @@ export function test_function(_param0: string) { export function test_function2() { return context.moduleContexts.test0.state.data; } + +export function is_number(x: unknown): x is number { + return typeof x === 'number'; +} diff --git a/lib/buildtools/package.json b/lib/buildtools/package.json index 1989cedb9c..ff4cc44195 100644 --- a/lib/buildtools/package.json +++ b/lib/buildtools/package.json @@ -19,9 +19,10 @@ "dependencies": { "@sourceacademy/modules-repotools": "workspace:^", "@vitejs/plugin-react": "^5.1.0", - "@vitest/browser-playwright": "^4.0.4", - "@vitest/coverage-v8": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", + "@vitest/coverage-v8": "^4.0.18", "acorn": "^8.8.1", + "acorn-typescript": "^1.4.13", "astring": "^1.8.6", "chalk": "^5.0.1", "commander": "^14.0.0", @@ -32,7 +33,7 @@ "lodash": "^4.17.23", "typedoc": "^0.28.9", "vite": "^7.1.11", - "vitest": "^4.0.4" + "vitest": "^4.0.18" }, "scripts": { "build": "node ./build.js --dev", diff --git a/lib/buildtools/src/build/__tests__/all.test.ts b/lib/buildtools/src/build/__tests__/all.test.ts index 30985ddc42..8776f77571 100644 --- a/lib/buildtools/src/build/__tests__/all.test.ts +++ b/lib/buildtools/src/build/__tests__/all.test.ts @@ -1,20 +1,20 @@ import pathlib from 'path'; import { bundlesDir, tabsDir } from '@sourceacademy/modules-repotools/getGitRoot'; import { describe, expect, test, vi } from 'vitest'; -import * as docs from '../../build/docs/index.js'; -import * as modules from '../../build/modules/index.js'; import { getCommandRunner } from '../../commands/__tests__/testingUtils.js'; import { getBuildAllCommand } from '../../commands/build.js'; import * as lint from '../../prebuild/lint.js'; -import * as tsc from '../../prebuild/tsc.js'; import * as all from '../all.js'; +import * as docs from '../docs/index.js'; +import * as modules from '../modules/index.js'; +import * as tsc from '../modules/tsc.js'; vi.spyOn(all, 'buildAll'); const mockedBuildBundle = vi.spyOn(modules, 'buildBundle'); const mockedBuildTab = vi.spyOn(modules, 'buildTab'); const mockedBuildSingleBundleDocs = vi.spyOn(docs, 'buildSingleBundleDocs'); -const mockedRunTsc = vi.spyOn(tsc, 'runTsc').mockResolvedValue({ +const mockedRunTsc = vi.spyOn(tsc, 'runTypechecking').mockResolvedValue({ severity: 'success', input: {} as any, results: [], @@ -67,8 +67,7 @@ describe('Test the buildAll command', () => { }); await expect(runCommand(bundlePath, '--tsc')).commandSuccess(); - expect(tsc.runTsc).toHaveBeenCalledTimes(1); - expect(all.buildAll).toHaveBeenCalledTimes(1); + expect(tsc.runTypechecking).toHaveBeenCalledTimes(1); }); test('Regular execution for a bundle with --lint', async () => { @@ -115,7 +114,7 @@ describe('Test the buildAll command', () => { await expect(runCommand(bundlePath, '--tsc')).commandExit(); - expect(tsc.runTsc).toHaveBeenCalledTimes(1); + expect(tsc.runTypechecking).toHaveBeenCalledTimes(1); expect(modules.buildBundle).not.toHaveBeenCalled(); expect(docs.buildSingleBundleDocs).not.toHaveBeenCalled(); expect(all.buildAll).toHaveBeenCalledTimes(1); @@ -190,8 +189,7 @@ describe('Test the buildAll command', () => { }); await expect(runCommand(tabPath, '--tsc')).commandSuccess(); - expect(tsc.runTsc).toHaveBeenCalledTimes(1); - expect(all.buildAll).toHaveBeenCalledTimes(1); + expect(tsc.runTypechecking).toHaveBeenCalledTimes(1); }); test('Regular execution for a tab with --lint', async () => { @@ -230,7 +228,7 @@ describe('Test the buildAll command', () => { await expect(runCommand(tabPath, '--tsc')).commandExit(); - expect(tsc.runTsc).toHaveBeenCalledTimes(1); + expect(tsc.runTypechecking).toHaveBeenCalledTimes(1); expect(modules.buildTab).not.toHaveBeenCalled(); expect(all.buildAll).toHaveBeenCalledTimes(1); }); diff --git a/lib/buildtools/src/build/all.ts b/lib/buildtools/src/build/all.ts index bf9bc0add5..0012955428 100644 --- a/lib/buildtools/src/build/all.ts +++ b/lib/buildtools/src/build/all.ts @@ -3,9 +3,9 @@ import { compareSeverity } from '@sourceacademy/modules-repotools/utils'; import type { LogLevel } from 'typedoc'; import type { PrebuildOptions } from '../prebuild/index.js'; import { runEslint, type LintResult } from '../prebuild/lint.js'; -import { runTsc, type TscResult } from '../prebuild/tsc.js'; import { buildSingleBundleDocs } from './docs/index.js'; import { buildBundle, buildTab } from './modules/index.js'; +import { runTypechecking, type TscResult } from './modules/tsc.js'; interface BuildAllPrebuildError { severity: 'error'; @@ -39,7 +39,7 @@ export type BuildAllResult = BuildAllPrebuildError | BuildAllBundleResult | Buil */ export async function buildAll(input: InputAsset, prebuild: PrebuildOptions, outDir: string, logLevel: LogLevel): Promise { const [tscResult, lintResult] = await Promise.all([ - prebuild.tsc ? runTsc(input, true) : Promise.resolve(undefined), + prebuild.tsc ? runTypechecking(input) : Promise.resolve(undefined), prebuild.lint ? runEslint(input) : Promise.resolve(undefined) ]); diff --git a/lib/buildtools/src/build/docs/__tests__/json.test.ts b/lib/buildtools/src/build/docs/__tests__/json.test.ts index 0b978d997f..78258dc9fc 100644 --- a/lib/buildtools/src/build/docs/__tests__/json.test.ts +++ b/lib/buildtools/src/build/docs/__tests__/json.test.ts @@ -25,38 +25,48 @@ describe(buildJson, () => { type: 'bundle', name: 'test0', manifest: {}, - directory: `${bundlesDir}/test0` + directory: pathlib.join(bundlesDir, 'test0') }), project: async ({ testBundle }, use) => { - const app = await initTypedocForJson(testBundle, td.LogLevel.None); + const app = await initTypedocForJson(testBundle, td.LogLevel.Info); const project = await app.convert(); use(project!); } }); - test('Regular function', async ({ testBundle, project }) => { + test('Regular execution', async ({ testBundle, project }) => { const result = await buildJson(testBundle, outDir, project); expect(result.severity).toEqual('success'); expect(fs.writeFile).toHaveBeenCalledOnce(); const { calls: [[path, data]] } = mockedWriteFile.mock; expect(path).toEqual(pathlib.join(outDir, 'jsons', 'test0.json')); - expect(data).toMatchInlineSnapshot(` - "{ - "test_function": { - "kind": "function", - "name": "test_function", - "description": "

This is just some test function

", - "params": [ - [ - "_param0", - "string" - ] - ], - "retType": "number" - } - }" - `); + + const parsed = JSON.parse(data as string); + + expect(parsed).toHaveProperty('test_function', { + kind: 'function', + name: 'test_function', + description: '

This is just some test function

', + params: [ + ['_param0', 'string'] + ], + retType: 'number' + }); + + expect(parsed).toHaveProperty('is_number', { + kind: 'function', + name: 'is_number', + description: '

No description available

', + params: [ + ['x', 'unknown'] + ], + // validate that type guards have their return types correctly parsed + retType: 'boolean' + }); + + // @hidden or @internal tags should be respected + expect(parsed).not.toHaveProperty('test_function2'); }); test('Encountering an unrecognized type', async ({ testBundle, project }) => { @@ -74,25 +84,9 @@ describe(buildJson, () => { expect(fs.writeFile).toHaveBeenCalledOnce(); const { calls: [[path, data]] } = mockedWriteFile.mock; expect(path).toEqual(pathlib.join(outDir, 'jsons', 'test0.json')); - expect(data).toMatchInlineSnapshot(` - "{ - "test_function": { - "kind": "function", - "name": "test_function", - "description": "

This is just some test function

", - "params": [ - [ - "_param0", - "string" - ] - ], - "retType": "number" - }, - "TestType": { - "kind": "unknown" - } - }" - `); + + const parsed = JSON.parse(data as string); + expect(parsed).toHaveProperty('TestType', { kind: 'unknown' }); }); test('TypeAliases are ignored for JSON building', async ({ testBundle, project }) => { @@ -107,23 +101,19 @@ describe(buildJson, () => { expect(fs.writeFile).toHaveBeenCalledOnce(); const { calls: [[path, data]] } = mockedWriteFile.mock; + expect(path).toEqual(pathlib.join(outDir, 'jsons', 'test0.json')); - expect(data).toMatchInlineSnapshot(` - "{ - "test_function": { - "kind": "function", - "name": "test_function", - "description": "

This is just some test function

", - "params": [ - [ - "_param0", - "string" - ] - ], - "retType": "number" - } - }" - `); + + const parsed = JSON.parse(data as string); + expect(parsed).toHaveProperty('test_function', { + kind: 'function', + name: 'test_function', + description: '

This is just some test function

', + params: [ + ['_param0', 'string'] + ], + retType: 'number' + }); }); }); @@ -144,7 +134,8 @@ describe('Test parsers', () => { const signature = new td.SignatureReflection('testFunction', td.ReflectionKind.CallSignature, decl); signature.type = new td.IntrinsicType('void'); signature.comment = { - summary: [{ kind:'text', text: 'This is a summary' }] + summary: [{ kind:'text', text: 'This is a summary' }], + blockTags: [] as td.CommentTag[] } as td.Comment; decl.signatures = [signature]; @@ -241,7 +232,8 @@ describe('Test parsers', () => { const decl = new td.DeclarationReflection('testVar', td.ReflectionKind.Variable); decl.type = new td.IntrinsicType('string'); decl.comment = { - summary: [{ kind: 'text', text: 'This is a summary' }] + summary: [{ kind: 'text', text: 'This is a summary' }], + blockTags: [] as td.CommentTag[] } as td.Comment; const result = variableParser(decl); diff --git a/lib/buildtools/src/build/docs/__tests__/paths.test.ts b/lib/buildtools/src/build/docs/__tests__/paths.test.ts new file mode 100644 index 0000000000..bdddbb0cf1 --- /dev/null +++ b/lib/buildtools/src/build/docs/__tests__/paths.test.ts @@ -0,0 +1,20 @@ +import { describe, expect, it, vi } from 'vitest'; +import { convertToTypedocPath } from '../typedoc.js'; + +vi.mock(import('path'), async importOriginal => { + const { win32, posix } = await importOriginal(); + return { + default: win32, + posix, + }; +}); + +describe(convertToTypedocPath, () => { + it('works with rooted windows paths', () => { + expect(convertToTypedocPath('C:\\source\\source_academy\\modules')).toEqual('C:/source/source_academy/modules'); + }); + + it('works with unrooted windows paths', () => { + expect(convertToTypedocPath('source\\source_academy\\modules')).toEqual('source/source_academy/modules'); + }); +}); diff --git a/lib/buildtools/src/build/docs/json.ts b/lib/buildtools/src/build/docs/json.ts index 03c6e5276b..b447773cb1 100644 --- a/lib/buildtools/src/build/docs/json.ts +++ b/lib/buildtools/src/build/docs/json.ts @@ -2,6 +2,8 @@ import fs from 'fs/promises'; import pathlib from 'path'; import type { BuildResult, ResolvedBundle } from '@sourceacademy/modules-repotools/types'; +import { Parser } from 'acorn'; +import { tsPlugin } from 'acorn-typescript'; import * as td from 'typedoc'; import drawdown from './drawdown.js'; @@ -33,6 +35,34 @@ export interface ParserError { export type ParserResult = ParserError | ParserSuccess; +const markdownRegex = /^```[jt]sx?([\s\S]*)```\s*$/; + +/** + * Checks the declaration's comment for `@example` tags and validates their contents + * to make sure that they are valid Javascript + * + * @returns True if there is an example that doesn't validate, false otherwise + */ +function getInvalidExamples(parts: td.CommentTag[]): string[] { + // @ts-expect-error Idk what the type error here is + const parser = Parser.extend(tsPlugin()); + + return parts.flatMap(part => part.content.map(content => { + if (content.kind !== 'code') return false; + + const match = markdownRegex.exec(content.text); + const text = match ? match[1] : content.text; + + try { + parser.parse(text, { ecmaVersion: 6, sourceType: 'module' }); + return false; + } catch { + return text; + } + })) + .filter(x => x !== false); +} + const typeToName = (type: td.SomeType) => type.stringify(td.TypeContext.none); export const parsers: { [K in td.ReflectionKind]?: (obj: td.DeclarationReflection) => ParserResult @@ -62,6 +92,10 @@ export const parsers: { if (signature.comment) { description = drawdown(signature.comment.summary.map(({ text }) => text) .join('')); + const invalidExamples = getInvalidExamples(signature.comment.blockTags); + invalidExamples.forEach(example => { + warnings.push(`${obj.name} has an example tag that did not validate: ${example}`); + }); } else { description = '

No description available

'; } @@ -80,10 +114,19 @@ export const parsers: { }; }, [td.ReflectionKind.Variable](obj) { + const warnings: string[] = []; + if (obj.signatures) { + warnings.push(`${obj.name} is typed as a Variable, but function signatures were detected. Did you forget a @function tag?`); + } + let description: string; if (obj.comment) { description = drawdown(obj.comment.summary.map(({ text }) => text) .join('')); + const invalidExamples = getInvalidExamples(obj.comment.blockTags); + invalidExamples.forEach(example => { + warnings.push(`${obj.name} has an example tag that did not validate: ${example}`); + }); } else { description = '

No description available

'; } @@ -101,7 +144,7 @@ export const parsers: { description, type: typeToName(obj.type) }, - warnings: [] + warnings }; } }; diff --git a/lib/buildtools/src/build/docs/typedoc.ts b/lib/buildtools/src/build/docs/typedoc.ts index 14f3880da4..54563079ed 100644 --- a/lib/buildtools/src/build/docs/typedoc.ts +++ b/lib/buildtools/src/build/docs/typedoc.ts @@ -13,19 +13,42 @@ const typedocPackageOptions: td.Configuration.TypeDocOptions = { }; // #endregion commonOpts +/** + * Typedoc wants the format of each path to be that of the OS its running on, but with + * POSIX path separators. This function converts any path to that format. + */ +export function convertToTypedocPath(p: string) { + return p.split(pathlib.sep).join(pathlib.posix.sep); +} + /** * Initialize Typedoc to build the JSON documentation for each bundle */ -export function initTypedocForJson(bundle: ResolvedBundle, logLevel: td.LogLevel) { - // TypeDoc expects POSIX paths - const directoryAsPosix = bundle.directory.replace(/\\/g, '/'); - return td.Application.bootstrapWithPlugins({ +export async function initTypedocForJson(bundle: ResolvedBundle, logLevel: td.LogLevel) { + const directoryAsPosix = convertToTypedocPath(bundle.directory); + + const app = await td.Application.bootstrapWithPlugins({ ...typedocPackageOptions, name: bundle.name, logLevel, - entryPoints: [`${directoryAsPosix}/src/index.ts`], - tsconfig: `${directoryAsPosix}/tsconfig.json`, + entryPoints: [ + pathlib.posix.join(directoryAsPosix, 'src', 'index.ts') + ], + tsconfig: pathlib.posix.join(directoryAsPosix, 'tsconfig.json'), + }); + + app.converter.on(td.Converter.EVENT_CREATE_SIGNATURE, (_ctx, signature) => { + // Make sure that type guards get replaced with the appropriate intrinsic types + if (signature.type instanceof td.PredicateType) { + if (signature.type.asserts) { + signature.type = new td.IntrinsicType('void'); + } else { + signature.type = new td.IntrinsicType('boolean'); + } + } }); + + return app; } /** @@ -39,8 +62,8 @@ export function initTypedocForHtml(bundles: Record, logL logLevel, entryPoints: Object.values(bundles).map(({ directory }) => { // TypeDoc expects POSIX paths - const directoryAsPosix = directory.replace(/\\/g, '/'); - return `${directoryAsPosix}/dist/docs.json`; + const directoryAsPosix = convertToTypedocPath(directory); + return pathlib.posix.join(directoryAsPosix, 'dist', 'docs.json'); }), entryPointStrategy: 'merge', readme: pathlib.join(import.meta.dirname, 'docsreadme.md'), diff --git a/lib/buildtools/src/build/formatter.ts b/lib/buildtools/src/build/formatter.ts index 2fe6f02643..8666fc190b 100644 --- a/lib/buildtools/src/build/formatter.ts +++ b/lib/buildtools/src/build/formatter.ts @@ -1,7 +1,7 @@ import type { BuildResult, ResultTypeWithWarn } from '@sourceacademy/modules-repotools/types'; import chalk from 'chalk'; import { formatLintResult, type LintResult } from '../prebuild/lint.js'; -import { formatTscResult, type TscResult } from '../prebuild/tsc.js'; +import { formatTscResult, type TscResult } from './modules/tsc.js'; interface ResultsObject { tsc?: TscResult; diff --git a/lib/buildtools/src/build/modules/__tests__/building.test.ts b/lib/buildtools/src/build/modules/__tests__/building.test.ts index 7c3faf12ed..167d10375f 100644 --- a/lib/buildtools/src/build/modules/__tests__/building.test.ts +++ b/lib/buildtools/src/build/modules/__tests__/building.test.ts @@ -84,7 +84,7 @@ test('build tab', async () => { expect(fs.open).toHaveBeenCalledExactlyOnceWith(pathlib.join(outDir, 'tabs', 'tab0.js'), 'w'); function mockRequire(path: string) { - console.log(path); + // console.log(path); if (path === '@sourceacademy/modules-lib/tabs/utils') { return { defineTab: (x: any) => x diff --git a/lib/buildtools/src/prebuild/__tests__/tsc.test.ts b/lib/buildtools/src/build/modules/__tests__/tsc.test.ts similarity index 68% rename from lib/buildtools/src/prebuild/__tests__/tsc.test.ts rename to lib/buildtools/src/build/modules/__tests__/tsc.test.ts index c7eec7f010..3b510e1004 100644 --- a/lib/buildtools/src/prebuild/__tests__/tsc.test.ts +++ b/lib/buildtools/src/build/modules/__tests__/tsc.test.ts @@ -2,7 +2,7 @@ import pathlib from 'path'; import { bundlesDir, tabsDir } from '@sourceacademy/modules-repotools/getGitRoot'; import ts from 'typescript'; import { describe, expect, test, vi } from 'vitest'; -import { runTsc } from '../tsc.js'; +import { runTscCompile, runTypechecking } from '../tsc.js'; const mockedWriteFile = vi.hoisted(() => vi.fn<(arg0: string, arg1: string) => void>(() => undefined)); @@ -36,47 +36,57 @@ vi.mock(import('typescript'), async importOriginal => { }; }); -describe('Test the augmented tsc functionality', () => { - const bundlePath = pathlib.join(bundlesDir, 'test0'); - +describe(runTypechecking, () => { test('tsc on a bundle', async () => { - await runTsc({ + const bundlePath = pathlib.join(bundlesDir, 'test0'); + await runTypechecking({ type: 'bundle', directory: bundlePath, name: 'test0', manifest: {} - }, false); - - expect(ts.createProgram).toHaveBeenCalledTimes(2); - console.log(mockedWriteFile.mock.calls); - expect(mockedWriteFile).toHaveBeenCalledTimes(1); - const [[writePath]] = mockedWriteFile.mock.calls; - - expect(writePath).not.toEqual(pathlib.join(bundlePath, 'src', '__tests__', 'test0.test.js')); - }); - - test('tsc on a bundle with --noEmit', async () => { - await runTsc({ - type: 'bundle', - directory: bundlePath, - name: 'test0', - manifest: {} - }, true); + }); expect(ts.createProgram).toHaveBeenCalledTimes(1); - expect(mockedWriteFile).not.toBeCalled(); + expect(mockedWriteFile).not.toHaveBeenCalled(); }); test('tsc on a tab', async () => { const tabPath = pathlib.join(tabsDir, 'tab0'); - await runTsc({ + await runTypechecking({ type: 'tab', directory: tabPath, entryPoint: pathlib.join(tabPath, 'src', 'index.tsx'), name: 'tab0' - }, false); + }); expect(ts.createProgram).toHaveBeenCalledTimes(1); - expect(mockedWriteFile).not.toBeCalled(); + expect(mockedWriteFile).not.toHaveBeenCalled(); + }); +}); + +describe(runTscCompile, () => { + const bundlePath = pathlib.join(bundlesDir, 'test0'); + + test('tsc compile for bundle', async () => { + await runTscCompile({ + type: 'bundle', + directory: bundlePath, + name: 'test0', + manifest: {} + }); + + expect(ts.createProgram).toHaveBeenCalledOnce(); + expect(mockedWriteFile).toHaveBeenCalledOnce(); + + const [[writePath]] = mockedWriteFile.mock.calls; + + const testOutPath = pathlib.relative( + pathlib.join(bundlesDir, 'dist'), + '__tests__/test0.test.js' + ); + expect(writePath).not.toMatchPath(testOutPath); + + const indexOutPath = pathlib.relative(pathlib.join(bundlesDir, 'dist'), 'index.js'); + expect(writePath).not.toMatchPath(indexOutPath); }); }); diff --git a/lib/buildtools/src/prebuild/tsc.ts b/lib/buildtools/src/build/modules/tsc.ts similarity index 56% rename from lib/buildtools/src/prebuild/tsc.ts rename to lib/buildtools/src/build/modules/tsc.ts index 74de67c62e..16ed49789d 100644 --- a/lib/buildtools/src/prebuild/tsc.ts +++ b/lib/buildtools/src/build/modules/tsc.ts @@ -1,6 +1,6 @@ import fs from 'fs/promises'; import pathlib from 'path'; -import type { InputAsset, Severity } from '@sourceacademy/modules-repotools/types'; +import type { InputAsset, ResolvedBundle, Severity } from '@sourceacademy/modules-repotools/types'; import { findSeverity } from '@sourceacademy/modules-repotools/utils'; import chalk from 'chalk'; import ts from 'typescript'; @@ -27,6 +27,9 @@ export type TscResult = { results: ts.Diagnostic[]; }); +/** + * Find a tsconfig.json in the given directory, then read and parse it. + */ async function getTsconfig(srcDir: string): Promise { // Step 1: Read the text from tsconfig.json const tsconfigLocation = pathlib.join(srcDir, 'tsconfig.json'); @@ -64,18 +67,41 @@ async function getTsconfig(srcDir: string): Promise { } } -export async function runTsc(input: InputAsset, noEmit: boolean): Promise { - const tsconfigRes = await getTsconfig(input.directory); - if (tsconfigRes.severity === 'error') { - return { - ...tsconfigRes, - input - }; - } +/** + * Convert a collection of Typescript diagnostics to a Severity + */ +function processDiagnostics(diagnostics: ts.Diagnostic[]) { + return findSeverity(diagnostics, ({ category }) => { + switch (category) { + case ts.DiagnosticCategory.Error: + return 'error'; + case ts.DiagnosticCategory.Warning: + return 'warn'; + default: + return 'success'; + } + }); +} - const { results: tsconfig, fileNames } = tsconfigRes; +// Note that in both cases, we use the createProgram overload that takes +// a configuration object rather than each parameter separately. This is +// because this is the overload we mock for testing. +/** + * Run tsc but only for typechecking + */ +export async function runTypechecking(input: InputAsset): Promise { try { + + const tsconfigRes = await getTsconfig(input.directory); + if (tsconfigRes.severity === 'error') { + return { + ...tsconfigRes, + input + }; + } + + const { results: tsconfig, fileNames } = tsconfigRes; // tsc instance that only does typechecking // Type checking for both tests and source code is performed const typecheckProgram = ts.createProgram({ @@ -89,47 +115,66 @@ export async function runTsc(input: InputAsset, noEmit: boolean): Promise { - switch (category) { - case ts.DiagnosticCategory.Error: - return 'error'; - case ts.DiagnosticCategory.Warning: - return 'warn'; - default: - return 'success'; - } - }); + const severity = processDiagnostics(diagnostics); + return { + severity, + input, + results: diagnostics + }; + } catch (error) { + return { + severity: 'error', + error, + input + }; + } +} - if (input.type === 'bundle' && severity !== 'error' && !noEmit) { - // If noEmit isn't specified, then run tsc again without including test - // files and actually output the files - const filesWithoutTests = fileNames.filter(p => { - const segments = p.split(pathlib.posix.sep); - return !segments.includes('__tests__'); - }); - // tsc instance that does compilation - // only compiles non test files - const compileProgram = ts.createProgram({ - rootNames: filesWithoutTests, - options: { - ...tsconfig, - noEmit: false - }, - oldProgram: typecheckProgram - }); - compileProgram.emit(); +/** + * Run tsc but for compiling bundles + */ +export async function runTscCompile(input: ResolvedBundle, oldProgram?: ts.Program): Promise { + try { + const tsconfigRes = await getTsconfig(input.directory); + if (tsconfigRes.severity === 'error') { + return { + ...tsconfigRes, + input + }; } + const { results: tsconfig, fileNames } = tsconfigRes; + const filesWithoutTests = fileNames.filter(p => { + const segments = p.split(pathlib.posix.sep); + return !segments.includes('__tests__') && !segments.includes('__mocks__'); + }); + + // tsc instance that does compilation + // only compiles non test files + const compileProgram = ts.createProgram({ + rootNames: filesWithoutTests, + options: { + ...tsconfig, + noEmit: false + }, + oldProgram + }); + + const results = compileProgram.emit(); + const diagnostics = ts.getPreEmitDiagnostics(compileProgram) + .concat(results.diagnostics); + + const severity = processDiagnostics(diagnostics); return { severity, - results: diagnostics, - input + input, + results: diagnostics }; } catch (error) { return { severity: 'error', - input, - error + error, + input }; } } diff --git a/lib/buildtools/src/commands/__tests__/build.test.ts b/lib/buildtools/src/commands/__tests__/build.test.ts index e9631be5a1..6311300dc7 100644 --- a/lib/buildtools/src/commands/__tests__/build.test.ts +++ b/lib/buildtools/src/commands/__tests__/build.test.ts @@ -6,13 +6,13 @@ import type { BuildResult, Severity } from '@sourceacademy/modules-repotools/typ import { beforeEach, describe, expect, test, vi, type MockInstance } from 'vitest'; import * as json from '../../build/docs/json.js'; import * as modules from '../../build/modules/index.js'; +import * as tscRunner from '../../build/modules/tsc.js'; import * as lintRunner from '../../prebuild/lint.js'; -import * as tscRunner from '../../prebuild/tsc.js'; import * as commands from '../build.js'; import { getCommandRunner } from './testingUtils.js'; const mockedRunEslint = vi.spyOn(lintRunner, 'runEslint'); -const mockedRunTsc = vi.spyOn(tscRunner, 'runTsc'); +const mockedRunTsc = vi.spyOn(tscRunner, 'runTypechecking'); vi.mock(import('typedoc'), async importOriginal => { const original = await importOriginal(); @@ -60,6 +60,7 @@ type BuildFunctionsFilter> = { * @param cmdArgs Arguments to pass to the command handler */ function testBuildCommand>( + this: boolean | void, commandName: string, getter: () => Command, obj: T, @@ -88,7 +89,9 @@ function testBuildCommand>( } } - describe(`Testing ${commandName} command`, { timeout: 10000 }, () => { + const describer = this ? describe.skip : describe; + + describer(`Testing ${commandName} command`, { timeout: 10000 }, () => { const mockedBuilder = vi.spyOn(obj, funcName as any) as MockInstance<() => Promise>; const builder = obj[funcName]; const runCommand = getCommandRunner(getter); @@ -209,7 +212,7 @@ function testBuildCommand>( input: {} as any }); await expect(runCommand(...cmdArgs, '--tsc')).commandSuccess(); - expect(tscRunner.runTsc).toHaveBeenCalledTimes(1); + expect(tscRunner.runTypechecking).toHaveBeenCalledTimes(1); expect(mockedBuilder).toHaveBeenCalledTimes(1); assertDirectories(true); }); @@ -221,7 +224,7 @@ function testBuildCommand>( input: {} as any }); await expect(runCommand(...cmdArgs, '--tsc')).commandExit(); - expect(tscRunner.runTsc).toHaveBeenCalledTimes(1); + expect(tscRunner.runTypechecking).toHaveBeenCalledTimes(1); expect(mockedBuilder).toHaveBeenCalledTimes(0); assertDirectories(false); }); @@ -233,7 +236,7 @@ function testBuildCommand>( input: {} as any }); await expect(runCommand(...cmdArgs, '--tsc')).commandSuccess(); - expect(tscRunner.runTsc).toHaveBeenCalledTimes(1); + expect(tscRunner.runTypechecking).toHaveBeenCalledTimes(1); expect(mockedBuilder).toHaveBeenCalledTimes(1); assertDirectories(true); }); @@ -247,7 +250,7 @@ function testBuildCommand>( input: {} as any }); await expect(runCommand(...cmdArgs, '--tsc')).commandExit(); - expect(tscRunner.runTsc).toHaveBeenCalledTimes(1); + expect(tscRunner.runTypechecking).toHaveBeenCalledTimes(1); expect(mockedBuilder).toHaveBeenCalledTimes(0); assertDirectories(false); } finally { @@ -273,7 +276,7 @@ function testBuildCommand>( await expect(runCommand(...cmdArgs, '--lint', '--tsc')).commandSuccess(); expect(lintRunner.runEslint).toHaveBeenCalledTimes(1); - expect(tscRunner.runTsc).toHaveBeenCalledTimes(1); + expect(tscRunner.runTypechecking).toHaveBeenCalledTimes(1); expect(mockedBuilder).toHaveBeenCalledTimes(1); assertDirectories(true); }); @@ -281,9 +284,13 @@ function testBuildCommand>( }); } +testBuildCommand.skip = function (...args: Parameters) { + return testBuildCommand.call(true, ...args); +}; + const bundlePath = pathlib.join(bundlesDir, 'test0'); const tabPath = pathlib.join(tabsDir, 'tab0'); testBuildCommand('Docs', commands.getBuildDocsCommand, json, 'buildJson', false, ['jsons'], bundlePath); -testBuildCommand('Bundles', commands.getBuildBundleCommand, modules, 'buildBundle', true, ['bundles'], bundlePath); -testBuildCommand('Tabs', commands.getBuildTabCommand, modules, 'buildTab', true, ['tabs'], tabPath); +testBuildCommand.skip('Bundles', commands.getBuildBundleCommand, modules, 'buildBundle', true, ['bundles'], bundlePath); +testBuildCommand.skip('Tabs', commands.getBuildTabCommand, modules, 'buildTab', true, ['tabs'], tabPath); diff --git a/lib/buildtools/src/commands/__tests__/compile.test.ts b/lib/buildtools/src/commands/__tests__/compile.test.ts new file mode 100644 index 0000000000..499a4db188 --- /dev/null +++ b/lib/buildtools/src/commands/__tests__/compile.test.ts @@ -0,0 +1,44 @@ +import pathlib from 'path'; +import { bundlesDir, tabsDir } from '@sourceacademy/modules-repotools/getGitRoot'; +import type { ResolvedBundle, ResolvedTab } from '@sourceacademy/modules-repotools/types'; +import { describe, expect, test, vi } from 'vitest'; +import * as tsc from '../../build/modules/tsc.js'; +import { getCompileCommand } from '../build.js'; +import { getCommandRunner } from './testingUtils.js'; + +const mockedTscCompile = vi.spyOn(tsc, 'runTscCompile'); + +describe('Test compile command', () => { + const runCommand = getCommandRunner(getCompileCommand); + + test('Compile a bundle successfully', async () => { + const inputBundle: ResolvedBundle = { + directory: pathlib.join(bundlesDir, 'test0'), + name: 'test0', + manifest: {}, + type: 'bundle' + }; + + mockedTscCompile.mockResolvedValueOnce({ + severity: 'success', + results: [], + input: inputBundle + }); + + await expect(runCommand(inputBundle.directory)).commandSuccess(); + expect(mockedTscCompile).toHaveBeenCalledOnce(); + }); + + test('Compile a tab', async () => { + const tabDir = pathlib.join(tabsDir, 'tab0'); + const inputTab: ResolvedTab = { + type: 'tab', + directory: tabDir, + entryPoint: pathlib.join(tabDir, 'src', 'index.tsx'), + name: 'tab0' + }; + + await expect(runCommand(inputTab.directory)).commandExit(); + expect(mockedTscCompile).not.toHaveBeenCalled(); + }); +}); diff --git a/lib/buildtools/src/commands/build.ts b/lib/buildtools/src/commands/build.ts index a57fb4eebb..48f36bec49 100644 --- a/lib/buildtools/src/commands/build.ts +++ b/lib/buildtools/src/commands/build.ts @@ -7,6 +7,7 @@ import { buildHtml, buildSingleBundleDocs } from '../build/docs/index.js'; import { formatResult, formatResultObject } from '../build/formatter.js'; import { buildBundle, buildTab } from '../build/modules/index.js'; import { buildManifest } from '../build/modules/manifest.js'; +import { formatTscResult, runTscCompile } from '../build/modules/tsc.js'; import { runBuilderWithPrebuild } from '../prebuild/index.js'; import * as cmdUtils from './commandUtils.js'; @@ -143,3 +144,24 @@ export const getBuildHtmlCommand = () => new Command('html') console.log(formatResult(htmlResult, 'html')); cmdUtils.processResult(htmlResult, false); }); + +export const getCompileCommand = () => new Command('compile') + .description('Compiles the bundle at the given directory using tsc') + .argument('[bundle]', 'Directory in which the bundle\'s source files are located', process.cwd()) + .action(async directory => { + const bundle = await resolveSingleBundle(directory); + if (!bundle) { + cmdUtils.logCommandErrorAndExit(`No bundle was found at ${directory}`); + } + + if (bundle.severity === 'error') { + cmdUtils.logCommandErrorAndExit(bundle); + } + + const compileResult = await runTscCompile(bundle.bundle); + if (compileResult.severity === 'error') { + cmdUtils.logCommandErrorAndExit(formatTscResult(compileResult)); + } + + console.log(chalk.greenBright(`Finished compiling ${bundle.bundle.name}`)); + }); diff --git a/lib/buildtools/src/commands/main.ts b/lib/buildtools/src/commands/main.ts index 1aad7edcd2..9bdb33324c 100644 --- a/lib/buildtools/src/commands/main.ts +++ b/lib/buildtools/src/commands/main.ts @@ -1,5 +1,5 @@ import { Command } from '@commander-js/extra-typings'; -import { getBuildCommand, getBuildHtmlCommand, getManifestCommand } from './build.js'; +import { getBuildCommand, getBuildHtmlCommand, getCompileCommand, getManifestCommand } from './build.js'; import { getListCommand, getValidateCommand } from './list.js'; import { getLintCommand, getLintGlobalCommand, getPrebuildAllCommand, getTscCommand } from './prebuild.js'; import getHttpServerCommand from './server.js'; @@ -9,6 +9,7 @@ import { getTestAllCommand, getTestCommand } from './testing.js'; const commands: (() => Command)[] = [ getBuildCommand, getBuildHtmlCommand, + getCompileCommand, getHttpServerCommand, getLintCommand, getLintGlobalCommand, diff --git a/lib/buildtools/src/commands/prebuild.ts b/lib/buildtools/src/commands/prebuild.ts index 294cbe50e4..7643986108 100644 --- a/lib/buildtools/src/commands/prebuild.ts +++ b/lib/buildtools/src/commands/prebuild.ts @@ -5,9 +5,9 @@ import { resolveEitherBundleOrTab } from '@sourceacademy/modules-repotools/manif import { divideAndRound } from '@sourceacademy/modules-repotools/utils'; import chalk from 'chalk'; import { ESLint } from 'eslint'; +import { formatTscResult, runTypechecking } from '../build/modules/tsc.js'; import { runPrebuild } from '../prebuild/index.js'; import { formatLintResult, lintGlobal, runEslint } from '../prebuild/lint.js'; -import { formatTscResult, runTsc } from '../prebuild/tsc.js'; import { logCommandErrorAndExit } from './commandUtils.js'; export const concurrencyOption = new Option('--concurrency ') @@ -119,9 +119,8 @@ export const getLintGlobalCommand = () => new Command('lintglobal') export const getTscCommand = () => new Command('tsc') .description('Run tsc for the given directory, or the current directory if no directory is specified') .argument('[directory]', 'Directory to run tsc in', process.cwd()) - .option('--no-emit', 'Prevent the typescript compiler from outputting files regardless of the tsconfig setting') .option('--ci', process.env.CI) - .action(async (directory, { emit, ci }) => { + .action(async (directory, { ci }) => { const fullyResolved = pathlib.resolve(directory); const resolveResult = await resolveEitherBundleOrTab(fullyResolved); @@ -133,7 +132,7 @@ export const getTscCommand = () => new Command('tsc') logCommandErrorAndExit(resolveResult); } - const result = await runTsc(resolveResult.asset, !emit); + const result = await runTypechecking(resolveResult.asset); console.log(formatTscResult(result)); switch (result.severity) { diff --git a/lib/buildtools/src/prebuild/index.ts b/lib/buildtools/src/prebuild/index.ts index 2b6de58b32..2bb4e23a83 100644 --- a/lib/buildtools/src/prebuild/index.ts +++ b/lib/buildtools/src/prebuild/index.ts @@ -2,8 +2,8 @@ import fs from 'fs/promises'; import pathlib from 'path'; import type { InputAsset } from '@sourceacademy/modules-repotools/types'; import { compareSeverity } from '@sourceacademy/modules-repotools/utils'; +import { runTypechecking, type TscResult } from '../build/modules/tsc.js'; import { runEslint, type LintResult } from './lint.js'; -import { runTsc, type TscResult } from './tsc.js'; export type PrebuildOptions = { tsc?: boolean; @@ -30,7 +30,7 @@ export async function runBuilderWithPrebuild> { const promises: [Promise, Promise] = [ - !tsc ? Promise.resolve(undefined) : runTsc(asset, false), + !tsc ? Promise.resolve(undefined) : runTypechecking(asset), !lint ? Promise.resolve(undefined) : runEslint(asset), ]; @@ -63,7 +63,7 @@ export async function runBuilderWithPrebuild { +vi.mock(import('chalk'), () => { const mockChalkFunction = new Proxy((x: string) => x, { get: () => mockChalkFunction }); @@ -20,7 +20,7 @@ vi.mock('chalk', () => { default: new Proxy({}, { get: () => mockChalkFunction }) - }; + } as any; }); vi.mock(import('fs/promises'), async importOriginal => { diff --git a/lib/buildtools/workspacer.py b/lib/buildtools/workspacer.py index 433f215b64..76ea97093a 100644 --- a/lib/buildtools/workspacer.py +++ b/lib/buildtools/workspacer.py @@ -28,7 +28,17 @@ def get_assets(git_root: str, asset: Literal['bundle', 'tab']): continue yield name, full_path -def update_json(git_root: str, asset: Literal['bundle', 'tab'], file_name: Literal['package','tsconfig'], updater: Callable[[str, str, Any], Any]): +def update_jsons(git_root: str, asset: Literal['bundle', 'tab'], file_name: Literal['package','tsconfig'], updater: Callable[[str, str, Any], Any]): + """ + For each bundle or tab (as specified by the asset parameter), load either the tsconfig.json or package.json (as specified by the file_name parameter) + and use the provided updater function to modify its contents. Then save the modified JSON object back to the file it was read from. + + :param git_root: Path to the root of the git repository + :param asset: Asset type. Either 'bundle' or 'tab'. + :param file_name: File to modify. Either 'tsconfig', for tsconfig.jsons or 'package' for package.jsons + :param updater: Function that gets passed the JSON object that is either the tsconfig.json or package.json + for the bundle/tab being processed. It should return the JSON object that represents the new tsconfig or package.json value. + """ for name, full_path in get_assets(git_root, asset): try: with open(f'{full_path}/{file_name}.json') as file: @@ -36,22 +46,24 @@ def update_json(git_root: str, asset: Literal['bundle', 'tab'], file_name: Liter updated = updater(name, full_path, original) if not updated: - raise RuntimeError(f'Updated returned an empty object for {asset} {name}') + raise RuntimeError(f'Updater returned an empty object for {asset} {name}') with open(f'{full_path}/{file_name}.json', 'w') as file: json.dump(updated, file, indent=2) file.write('\n') except Exception as e: - print(f'{e} occurred with {full_path}/{file_name}.json') + print(f'Error occurred with {full_path}/{file_name}.json: {e}') async def main(): git_root = await get_git_root() def updater(name: str, full_path: str, obj: Any): - del obj['compilerOptions']['noEmit'] + if 'postinstall' in obj['scripts']: + obj['scripts']['postinstall'] = 'buildtools compile' + return obj - update_json(git_root, 'bundle', 'tsconfig', updater) + update_jsons(git_root, 'bundle', 'package', updater) if __name__ == '__main__': aio.run(main()) diff --git a/lib/lintplugin/package.json b/lib/lintplugin/package.json index 60aa943a8b..a8f75d0048 100644 --- a/lib/lintplugin/package.json +++ b/lib/lintplugin/package.json @@ -30,16 +30,16 @@ "@sourceacademy/modules-buildtools": "workspace:^", "@sourceacademy/modules-repotools": "workspace:^", "@stylistic/eslint-plugin": "^4.4.1", - "@typescript-eslint/rule-tester": "^8.39.0", - "@typescript-eslint/utils": "^8.39.0", - "@vitest/eslint-plugin": "^1.3.4", + "@typescript-eslint/rule-tester": "^8.53.1", + "@typescript-eslint/utils": "^8.53.1", + "@vitest/eslint-plugin": "^1.6.6", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsdoc": "^62.0.0", "eslint-plugin-react": "^7.37.4", "eslint-plugin-react-hooks": "^5.1.0", "globals": "^15.11.0", "typescript": "^5.8.2", - "typescript-eslint": "^8.33.1" + "typescript-eslint": "^8.53.1" }, "scripts": { "build": "node ./build.js", diff --git a/lib/markdown-tree/package.json b/lib/markdown-tree/package.json index 96623017b9..d08ffaa91b 100644 --- a/lib/markdown-tree/package.json +++ b/lib/markdown-tree/package.json @@ -5,11 +5,11 @@ "private": true, "type": "module", "devDependencies": { - "@shikijs/types": "^3.15.0", "@sourceacademy/modules-buildtools": "workspace:^", "@sourceacademy/modules-repotools": "workspace:^", "@types/lodash": "^4.14.198", "@types/markdown-it": "^14.1.2", + "shiki": "^3.15.0", "typescript": "^5.8.2" }, "exports": { diff --git a/lib/markdown-tree/src/__tests__/transformer.test.ts b/lib/markdown-tree/src/__tests__/transformer.test.ts new file mode 100644 index 0000000000..9abb5d578e --- /dev/null +++ b/lib/markdown-tree/src/__tests__/transformer.test.ts @@ -0,0 +1,160 @@ +import { createHighlighter, type ShikiTransformer, type ThemedToken } from 'shiki'; +import { describe, expect, it as baseIt } from 'vitest'; +import { parseContent } from '../structure'; +import { dirtreeTransformer, grammar } from '../transformer'; + +interface Fixtures { + transformer: ShikiTransformer; + transform: (input: string) => ThemedToken[][]; + highlighter: Awaited>; +} + +const it = baseIt.extend({ + transformer: ({}, use) => { + const transformer = dirtreeTransformer({ + lightColours: ['1', '2', '3', '4'], + }); + return use(transformer); + }, + highlighter: async ({}, use) => { + const highlighter = await createHighlighter({ + langs: [grammar], + themes: ['github-light'], + }); + await use(highlighter); + highlighter.dispose(); + }, + transform: ({ highlighter, transformer }, use) => use((input: string) => { + const [generated] = parseContent(input, '/dummy/dir', {}); + + const { tokens } = highlighter.codeToTokens(generated, { + theme: 'github-light', + transformers: [transformer], + // @ts-expect-error dirtree is not in the official Shiki lang list + lang: 'dirtree', + }); + return transformer.tokens!.call({ + options: { + lang: 'dirtree' + } + } as any, tokens)!; + }) +}); + +/** + * Convert each line of tokens into a joined string, + * verifying that the beginning offsets for each line are correct + * \ + * Also collects the colours used in each line + */ +function tokenJoiner(tokens: ThemedToken[][]): { + lines: string[]; + colours: string[][]; +} { + let lineOffset = 0; + + const output: string[] = []; + const colours: string[][] = []; + + for (const line of tokens) { + expect(line[0].offset).toEqual(lineOffset); + const joinedLine = line.map(token => token.content).join(''); + output.push(joinedLine); + + const lineColours: string[] = []; + for (const token of line) { + if (token.content === ' ') continue; // skip spaces + if (token.htmlStyle === undefined) continue; + + lineColours.push(token.htmlStyle['--shiki-light']); + } + colours.push(lineColours); + + lineOffset += joinedLine.length + 1; // +1 for newline + } + + return { lines: output, colours }; +} + +describe(dirtreeTransformer, () => { + it('correctly highlights a simple directory tree', ({ transform }) => { + const input = ` + name: root + children: + - dir1 + - dir2 + `; + + const tokens = transform(input); + const { lines, colours } = tokenJoiner(tokens); + + expect(lines.length).toEqual(3); // 3 lines + expect(lines[0]).toEqual('root'); + + expect(lines[1]).toEqual('├── dir1'); + expect(colours[1]).toEqual(['1', '1']); + + expect(lines[2]).toEqual('└── dir2'); + expect(colours[2]).toEqual(['1', '1']); + }); + + it('correctly handles indent levels with no overlap', ({ transform }) => { + const input = ` + name: root + children: + - name: dir1 + children: + - name: dir2 + children: + - dir3 + `; + const tokens = transform(input); + const { lines, colours } = tokenJoiner(tokens); + + expect(lines.length).toEqual(4); // 4 lines + expect(lines[0]).toEqual('root'); + + expect(lines[1]).toEqual('└── dir1'); + expect(colours[1]).toEqual(['1', '1']); + + expect(lines[2]).toEqual(' └── dir2'); + expect(colours[2]).toEqual(['2', '2']); + + expect(lines[3]).toEqual(' └── dir3'); + expect(colours[3]).toEqual(['3', '3']); + }); + + it('correctly handles indent levels with overlaps', ({ transform }) => { + const input = ` + name: root + children: + - name: dir1 + children: + - name: dir2 + children: + - dir3 + - dir4 + - dir5 + `; + const tokens = transform(input); + const { lines, colours } = tokenJoiner(tokens); + expect(lines.length).toEqual(6); // 6 lines + + expect(lines[0]).toEqual('root'); + + expect(lines[1]).toEqual('├── dir1'); + expect(colours[1]).toEqual(['1', '1']); + + expect(lines[2]).toEqual('│ ├── dir2'); + expect(colours[2]).toEqual(['1', '2', '2']); + + expect(lines[3]).toEqual('│ │ └── dir3'); + expect(colours[3]).toEqual(['1', '2', '3', '3']); + + expect(lines[4]).toEqual('│ └── dir4'); + expect(colours[4]).toEqual(['1', '2', '2']); + + expect(lines[5]).toEqual('└── dir5'); + expect(colours[5]).toEqual(['1', '1']); + }); +}); diff --git a/lib/markdown-tree/src/transformer.ts b/lib/markdown-tree/src/transformer.ts index 789a0ab676..c5779015d5 100644 --- a/lib/markdown-tree/src/transformer.ts +++ b/lib/markdown-tree/src/transformer.ts @@ -22,9 +22,8 @@ const githubDarkColours = [ ]; // Assemble the Regex expression using the line strings -const reString = Object.entries(LINE_STRINGS) - .filter(([key]) => key !== 'EMPTY') - .map(([, value]) => `(?:${value})`) +const reString = Object.values(LINE_STRINGS) + .map(value => `(?:${value})`) .join('|'); const branchRE = new RegExp(reString, 'g'); @@ -77,7 +76,7 @@ export interface TransformerOptions { /** * Returns a {@link ShikiTransformer} for colouring dirtree diagrams */ -export function dirtreeTransformer(options: TransformerOptions = {}): ShikiTransformer { +export function dirtreeTransformer(options: TransformerOptions = {}) { const lightColours = options?.lightColours || githubLightColours; const darkColours = options?.darkColours || githubDarkColours; @@ -138,5 +137,5 @@ export function dirtreeTransformer(options: TransformerOptions = {}): ShikiTrans return newTokens; } - }; + } satisfies ShikiTransformer; } diff --git a/lib/markdown-tree/tsconfig.json b/lib/markdown-tree/tsconfig.json index 3ed7a5302f..1aba568b01 100644 --- a/lib/markdown-tree/tsconfig.json +++ b/lib/markdown-tree/tsconfig.json @@ -5,12 +5,5 @@ ], "include": [ "./src" - ], - "compilerOptions": { - "paths": { - "shiki": [ - "../../node_modules/@shikijs/types" - ] - } - } + ] } diff --git a/lib/modules-lib/package.json b/lib/modules-lib/package.json index 4b7878af1d..0227e90625 100644 --- a/lib/modules-lib/package.json +++ b/lib/modules-lib/package.json @@ -5,10 +5,11 @@ "type": "module", "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", + "@types/lodash": "^4.14.198", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.1", "@vitejs/plugin-react": "^5.1.0", - "@vitest/browser-playwright": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", "eslint": "^9.35.0", "playwright": "^1.55.1", "typedoc": "^0.28.9", @@ -16,8 +17,8 @@ "typedoc-plugin-markdown": "^4.7.0", "typedoc-plugin-rename-defaults": "^0.7.3", "typescript": "^5.8.2", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "exports": { "./tabs/index": null, @@ -31,9 +32,10 @@ "./*": "./dist/*.js" }, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", - "js-slang": "^1.0.81", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", + "js-slang": "^1.0.85", + "lodash": "^4.17.23", "react": "^18.3.1", "react-dom": "^18.3.1" }, diff --git a/lib/modules-lib/src/__tests__/hextocolor.test.ts b/lib/modules-lib/src/__tests__/utilities.test.ts similarity index 56% rename from lib/modules-lib/src/__tests__/hextocolor.test.ts rename to lib/modules-lib/src/__tests__/utilities.test.ts index 51b4c93faf..55c15071bf 100644 --- a/lib/modules-lib/src/__tests__/hextocolor.test.ts +++ b/lib/modules-lib/src/__tests__/utilities.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, test } from 'vitest'; -import { hexToColor } from '../utilities'; +import { hexToColor, isFunctionOfLength } from '../utilities'; describe(hexToColor, () => { test.each([ @@ -19,3 +19,16 @@ describe(hexToColor, () => { expect(() => hexToColor('GGGGGG')).toThrowErrorMatchingInlineSnapshot('[Error: Invalid color hex string: GGGGGG]'); }); }); + +describe(isFunctionOfLength, () => { + it('correctly identifies functions with the specified number of parameters', () => { + const func0 = () => { }; + expect(isFunctionOfLength(func0, 0)).toBe(true); + + const func1 = (_a: number) => { }; + expect(isFunctionOfLength(func1, 1)).toBe(true); + + const func2 = (_a: number, _b: string) => { }; + expect(isFunctionOfLength(func2, 2)).toBe(true); + }); +}); diff --git a/lib/modules-lib/src/tabs/__tests__/useAnimation.test.ts b/lib/modules-lib/src/tabs/__tests__/useAnimation.test.ts index 436fa3d5be..e9d9b35ac2 100644 --- a/lib/modules-lib/src/tabs/__tests__/useAnimation.test.ts +++ b/lib/modules-lib/src/tabs/__tests__/useAnimation.test.ts @@ -132,7 +132,7 @@ test('Animation should not auto start if autoStart is false', async ({ callback, expect(hook.current.isPlaying).toEqual(false); }); -test('animation reset', async ({ callback, canvas }) => { +test('Animation reset', async ({ callback, canvas }) => { const { hook, act, advanceFrames } = await getAnimationHook({ autoLoop: false, animationDuration: 1000, diff --git a/lib/modules-lib/src/utilities.ts b/lib/modules-lib/src/utilities.ts index 63fd9c1225..3eddf6fbcb 100644 --- a/lib/modules-lib/src/utilities.ts +++ b/lib/modules-lib/src/utilities.ts @@ -59,3 +59,18 @@ export function mockDebuggerContext(moduleState: T, name: string) { } } as unknown as DebuggerContext; } + +type ArrayOfLengthHelper = + V['length'] extends T ? V : ArrayOfLengthHelper; + +/** + * Utility type that represents a tuple of a specific length + */ +export type ArrayOfLength = ArrayOfLengthHelper; + +/** + * Type guard for checking that a function has the specified number of parameters. + */ +export function isFunctionOfLength(f: unknown, l: T): f is (...args: ArrayOfLength) => unknown { + return typeof f === 'function' && f.length === l; +} diff --git a/lib/repotools/package.json b/lib/repotools/package.json index 7c60439683..15089477fb 100644 --- a/lib/repotools/package.json +++ b/lib/repotools/package.json @@ -9,13 +9,13 @@ "@types/lodash": "^4.14.198", "@types/node": "^22.15.30", "@vitejs/plugin-react": "^5.1.0", - "@vitest/coverage-v8": "^4.0.4", + "@vitest/coverage-v8": "^4.0.18", "typescript": "^5.8.2", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "dependencies": { - "@vitest/browser-playwright": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", "chalk": "^5.0.1", "commander": "^14.0.0", "esbuild": "^0.27.0", diff --git a/lib/repotools/src/__tests__/paths/windows.test.ts b/lib/repotools/src/__tests__/paths/windows.test.ts index 207c751a9f..2199b91f63 100644 --- a/lib/repotools/src/__tests__/paths/windows.test.ts +++ b/lib/repotools/src/__tests__/paths/windows.test.ts @@ -41,4 +41,8 @@ describe('Test convertToPosixPath with Windows paths', () => { test('Converts Windows root paths correctly', () => { expect(convertToPosixPath('D:\\')).toEqual('/D'); }); + + test('Converts Windows absolute path correctly', () => { + expect(convertToPosixPath('E:\\folder\\subfolder\\file.txt')).toEqual('/E/folder/subfolder/file.txt'); + }); }); diff --git a/lib/vitest-reporter/package.json b/lib/vitest-reporter/package.json index a188d4b935..c1116e3ece 100644 --- a/lib/vitest-reporter/package.json +++ b/lib/vitest-reporter/package.json @@ -5,12 +5,12 @@ "type": "module", "dependencies": { "istanbul-lib-report": "^3.0.1", - "vitest": "^4.0.4" + "vitest": "^4.0.18" }, "devDependencies": { "@types/istanbul-lib-report": "^3.0.3", "@types/node": "^22.15.30", - "@vitest/coverage-v8": "^4.0.4", + "@vitest/coverage-v8": "^4.0.18", "esbuild": "^0.27.0", "typescript": "^5.8.2" }, diff --git a/package.json b/package.json index c0a18de8e2..9e5d4af4a9 100644 --- a/package.json +++ b/package.json @@ -59,11 +59,12 @@ "@types/node": "^22.15.30", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.1", - "@vitest/coverage-v8": "^4.0.4", - "@vitest/eslint-plugin": "^1.3.4", + "@vitest/coverage-v8": "^4.0.18", + "@vitest/eslint-plugin": "^1.6.6", "@yarnpkg/types": "^4.0.1", "esbuild": "^0.27.0", "eslint": "^9.35.0", + "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsdoc": "^62.0.0", "eslint-plugin-mdx": "^3.6.2", @@ -74,12 +75,14 @@ "jsdom": "^26.1.0", "jsonc-eslint-parser": "^2.4.0", "typescript": "^5.8.2", - "typescript-eslint": "^8.33.1", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "typescript-eslint": "^8.53.1", + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, - "dependencies": { - "js-slang": "^1.0.81", + "peerDependencies": { + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", + "js-slang": "^1.0.85", "lodash": "^4.17.23", "react": "^18.3.1", "react-dom": "^18.3.1" diff --git a/src/bundles/ar/package.json b/src/bundles/ar/package.json index 8382a0aa05..e582d2740d 100644 --- a/src/bundles/ar/package.json +++ b/src/bundles/ar/package.json @@ -25,7 +25,7 @@ "lint": "buildtools lint .", "tsc": "buildtools tsc .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/arcade_2d/package.json b/src/bundles/arcade_2d/package.json index 14f9e239c1..85e18de9be 100644 --- a/src/bundles/arcade_2d/package.json +++ b/src/bundles/arcade_2d/package.json @@ -20,7 +20,7 @@ "lint": "buildtools lint .", "tsc": "buildtools tsc .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/arcade_2d/src/functions.ts b/src/bundles/arcade_2d/src/functions.ts index 6b16b0cf8c..bb3398a299 100644 --- a/src/bundles/arcade_2d/src/functions.ts +++ b/src/bundles/arcade_2d/src/functions.ts @@ -71,7 +71,7 @@ export const config = { fps: DEFAULT_FPS, isDebugEnabled: DEFAULT_DEBUG_STATE, // User update function - userUpdateFunction: (() => {}) as UpdateFunction + userUpdateFunction: (() => { }) as UpdateFunction }; // ============================================================================= @@ -101,7 +101,8 @@ export function create_rectangle(width: number, height: number): ShapeGameObject * Creates a CircleGameObject that takes in circle shape properties. * * @param radius Radius of the circle to create - * @example```ts + * @example + * ```ts * const circle = create_circle(100); * ``` * @category GameObject @@ -141,7 +142,7 @@ export function create_triangle(width: number, height: number): ShapeGameObject * @param text Text string displayed * @example * ``` - * const helloworld = create_text("Hello\nworld!"); + * const helloworld = create_text('Hello\nworld!'); * ``` * @category GameObject */ @@ -155,7 +156,7 @@ export function create_text(text: string): TextGameObject { /** * Creates a GameObject that contains a Sprite image reference. * Source Academy assets can be used by specifying path without the prepend. - * Source Academy assets can be found at https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/ with Ctrl+f ".png". + * Source Academy assets can be found at https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/ with Ctrl+f '.png'. * Phaser assets can be found at https://labs.phaser.io/assets/. * If Phaser assets are unavailable, go to https://github.com/photonstorm/phaser3-examples/tree/master/public/assets * to get the asset path and append it to `https://labs.phaser.io/assets/`. @@ -164,8 +165,8 @@ export function create_text(text: string): TextGameObject { * @param image_url The image URL of the sprite * @example * ``` - * const shortpath = create_sprite("objects/cmr/splendall.png"); - * const fullpath = create_sprite("https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/objects/cmr/splendall.png"); + * const shortpath = create_sprite('objects/cmr/splendall.png'); + * const fullpath = create_sprite('https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/objects/cmr/splendall.png'); * ``` * @category GameObject */ @@ -194,7 +195,7 @@ export function create_sprite(image_url: string): SpriteGameObject { * @returns the GameObject reference passed in * @example * ``` - * update_position(create_text("Hello world!"), [1, 2]); + * update_position(create_text('Hello world!'), [1, 2]); * ``` * @category GameObject */ @@ -217,7 +218,7 @@ export function update_position(gameObject: GameObject, [x, y]: PositionXY): Gam * @returns the GameObject reference passed in * @example * ``` - * update_scale(create_text("Hello world!"), [2, 0.5]); + * update_scale(create_text('Hello world!'), [2, 0.5]); * ``` * @category GameObject */ @@ -240,7 +241,7 @@ export function update_scale(gameObject: GameObject, [x, y]: ScaleXY): GameObjec * @returns the GameObject reference passed in * @example * ``` - * update_rotation(create_text("Hello world!"), math_PI); + * update_rotation(create_text('Hello world!'), math_PI); * ``` * @category GameObject */ @@ -317,7 +318,7 @@ export function update_flip(gameObject: GameObject, flip: FlipXY): GameObject { * @throws Error if not a TextGameObject is passed in * @example * ``` - * update_text(create_text("Hello world!"), "Goodbye world!"); + * update_text(create_text('Hello world!'), 'Goodbye world!'); * ``` * @category GameObject */ @@ -337,7 +338,7 @@ export function update_text(textGameObject: TextGameObject, text: string): GameO * @param gameObject GameObject reference * @example * ``` - * update_to_top(create_text("Hello world!")); + * update_to_top(create_text('Hello world!')); * ``` * @category GameObject */ @@ -361,9 +362,9 @@ export function update_to_top(gameObject: GameObject): GameObject { * @returns the id of the GameObject reference * @example * ``` - * const id0 = create_text("This has id 0"); - * const id1 = create_text("This has id 1"); - * const id2 = create_text("This has id 2"); + * const id0 = create_text('This has id 0'); + * const id1 = create_text('This has id 1'); + * const id2 = create_text('This has id 2'); * queryGameObjectId(id2); * ``` * @category GameObject @@ -478,7 +479,7 @@ export function query_flip(gameObject: RenderableGameObject): FlipXY { * @throws Error if not a TextGameObject is passed in * @example * ``` - * const text = create_text("Hello World!"); + * const text = create_text('Hello World!'); * query_text(text); * ``` * @category GameObject @@ -519,15 +520,15 @@ export function query_pointer_position(): PositionXY { * @hidden */ const withinRange: (num: number, min: number, max: number) => number -= (num: number, min: number, max: number) => { - if (num > max) { - return max; - } - if (num < min) { - return min; - } - return num; -}; + = (num: number, min: number, max: number) => { + if (num > max) { + return max; + } + if (num < min) { + return min; + } + return num; + }; /** * Sets the frames per second of the canvas, which should be between the MIN_FPS and MAX_FPS. @@ -632,8 +633,8 @@ export function debug_log(info: string) { * @returns True, in the frame the key is pressed down. * @example * ``` - * if (input_key_down("a")) { - * // "a" key is pressed down + * if (input_key_down('a')) { + * // 'a' key is pressed down * } * ``` * @category Logic @@ -649,7 +650,7 @@ export function input_key_down(key_name: string) { * @returns True, if the left mouse button is pressed down. * @example * ``` - * if(input_left_mouse_down()) { + * if (input_left_mouse_down()) { * // Left mouse button down * } * ``` @@ -685,7 +686,7 @@ export function input_right_mouse_down() { * @example * ``` * // Creating a button using a gameobject - * const button = createTextGameObject("click me"); + * const button = createTextGameObject('click me'); * // Test if button is clicked * if (pointer_over_gameobject(button) && input_left_mouse_down()) { * // Button is clicked @@ -778,7 +779,7 @@ export function get_loop_count() { * game_state[0] = 0; * } * game_state[0] = game_state[0] + 1; - * }) + * }); * ``` */ export function update_loop(update_function: UpdateFunction) { @@ -843,7 +844,7 @@ export function build_game(): BuildGame { /** * Create an audio clip that can be referenced. - * Source Academy assets can be found at https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/ with Ctrl+f ".mp3". + * Source Academy assets can be found at https://source-academy-assets.s3-ap-southeast-1.amazonaws.com/ with Ctrl+f '.mp3'. * Phaser audio assets can be found at https://labs.phaser.io/assets/audio. * Phaser sound effects assets can be found at https://labs.phaser.io/assets/audio/SoundEffects/. * If Phaser assets are unavailable, go to https://github.com/photonstorm/phaser3-examples/tree/master/public/assets @@ -855,7 +856,7 @@ export function build_game(): BuildGame { * @returns The AudioClip reference * @example * ``` - * const audioClip = create_audio("bgm/GalacticHarmony.mp3", 0.5); + * const audioClip = create_audio('bgm/GalacticHarmony.mp3', 0.5); * ``` * @category Audio */ @@ -877,7 +878,7 @@ export function create_audio(audio_url: string, volume_level: number) { * @returns The AudioClip reference * @example * ``` - * const audioClip = loop_audio(create_audio("bgm/GalacticHarmony.mp3", 0.5)); + * const audioClip = loop_audio(create_audio('bgm/GalacticHarmony.mp3', 0.5)); * ``` * @category Audio */ @@ -896,7 +897,7 @@ export function loop_audio(audio_clip: AudioClip) { * @returns The AudioClip reference * @example * ``` - * const audioClip = play_audio(create_audio("bgm/GalacticHarmony.mp3", 0.5)); + * const audioClip = play_audio(create_audio('bgm/GalacticHarmony.mp3', 0.5)); * ``` * @category Audio */ @@ -915,7 +916,7 @@ export function play_audio(audio_clip: AudioClip) { * @returns The AudioClip reference * @example * ``` - * const audioClip = play_audio(create_audio("bgm/GalacticHarmony.mp3", 0.5)); + * const audioClip = play_audio(create_audio('bgm/GalacticHarmony.mp3', 0.5)); * ``` * @category Audio */ diff --git a/src/bundles/binary_tree/package.json b/src/bundles/binary_tree/package.json index f32eb7d58d..9e68b5c26a 100644 --- a/src/bundles/binary_tree/package.json +++ b/src/bundles/binary_tree/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -19,7 +19,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/binary_tree/src/functions.ts b/src/bundles/binary_tree/src/functions.ts index ef2651ff31..06f4507ca5 100644 --- a/src/bundles/binary_tree/src/functions.ts +++ b/src/bundles/binary_tree/src/functions.ts @@ -4,10 +4,10 @@ import type { BinaryTree, EmptyBinaryTree, NonEmptyBinaryTree } from './types'; /** * Returns an empty binary tree, represented by the empty list null * @example - * ```typescript + * ``` * display(make_empty_tree()); // Shows "null" in the REPL * ``` - * @return An empty binary tree + * @returns An empty binary tree */ export function make_empty_tree(): BinaryTree { return null; @@ -16,7 +16,7 @@ export function make_empty_tree(): BinaryTree { /** * Returns a binary tree node composed of the specified left subtree, value and right subtree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_empty_tree(), make_empty_tree()); * display(tree); // Shows "[1, [null, [null, null]]]" in the REPL * ``` @@ -33,7 +33,7 @@ export function make_tree(value: any, left: BinaryTree, right: BinaryTree): Bina * Returns a boolean value, indicating whether the given * value is a binary tree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_empty_tree(), make_empty_tree()); * display(is_tree(tree)); // Shows "true" in the REPL * ``` @@ -58,7 +58,7 @@ export function is_tree(value: any): value is BinaryTree { * Returns a boolean value, indicating whether the given * value is an empty binary tree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_empty_tree(), make_empty_tree()); * display(is_empty_tree(tree)); // Shows "false" in the REPL * ``` @@ -82,7 +82,7 @@ function throwIfNotNonEmptyTree(value: unknown, func_name: string): asserts valu /** * Returns the entry of a given binary tree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_empty_tree(), make_empty_tree()); * display(entry(tree)); // Shows "1" in the REPL * ``` @@ -97,7 +97,7 @@ export function entry(t: BinaryTree): any { /** * Returns the left branch of a given binary tree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_tree(2, make_empty_tree(), make_empty_tree()), make_empty_tree()); * display(entry(left_branch(tree))); // Shows "2" in the REPL * ``` @@ -112,7 +112,7 @@ export function left_branch(t: BinaryTree): BinaryTree { /** * Returns the right branch of a given binary tree. * @example - * ```typescript + * ``` * const tree = make_tree(1, make_empty_tree(), make_tree(2, make_empty_tree(), make_empty_tree())); * display(entry(right_branch(tree))); // Shows "2" in the REPL * ``` diff --git a/src/bundles/communication/package.json b/src/bundles/communication/package.json index 9bbc7a0f5b..76cda1bc53 100644 --- a/src/bundles/communication/package.json +++ b/src/bundles/communication/package.json @@ -22,7 +22,7 @@ "test": "buildtools test --project .", "tsc": "buildtools tsc .", "lint": "buildtools lint .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/copy_gc/package.json b/src/bundles/copy_gc/package.json index 9907088001..7119962f82 100644 --- a/src/bundles/copy_gc/package.json +++ b/src/bundles/copy_gc/package.json @@ -16,7 +16,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/csg/package.json b/src/bundles/csg/package.json index 65ee3d01a6..bd88d203d9 100644 --- a/src/bundles/csg/package.json +++ b/src/bundles/csg/package.json @@ -7,6 +7,7 @@ "@jscad/regl-renderer": "^2.6.1", "@jscad/stl-serializer": "2.1.11", "@sourceacademy/modules-lib": "workspace:^", + "js-slang": "^1.0.85", "save-file": "^2.3.1" }, "exports": { @@ -23,7 +24,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/curve/package.json b/src/bundles/curve/package.json index 30dfde69b5..805f8c10d6 100644 --- a/src/bundles/curve/package.json +++ b/src/bundles/curve/package.json @@ -5,7 +5,7 @@ "dependencies": { "@sourceacademy/modules-lib": "workspace:^", "gl-matrix": "^3.3.0", - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -24,7 +24,7 @@ "prepare": "yarn tsc", "test": "buildtools test --project .", "tsc": "buildtools tsc .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/curve/src/__tests__/curve.test.ts b/src/bundles/curve/src/__tests__/curve.test.ts index d747704d76..9024dcdacc 100644 --- a/src/bundles/curve/src/__tests__/curve.test.ts +++ b/src/bundles/curve/src/__tests__/curve.test.ts @@ -3,6 +3,7 @@ import { describe, expect, it, test } from 'vitest'; import type { Color, Curve } from '../curves_webgl'; import * as drawers from '../drawers'; import * as funcs from '../functions'; +import type { RenderFunction } from '../types'; /** * Evaluates the curve at 200 points, then @@ -19,25 +20,70 @@ function evaluatePoints(curve: Curve) { return points; } -test('Ensure that invalid curves error gracefully', () => { - expect(() => drawers.draw_connected(200)(() => 1 as any)) - .toThrow('Expected curve to return a point, got \'1\' at t=0'); -}); +describe('Ensure that invalid curves and animations error gracefully', () => { + test('Curve that returns non-point should throw error', () => { + expect(() => drawers.draw_connected(200)(_x => 1 as any)) + .toThrow('Expected curve to return a point, got \'1\' at t=0'); + }); -test('Using 3D render functions with animate_curve should throw errors', () => { - expect(() => drawers.animate_curve(1, 60, drawers.draw_3D_connected(200), (t0) => (t1) => funcs.make_point(t0, t1))) - .toThrow('animate_curve cannot be used with 3D draw function!'); -}); + test('Curve that takes multiple parameters should throw error', () => { + expect(() => drawers.draw_connected(200)(((t, u) => funcs.make_point(t, u)) as any)) + .toThrow( + 'The provided curve is not a valid Curve function. ' + + 'A Curve function must take exactly one parameter (a number t between 0 and 1) ' + + 'and return a Point or 3D Point depending on whether it is a 2D or 3D curve.' + ); + }); -test('Using 2D render functions with animate_3D_curve should throw errors', () => { - expect(() => drawers.animate_3D_curve(1, 60, drawers.draw_connected(200), (t0) => (t1) => funcs.make_point(t0, t1))) - .toThrow('animate_3D_curve cannot be used with 2D draw function!'); + test('Using 3D render functions with animate_curve should throw errors', () => { + expect(() => drawers.animate_curve(1, 60, drawers.draw_3D_connected(200), (t0) => (t1) => funcs.make_point(t0, t1))) + .toThrow('animate_curve cannot be used with 3D draw function!'); + }); + + test('Using 2D render functions with animate_3D_curve should throw errors', () => { + expect(() => drawers.animate_3D_curve(1, 60, drawers.draw_connected(200), (t0) => (t1) => funcs.make_point(t0, t1))) + .toThrow('animate_3D_curve cannot be used with 2D draw function!'); + }); }); -test('Render functions have nice string representations', () => { - expect(stringify(drawers.draw_connected(200))).toEqual(''); - expect(stringify(drawers.draw_connected_full_view_proportional(400))).toEqual(''); - expect(stringify(drawers.draw_3D_connected(400))).toEqual('<3DRenderFunction(400)>'); +describe('Render function creators', () => { + const names = Object.getOwnPropertyNames(drawers.RenderFunctionCreators); + const renderFuncCreators = names.reduce<[string, (pts: number) => RenderFunction][]>((res, name) => { + if (typeof drawers.RenderFunctionCreators[name] !== 'function') return res; + return [...res, [name, drawers.RenderFunctionCreators[name]]]; + }, []); + describe.each(renderFuncCreators)('%s', (name, func) => { + test('name property is correct', () => { + expect(func.name).toEqual(name); + }); + + it('throws when numPoints is less than 0', () => { + expect(() => func(0)).toThrowError( + `${name}: The number of points must be a positive integer less than or equal to 65535. Got: 0` + ); + }); + + it('throws when numPoints is greater than 65535', () => { + expect(() => func(70000)).toThrowError( + `${name}: The number of points must be a positive integer less than or equal to 65535. Got: 70000` + ); + }); + + it('throws when numPoints is not an integer', () => { + expect(() => func(3.14)).toThrowError( + `${name}: The number of points must be a positive integer less than or equal to 65535. Got: 3.14` + ); + }); + + test('returned render functions have nice string represnentations', () => { + const renderFunc = func(250); + if (renderFunc.is3D) { + expect(stringify(renderFunc)).toEqual('<3DRenderFunction(250)>'); + } else { + expect(stringify(renderFunc)).toEqual(''); + } + }); + }); }); describe('Coloured Points', () => { diff --git a/src/bundles/curve/src/drawers.ts b/src/bundles/curve/src/drawers.ts index baf7223214..79ea31a6dc 100644 --- a/src/bundles/curve/src/drawers.ts +++ b/src/bundles/curve/src/drawers.ts @@ -1,5 +1,8 @@ +import { isFunctionOfLength } from '@sourceacademy/modules-lib/utilities'; import context from 'js-slang/context'; + import { generateCurve, type Curve, type CurveDrawn } from './curves_webgl'; +import { functionDeclaration } from './type_interface'; import { AnimatedCurve, type CurveAnimation, @@ -18,10 +21,26 @@ function createDrawFunction( scaleMode: ScaleMode, drawMode: DrawMode, space: CurveSpace, - isFullView: boolean + isFullView: boolean, + name: string ): (numPoints: number) => RenderFunction { - return (numPoints: number) => { - const func = (curve: Curve) => { + function renderFuncCreator(numPoints: number) { + if (numPoints <= 0 || numPoints > 65535 || !Number.isInteger(numPoints)) { + throw new Error( + `${name}: The number of points must be a positive integer less than or equal to 65535. ` + + `Got: ${numPoints}` + ); + } + + function renderFunc(curve: Curve) { + if (!isFunctionOfLength(curve, 1)) { + throw new Error( + 'The provided curve is not a valid Curve function. ' + + 'A Curve function must take exactly one parameter (a number t between 0 and 1) ' + + 'and return a Point or 3D Point depending on whether it is a 2D or 3D curve.' + ); + } + const curveDrawn = generateCurve( scaleMode, drawMode, @@ -36,18 +55,22 @@ function createDrawFunction( } return curveDrawn; - }; + } + // Because the draw functions are actually functions // we need hacky workarounds like these to pass information around - func.is3D = space === '3D'; + renderFunc.is3D = space === '3D'; const stringifier = () => `<${space === '3D' ? '3D' : ''}RenderFunction(${numPoints})>`; // Retain both properties for compatibility - func.toString = stringifier; - func.toReplString = stringifier; + renderFunc.toString = stringifier; + renderFunc.toReplString = stringifier; + + return renderFunc; + } - return func; - }; + Object.defineProperty(renderFuncCreator, 'name', { value: name }); + return renderFuncCreator; } // ============================================================================= @@ -58,6 +81,90 @@ function createDrawFunction( // graphics library context, see './curves_webgl.ts'. // ============================================================================= +/** @hidden */ +export class RenderFunctionCreators { + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_connected = createDrawFunction('none', 'lines', '2D', false, 'draw_connected'); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_connected_full_view = createDrawFunction( + 'stretch', + 'lines', + '2D', + true, + 'draw_connected_full_view' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_connected_full_view_proportional = createDrawFunction( + 'fit', + 'lines', + '2D', + true, + 'draw_connected_full_view_proportional' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_points = createDrawFunction('none', 'points', '2D', false, 'draw_points'); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_points_full_view = createDrawFunction( + 'stretch', + 'points', + '2D', + true, + 'draw_points_full_view' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_points_full_view_proportional = createDrawFunction( + 'fit', + 'points', + '2D', + true, + 'draw_points_full_view_proportional' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_3D_connected = createDrawFunction( + 'none', + 'lines', + '3D', + false, + 'draw_3D_connected' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_3D_connected_full_view = createDrawFunction( + 'stretch', + 'lines', + '3D', + false, + 'draw_3D_connected_full_view' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_3D_points = createDrawFunction('none', 'points', '3D', false, 'draw_3D_points'); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_3D_points_full_view = createDrawFunction( + 'stretch', + 'points', + '3D', + false, + 'draw_3D_points_full_view' + ); + + @functionDeclaration('numPoints: number', '(func: Curve) => Curve') + static draw_3D_points_full_view_proportional = createDrawFunction( + 'fit', + 'points', + '3D', + false, + 'draw_3D_points_full_view_proportional' + ); +} + /** * Returns a function that turns a given Curve into a Drawing, by sampling the * Curve at `num` sample points and connecting each pair with a line. @@ -66,13 +173,13 @@ function createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_connected(100)(t => make_point(t, t)); * ``` */ -export const draw_connected = createDrawFunction('none', 'lines', '2D', false); +export const draw_connected = RenderFunctionCreators.draw_connected; /** * Returns a function that turns a given Curve into a Drawing, by sampling the @@ -83,18 +190,13 @@ export const draw_connected = createDrawFunction('none', 'lines', '2D', false); * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_connected_full_view(100)(t => make_point(t, t)); * ``` */ -export const draw_connected_full_view = createDrawFunction( - 'stretch', - 'lines', - '2D', - true -); +export const draw_connected_full_view = RenderFunctionCreators.draw_connected_full_view; /** * Returns a function that turns a given Curve into a Drawing, by sampling the @@ -105,18 +207,13 @@ export const draw_connected_full_view = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_connected_full_view_proportional(100)(t => make_point(t, t)); * ``` */ -export const draw_connected_full_view_proportional = createDrawFunction( - 'fit', - 'lines', - '2D', - true -); +export const draw_connected_full_view_proportional = RenderFunctionCreators.draw_connected_full_view_proportional; /** * Returns a function that turns a given Curve into a Drawing, by sampling the @@ -127,13 +224,13 @@ export const draw_connected_full_view_proportional = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1,there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_points(100)(t => make_point(t, t)); * ``` */ -export const draw_points = createDrawFunction('none', 'points', '2D', false); +export const draw_points = RenderFunctionCreators.draw_points; /** * Returns a function that turns a given Curve into a Drawing, by sampling the @@ -145,18 +242,13 @@ export const draw_points = createDrawFunction('none', 'points', '2D', false); * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_points_full_view(100)(t => make_point(t, t)); * ``` */ -export const draw_points_full_view = createDrawFunction( - 'stretch', - 'points', - '2D', - true -); +export const draw_points_full_view = RenderFunctionCreators.draw_points_full_view; /** * Returns a function that turns a given Curve into a Drawing, by sampling the @@ -168,18 +260,13 @@ export const draw_points_full_view = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_points_full_view_proportional(100)(t => make_point(t, t)); * ``` */ -export const draw_points_full_view_proportional = createDrawFunction( - 'fit', - 'points', - '2D', - true -); +export const draw_points_full_view_proportional = RenderFunctionCreators.draw_points_full_view_proportional; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -190,18 +277,13 @@ export const draw_points_full_view_proportional = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_connected(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_connected = createDrawFunction( - 'none', - 'lines', - '3D', - false -); +export const draw_3D_connected = RenderFunctionCreators.draw_3D_connected; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -212,18 +294,13 @@ export const draw_3D_connected = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_connected_full_view(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_connected_full_view = createDrawFunction( - 'stretch', - 'lines', - '3D', - false -); +export const draw_3D_connected_full_view = RenderFunctionCreators.draw_3D_connected_full_view; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -234,18 +311,13 @@ export const draw_3D_connected_full_view = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_connected_full_view_proportional(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_connected_full_view_proportional = createDrawFunction( - 'fit', - 'lines', - '3D', - false -); +export const draw_3D_connected_full_view_proportional = RenderFunctionCreators.draw_3D_points_full_view_proportional; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -256,13 +328,13 @@ export const draw_3D_connected_full_view_proportional = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_points(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_points = createDrawFunction('none', 'points', '3D', false); +export const draw_3D_points = RenderFunctionCreators.draw_3D_points; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -273,18 +345,13 @@ export const draw_3D_points = createDrawFunction('none', 'points', '3D', false); * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_points_full_view(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_points_full_view = createDrawFunction( - 'stretch', - 'points', - '3D', - false -); +export const draw_3D_points_full_view = RenderFunctionCreators.draw_3D_points_full_view; /** * Returns a function that turns a given 3D Curve into a Drawing, by sampling @@ -295,18 +362,47 @@ export const draw_3D_points_full_view = createDrawFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type Curve → Drawing + * @returns function of type Curve → Drawing * @example * ``` * draw_3D_points_full_view_proportional(100)(t => make_3D_point(t, t, t)); * ``` */ -export const draw_3D_points_full_view_proportional = createDrawFunction( - 'fit', - 'points', - '3D', - false -); +export const draw_3D_points_full_view_proportional = RenderFunctionCreators.draw_3D_points_full_view_proportional; + +class CurveAnimators { + @functionDeclaration('duration: number, fps: number, drawer: (func: Curve) => Curve, func: (func: Curve) => Curve', 'AnimatedCurve') + static animate_curve( + duration: number, + fps: number, + drawer: RenderFunction, + func: CurveAnimation + ): AnimatedCurve { + if (drawer.is3D) { + throw new Error(`${animate_curve.name} cannot be used with 3D draw function!`); + } + + const anim = new AnimatedCurve(duration, fps, func, drawer, false); + drawnCurves.push(anim); + return anim; + } + + @functionDeclaration('duration: number, fps: number, drawer: (func: Curve) => Curve, func: (func: Curve) => Curve', 'AnimatedCurve') + static animate_3D_curve( + duration: number, + fps: number, + drawer: RenderFunction, + func: CurveAnimation + ): AnimatedCurve { + if (!drawer.is3D) { + throw new Error(`${animate_3D_curve.name} cannot be used with 2D draw function!`); + } + + const anim = new AnimatedCurve(duration, fps, func, drawer, true); + drawnCurves.push(anim); + return anim; + } +} /** * Create a animation of curves using a curve generating function. @@ -314,22 +410,9 @@ export const draw_3D_points_full_view_proportional = createDrawFunction( * @param fps Framerate of the animation in frames per second * @param drawer Draw function to the generated curves with * @param func Curve generating function. Takes in a timestamp value and returns a curve - * @return Curve Animation + * @returns Curve Animation */ -export function animate_curve( - duration: number, - fps: number, - drawer: RenderFunction, - func: CurveAnimation -): AnimatedCurve { - if (drawer.is3D) { - throw new Error('animate_curve cannot be used with 3D draw function!'); - } - - const anim = new AnimatedCurve(duration, fps, func, drawer, false); - drawnCurves.push(anim); - return anim; -} +export const animate_curve = CurveAnimators.animate_curve; /** * Create a animation of curves using a curve generating function. @@ -337,19 +420,6 @@ export function animate_curve( * @param fps Framerate of the animation in frames per second * @param drawer Draw function to the generated curves with * @param func Curve generating function. Takes in a timestamp value and returns a curve - * @return 3D Curve Animation + * @returns 3D Curve Animation */ -export function animate_3D_curve( - duration: number, - fps: number, - drawer: RenderFunction, - func: CurveAnimation -): AnimatedCurve { - if (!drawer.is3D) { - throw new Error('animate_3D_curve cannot be used with 2D draw function!'); - } - - const anim = new AnimatedCurve(duration, fps, func, drawer, true); - drawnCurves.push(anim); - return anim; -} +export const animate_3D_curve = CurveAnimators.animate_3D_curve; diff --git a/src/bundles/curve/src/functions.ts b/src/bundles/curve/src/functions.ts index 4faf29a8a4..c2fce8b1b4 100644 --- a/src/bundles/curve/src/functions.ts +++ b/src/bundles/curve/src/functions.ts @@ -1,7 +1,237 @@ import clamp from 'lodash/clamp'; import { Point, type Curve } from './curves_webgl'; +import { functionDeclaration } from './type_interface'; import type { CurveTransformer } from './types'; +function throwIfNotPoint(obj: unknown, func_name: string): asserts obj is Point { + if (!(obj instanceof Point)) { + throw new Error(`${func_name} expects a point as argument`); + } +} + +class CurveFunctions { + @functionDeclaration('x: number, y: number', 'Point') + static make_point(x: number, y: number): Point { + return new Point(x, y, 0, [0, 0, 0, 1]); + } + + @functionDeclaration('x: number, y: number, z: number', 'Point') + static make_3D_point(x: number, y: number, z: number): Point { + return new Point(x, y, z, [0, 0, 0, 1]); + } + + @functionDeclaration('x: number, y: number, r: number, g: number, b: number', 'Point') + static make_color_point( + x: number, + y: number, + r: number, + g: number, + b: number + ): Point { + r = clamp(r, 0, 255); + g = clamp(g, 0, 255); + b = clamp(b, 0, 255); + + return new Point(x, y, 0, [r / 255, g / 255, b / 255, 1]); + } + + @functionDeclaration('x: number, y: number, z: number, r: number, g: number, b: number', 'Point') + static make_3D_color_point( + x: number, + y: number, + z: number, + r: number, + g: number, + b: number + ): Point { + r = clamp(r, 0, 255); + g = clamp(g, 0, 255); + b = clamp(b, 0, 255); + + return new Point(x, y, z, [r / 255, g / 255, b / 255, 1]); + } + + @functionDeclaration('curve1: Curve, curve2: Curve', 'Curve') + static connect_ends(curve1: Curve, curve2: Curve): Curve { + const startPointOfCurve2 = curve2(0); + const endPointOfCurve1 = curve1(1); + return connect_rigidly( + curve1, + translate( + x_of(endPointOfCurve1) - x_of(startPointOfCurve2), + y_of(endPointOfCurve1) - y_of(startPointOfCurve2), + z_of(endPointOfCurve1) - z_of(startPointOfCurve2) + )(curve2) + ); + } + + @functionDeclaration('curve1: Curve, curve2: Curve', 'Curve') + static connect_rigidly(curve1: Curve, curve2: Curve): Curve { + return (t) => (t < 1 / 2 ? curve1(2 * t) : curve2(2 * t - 1)); + } + + @functionDeclaration('x0: number, y0: number, z0: number', '(c: Curve) => Curve') + static translate(x0: number, y0: number, z0: number): CurveTransformer { + return curve => t => { + const ct = curve(t); + return new Point( + x0 + ct.x, + y0 + ct.y, + z0 + ct.z, + [ct.color[0], ct.color[1], ct.color[2], 1] + ); + }; + } + + @functionDeclaration('curve: Curve', 'Curve') + static invert: CurveTransformer = original => t => original(1 - t); + + @functionDeclaration('curve: Curve', 'Curve') + static put_in_standard_position: CurveTransformer = curve => { + const start_point = curve(0); + const curve_started_at_origin = translate( + -x_of(start_point), + -y_of(start_point), + 0 + )(curve); + const new_end_point = curve_started_at_origin(1); + const theta = Math.atan2(y_of(new_end_point), x_of(new_end_point)); + const curve_ended_at_x_axis = rotate_around_origin_3D( + 0, + 0, + -theta + )(curve_started_at_origin); + const end_point_on_x_axis = x_of(curve_ended_at_x_axis(1)); + return scale_proportional(1 / end_point_on_x_axis)(curve_ended_at_x_axis); + }; + + @functionDeclaration('a: number, b: number, c: number', '(c: Curve) => Curve') + static rotate_around_origin_3D(a: number, b: number, c: number): CurveTransformer { + const cthx = Math.cos(a); + const sthx = Math.sin(a); + const cthy = Math.cos(b); + const sthy = Math.sin(b); + const cthz = Math.cos(c); + const sthz = Math.sin(c); + + return curve => t => { + const ct = curve(t); + const coord = [ct.x, ct.y, ct.z]; + const mat = [ + [ + cthz * cthy, + cthz * sthy * sthx - sthz * cthx, + cthz * sthy * cthx + sthz * sthx + ], + [ + sthz * cthy, + sthz * sthy * sthx + cthz * cthx, + sthz * sthy * cthx - cthz * sthx + ], + [-sthy, cthy * sthx, cthy * cthx] + ]; + let xf = 0; + let yf = 0; + let zf = 0; + for (let i = 0; i < 3; i += 1) { + xf += mat[0][i] * coord[i]; + yf += mat[1][i] * coord[i]; + zf += mat[2][i] * coord[i]; + } + return new Point(xf, yf, zf, [ct.color[0], ct.color[1], ct.color[2], 1]); + }; + } + + @functionDeclaration('a: number', '(c: Curve) => Curve') + static rotate_around_origin(a: number): CurveTransformer { + // 1 args + const cth = Math.cos(a); + const sth = Math.sin(a); + return curve => t => { + const ct = curve(t); + return new Point( + cth * ct.x - sth * ct.y, + sth * ct.x + cth * ct.y, + ct.z, + [ct.color[0], ct.color[1], ct.color[2], 1] + ); + }; + } + + @functionDeclaration('x: number, y: number, z: number', '(c: Curve) => Curve') + static scale(x: number, y: number, z: number): CurveTransformer { + return curve => t => { + const ct = curve(t); + + return new Point( + x * ct.x, + y * ct.y, + z * ct.z, + [ct.color[0], ct.color[1], ct.color[2], 1] + ); + }; + } + + @functionDeclaration('s: number', '(c: Curve) => Curve') + static scale_proportional(s: number): CurveTransformer { + return scale(s, s, s); + } + + @functionDeclaration('p: Point', 'number') + static x_of(pt: Point): number { + throwIfNotPoint(pt, x_of.name); + return pt.x; + } + + @functionDeclaration('p: Point', 'number') + static y_of(pt: Point): number { + throwIfNotPoint(pt, y_of.name); + return pt.y; + } + + @functionDeclaration('p: Point', 'number') + static z_of(pt: Point): number { + throwIfNotPoint(pt, z_of.name); + return pt.z; + } + + @functionDeclaration('p: Point', 'number') + static r_of(pt: Point): number { + throwIfNotPoint(pt, r_of.name); + return Math.floor(pt.color[0] * 255); + } + + @functionDeclaration('p: Point', 'number') + static g_of(pt: Point): number { + throwIfNotPoint(pt, g_of.name); + return Math.floor(pt.color[1] * 255); + } + + @functionDeclaration('p: Point', 'number') + static b_of(pt: Point): number { + throwIfNotPoint(pt, b_of.name); + return Math.floor(pt.color[2] * 255); + } + + @functionDeclaration('t: number', 'Point') + static unit_circle: Curve = t => { + return make_point(Math.cos(2 * Math.PI * t), Math.sin(2 * Math.PI * t)); + }; + + @functionDeclaration('t: number', 'Point') + static unit_line: Curve = t => make_point(t, 0); + + @functionDeclaration('t: number', 'Curve') + static unit_line_at(y: number): Curve { + return t => make_point(t, y); + } + + @functionDeclaration('t: number', 'Point') + static arc: Curve = t => { + return make_point(Math.sin(Math.PI * t), Math.cos(Math.PI * t)); + }; +} + /** * Makes a Point with given x and y coordinates. * @@ -13,9 +243,7 @@ import type { CurveTransformer } from './types'; * const point = make_point(0.5, 0.5); * ``` */ -export function make_point(x: number, y: number): Point { - return new Point(x, y, 0, [0, 0, 0, 1]); -} +export const make_point = CurveFunctions.make_point; /** * Makes a 3D Point with given x, y and z coordinates. @@ -29,9 +257,7 @@ export function make_point(x: number, y: number): Point { * const point = make_3D_point(0.5, 0.5, 0.5); * ``` */ -export function make_3D_point(x: number, y: number, z: number): Point { - return new Point(x, y, z, [0, 0, 0, 1]); -} +export const make_3D_point = CurveFunctions.make_3D_point; /** * Makes a color Point with given x and y coordinates, and RGB values ranging @@ -49,19 +275,7 @@ export function make_3D_point(x: number, y: number, z: number): Point { * const redPoint = make_color_point(0.5, 0.5, 255, 0, 0); * ``` */ -export function make_color_point( - x: number, - y: number, - r: number, - g: number, - b: number -): Point { - r = clamp(r, 0, 255); - g = clamp(g, 0, 255); - b = clamp(b, 0, 255); - - return new Point(x, y, 0, [r / 255, g / 255, b / 255, 1]); -} +export const make_color_point = CurveFunctions.make_color_point; /** * Makes a 3D color Point with given x, y and z coordinates, and RGB values @@ -80,26 +294,7 @@ export function make_color_point( * const redPoint = make_color_point(0.5, 0.5, 0.5, 255, 0, 0); * ``` */ -export function make_3D_color_point( - x: number, - y: number, - z: number, - r: number, - g: number, - b: number -): Point { - r = clamp(r, 0, 255); - g = clamp(g, 0, 255); - b = clamp(b, 0, 255); - - return new Point(x, y, z, [r / 255, g / 255, b / 255, 1]); -} - -function throwIfNotPoint(obj: unknown, func_name: string): asserts obj is Point { - if (!(obj instanceof Point)) { - throw new Error(`${func_name} expects a point as argument`); - } -} +export const make_3D_color_point = CurveFunctions.make_3D_color_point; /** * Retrieves the x-coordinate of a given Point. @@ -112,10 +307,7 @@ function throwIfNotPoint(obj: unknown, func_name: string): asserts obj is Point * x_of(point); // Returns 1 * ``` */ -export function x_of(pt: Point): number { - throwIfNotPoint(pt, x_of.name); - return pt.x; -} +export const x_of = CurveFunctions.x_of; /** * Retrieves the y-coordinate of a given Point. @@ -128,10 +320,7 @@ export function x_of(pt: Point): number { * y_of(point); // Returns 2 * ``` */ -export function y_of(pt: Point): number { - throwIfNotPoint(pt, y_of.name); - return pt.y; -} +export const y_of = CurveFunctions.y_of; /** * Retrieves the z-coordinate of a given Point. @@ -144,10 +333,7 @@ export function y_of(pt: Point): number { * z_of(point); // Returns 3 * ``` */ -export function z_of(pt: Point): number { - throwIfNotPoint(pt, z_of.name); - return pt.z; -} +export const z_of = CurveFunctions.z_of; /** * Retrieves the red component of a given Point. @@ -160,10 +346,7 @@ export function z_of(pt: Point): number { * r_of(point); // Returns 50 * ``` */ -export function r_of(pt: Point): number { - throwIfNotPoint(pt, r_of.name); - return Math.floor(pt.color[0] * 255); -} +export const r_of = CurveFunctions.r_of; /** * Retrieves the green component of a given Point. @@ -176,10 +359,7 @@ export function r_of(pt: Point): number { * g_of(point); // Returns 100 * ``` */ -export function g_of(pt: Point): number { - throwIfNotPoint(pt, g_of.name); - return Math.floor(pt.color[1] * 255); -} +export const g_of = CurveFunctions.g_of; /** * Retrieves the blue component of a given Point. @@ -192,10 +372,7 @@ export function g_of(pt: Point): number { * b_of(point); // Returns 150 * ``` */ -export function b_of(pt: Point): number { - throwIfNotPoint(pt, b_of.name); - return Math.floor(pt.color[2] * 255); -} +export const b_of = CurveFunctions.b_of; /** * This function is a Curve transformation: a function from a Curve to a Curve. @@ -206,7 +383,7 @@ export function b_of(pt: Point): number { * @param original original Curve * @returns result Curve */ -export const invert: CurveTransformer = original => t => original(1 - t); +export const invert = CurveFunctions.invert; /** * This function returns a Curve transformation: It takes an x-value x0, a @@ -220,17 +397,7 @@ export const invert: CurveTransformer = original => t => original(1 - t); * @param z0 z-value * @returns Curve transformation */ -export function translate(x0: number, y0: number, z0: number): CurveTransformer { - return curve => t => { - const ct = curve(t); - return new Point( - x0 + ct.x, - y0 + ct.y, - z0 + ct.z, - [ct.color[0], ct.color[1], ct.color[2], 1] - ); - }; -} +export const translate = CurveFunctions.translate; /** * This function takes 3 angles, a, b and c in radians as parameter @@ -243,41 +410,7 @@ export function translate(x0: number, y0: number, z0: number): CurveTransformer * @param c given angle * @returns function that takes a Curve and returns a Curve */ -export function rotate_around_origin_3D(a: number, b: number, c: number): CurveTransformer { - const cthx = Math.cos(a); - const sthx = Math.sin(a); - const cthy = Math.cos(b); - const sthy = Math.sin(b); - const cthz = Math.cos(c); - const sthz = Math.sin(c); - - return curve => t => { - const ct = curve(t); - const coord = [ct.x, ct.y, ct.z]; - const mat = [ - [ - cthz * cthy, - cthz * sthy * sthx - sthz * cthx, - cthz * sthy * cthx + sthz * sthx - ], - [ - sthz * cthy, - sthz * sthy * sthx + cthz * cthx, - sthz * sthy * cthx - cthz * sthx - ], - [-sthy, cthy * sthx, cthy * cthx] - ]; - let xf = 0; - let yf = 0; - let zf = 0; - for (let i = 0; i < 3; i += 1) { - xf += mat[0][i] * coord[i]; - yf += mat[1][i] * coord[i]; - zf += mat[2][i] * coord[i]; - } - return new Point(xf, yf, zf, [ct.color[0], ct.color[1], ct.color[2], 1]); - }; -} +export const rotate_around_origin_3D = CurveFunctions.rotate_around_origin_3D; /** * This function an angle a in radians as parameter @@ -288,20 +421,7 @@ export function rotate_around_origin_3D(a: number, b: number, c: number): CurveT * @param a given angle * @returns function that takes a Curve and returns a Curve */ -export function rotate_around_origin(a: number): CurveTransformer { - // 1 args - const cth = Math.cos(a); - const sth = Math.sin(a); - return curve => t => { - const ct = curve(t); - return new Point( - cth * ct.x - sth * ct.y, - sth * ct.x + cth * ct.y, - ct.z, - [ct.color[0], ct.color[1], ct.color[2], 1] - ); - }; -} +export const rotate_around_origin = CurveFunctions.rotate_around_origin; /** * This function takes scaling factors `a`, `b` and @@ -314,18 +434,7 @@ export function rotate_around_origin(a: number): CurveTransformer { * @param z scaling factor in z-direction * @returns function that takes a Curve and returns a Curve */ -export function scale(x: number, y: number, z: number): CurveTransformer { - return curve => t => { - const ct = curve(t); - - return new Point( - x * ct.x, - y * ct.y, - z * ct.z, - [ct.color[0], ct.color[1], ct.color[2], 1] - ); - }; -} +export const scale = CurveFunctions.scale; /** * This function takes a scaling factor s argument and returns a Curve @@ -334,9 +443,7 @@ export function scale(x: number, y: number, z: number): CurveTransformer { * @param s scaling factor * @returns function that takes a Curve and returns a Curve */ -export function scale_proportional(s: number): CurveTransformer { - return scale(s, s, s); -} +export const scale_proportional = CurveFunctions.scale_proportional; /** * This function is a Curve transformation: It takes a Curve as argument and @@ -350,23 +457,7 @@ export function scale_proportional(s: number): CurveTransformer { * @param curve given Curve * @returns result Curve */ -export const put_in_standard_position: CurveTransformer = curve => { - const start_point = curve(0); - const curve_started_at_origin = translate( - -x_of(start_point), - -y_of(start_point), - 0 - )(curve); - const new_end_point = curve_started_at_origin(1); - const theta = Math.atan2(y_of(new_end_point), x_of(new_end_point)); - const curve_ended_at_x_axis = rotate_around_origin_3D( - 0, - 0, - -theta - )(curve_started_at_origin); - const end_point_on_x_axis = x_of(curve_ended_at_x_axis(1)); - return scale_proportional(1 / end_point_on_x_axis)(curve_ended_at_x_axis); -}; +export const put_in_standard_position = CurveFunctions.put_in_standard_position; /** * This function is a binary Curve operator: It takes two Curves as arguments @@ -379,9 +470,7 @@ export const put_in_standard_position: CurveTransformer = curve => { * @param curve2 second Curve * @returns result Curve */ -export function connect_rigidly(curve1: Curve, curve2: Curve): Curve { - return (t) => (t < 1 / 2 ? curve1(2 * t) : curve2(2 * t - 1)); -} +export const connect_rigidly = CurveFunctions.connect_rigidly; /** * This function is a binary Curve operator: It takes two Curves as arguments @@ -395,18 +484,7 @@ export function connect_rigidly(curve1: Curve, curve2: Curve): Curve { * @param curve2 second Curve * @returns result Curve */ -export function connect_ends(curve1: Curve, curve2: Curve): Curve { - const startPointOfCurve2 = curve2(0); - const endPointOfCurve1 = curve1(1); - return connect_rigidly( - curve1, - translate( - x_of(endPointOfCurve1) - x_of(startPointOfCurve2), - y_of(endPointOfCurve1) - y_of(startPointOfCurve2), - z_of(endPointOfCurve1) - z_of(startPointOfCurve2) - )(curve2) - ); -} +export const connect_ends = CurveFunctions.connect_ends; /** * This function is a curve: a function from a fraction t to a point. The points @@ -416,9 +494,7 @@ export function connect_ends(curve1: Curve, curve2: Curve): Curve { * @param t fraction between 0 and 1 * @returns Point on the circle at t */ -export const unit_circle: Curve = t => { - return make_point(Math.cos(2 * Math.PI * t), Math.sin(2 * Math.PI * t)); -}; +export const unit_circle = CurveFunctions.unit_circle; /** * This function is a curve: a function from a fraction t to a point. The @@ -427,7 +503,7 @@ export const unit_circle: Curve = t => { * @param t fraction between 0 and 1 * @returns Point on the line at t */ -export const unit_line: Curve = t => make_point(t, 0); +export const unit_line = CurveFunctions.unit_line; /** * This function is a Curve generator: it takes a number and returns a @@ -437,9 +513,7 @@ export const unit_line: Curve = t => make_point(t, 0); * @param y fraction between 0 and 1 * @returns horizontal Curve */ -export function unit_line_at(y: number): Curve { - return t => make_point(t, y); -} +export const unit_line_at = CurveFunctions.unit_line_at; /** * This function is a curve: a function from a fraction t to a point. The points @@ -450,6 +524,4 @@ export function unit_line_at(y: number): Curve { * @param t fraction between 0 and 1 * @returns Point in the arc at t */ -export const arc: Curve = t => { - return make_point(Math.sin(Math.PI * t), Math.cos(Math.PI * t)); -}; +export const arc = CurveFunctions.arc; diff --git a/src/bundles/curve/src/type_interface.ts b/src/bundles/curve/src/type_interface.ts index 27c38cc27f..8c22088d9a 100644 --- a/src/bundles/curve/src/type_interface.ts +++ b/src/bundles/curve/src/type_interface.ts @@ -2,129 +2,19 @@ import createTypeMap from '@sourceacademy/modules-lib/type_map'; const typeMapCreator = createTypeMap(); -const { classDeclaration, functionDeclaration, typeDeclaration } = typeMapCreator; +export const { classDeclaration, functionDeclaration, typeDeclaration } = typeMapCreator; @classDeclaration('Point') -class Point {} +class Point { } @classDeclaration('AnimatedCurve') -class AnimatedCurve {} +class AnimatedCurve { } @typeDeclaration('(u: number) => Point') -class Curve {} +class Curve { } @typeDeclaration('(t: number) => Curve') -class CurveAnimation {} - -class TypeInterface { - @functionDeclaration('duration: number, fps: number, drawer: (func: Curve) => Curve, func: (func: Curve) => Curve', 'AnimatedCurve') - animate_3D_curve() {} - - @functionDeclaration('duration: number, fps: number, drawer: (func: Curve) => Curve, func: (func: Curve) => Curve', 'AnimatedCurve') - animate_curve() {} - - @functionDeclaration('t: number', 'number') - arc() {} - - @functionDeclaration('p: Point', 'number') - b_of() {} - - @functionDeclaration('curve1: Curve, curve2: Curve', 'Curve') - connect_ends() {} - - @functionDeclaration('curve1: Curve, curve2: Curve', 'Curve') - connect_rigidly() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_connected() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_connected_full_view() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_connected_full_view_proportional() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_points() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_points_full_view() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_3D_points_full_view_proportional() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_connected() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_connected_full_view() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_connected_full_view_proportional() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_points() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_points_full_view() {} - - @functionDeclaration('numPoints: number', '(func: Curve) => Curve') - draw_points_full_view_proportional() {} - - @functionDeclaration('p: Point', 'number') - g_of() {} - - @functionDeclaration('curve: Curve', 'Curve') - invert() {} - - @functionDeclaration('x: number, y: number, z: number, r: number, g: number, b: number', 'Point') - make_3D_color_point() {} - - @functionDeclaration('x: number, y: number, z: number', 'Point') - make_3D_point() {} - - @functionDeclaration('x: number, y: number, r: number, g: number, b: number', 'Point') - make_color_point() {} - - @functionDeclaration('x: number, y: number', 'Point') - make_point() {} - - @functionDeclaration('curve: Curve', 'Curve') - put_in_standard_position() {} - - @functionDeclaration('p: Point', 'number') - r_of() {} - - @functionDeclaration('theta1: number, theta2: number, theta3: number', '(c: Curve) => Curve') - rotate_around_origin() {} - - @functionDeclaration('x: number, y: number', '(c: Curve) => Curve') - scale() {} - - @functionDeclaration('s: number', '(c: Curve) => Curve') - scale_proportional() {} - - @functionDeclaration('x0: number, y0: number, z0: number', '(c: Curve) => Curve') - translate() {} - - @functionDeclaration('t: number', 'Point') - unit_circle() {} - - @functionDeclaration('t: number', 'Point') - unit_line() {} - - @functionDeclaration('t: number', 'Curve') - unit_line_at() {} - - @functionDeclaration('p: Point', 'number') - x_of() {} - - @functionDeclaration('p: Point', 'number') - y_of() {} - - @functionDeclaration('p: Point', 'number') - z_of() {} -} +class CurveAnimation { } /** @hidden */ export const type_map = typeMapCreator.type_map; diff --git a/src/bundles/game/package.json b/src/bundles/game/package.json index 1821c11faf..18514e535d 100644 --- a/src/bundles/game/package.json +++ b/src/bundles/game/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81", + "js-slang": "^1.0.85", "phaser": "^3.54.0" }, "devDependencies": { @@ -20,7 +20,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/game/src/functions.ts b/src/bundles/game/src/functions.ts index b494591908..dd265ab19d 100644 --- a/src/bundles/game/src/functions.ts +++ b/src/bundles/game/src/functions.ts @@ -60,7 +60,7 @@ enum ObjectTypes { const ObjTypes = Object.values(ObjectTypes); -const nullFn = () => {}; +const nullFn = () => { }; const mandatory = (obj, errMsg: string) => { if (!obj) { @@ -450,7 +450,7 @@ export function create_spritesheet_config( /** * Get in-game screen width. * - * @return screen width + * @returns screen width */ export function get_screen_width(): number { return screenSize.x; @@ -459,7 +459,7 @@ export function get_screen_width(): number { /** * Get in-game screen height. * - * @return screen height + * @returns screen height */ export function get_screen_height(): number { return screenSize.y; @@ -468,7 +468,7 @@ export function get_screen_height(): number { /** * Get game screen display width (accounting window size). * - * @return screen display width + * @returns screen display width */ export function get_screen_display_width(): number { return scene().scale.displaySize.width; @@ -477,7 +477,7 @@ export function get_screen_display_width(): number { /** * Get game screen display height (accounting window size). * - * @return screen display height + * @returns screen display height */ export function get_screen_display_height(): number { return scene().scale.displaySize.height; diff --git a/src/bundles/mark_sweep/package.json b/src/bundles/mark_sweep/package.json index cc197f77aa..69e1990bb9 100644 --- a/src/bundles/mark_sweep/package.json +++ b/src/bundles/mark_sweep/package.json @@ -16,7 +16,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/midi/package.json b/src/bundles/midi/package.json index a90a40502e..ecda58a0c2 100644 --- a/src/bundles/midi/package.json +++ b/src/bundles/midi/package.json @@ -7,7 +7,7 @@ "typescript": "^5.8.2" }, "dependencies": { - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "type": "module", "scripts": { @@ -16,7 +16,7 @@ "prepare": "yarn tsc", "tsc": "buildtools tsc .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "exports": { diff --git a/src/bundles/midi/src/index.ts b/src/bundles/midi/src/index.ts index e13c75c962..83d6f6af23 100644 --- a/src/bundles/midi/src/index.ts +++ b/src/bundles/midi/src/index.ts @@ -13,12 +13,15 @@ import { midiNoteToNoteName, noteToValues } from './utils'; * Converts a letter name to its corresponding MIDI note. * The letter name is represented in standard pitch notation. * Examples are "A5", "Db3", "C#7". - * Refer to this mapping from + * Refer to [this](https://i.imgur.com/qGQgmYr.png) mapping from * letter name to midi notes. * * @param note given letter name - * @return the corresponding midi note - * @example letter_name_to_midi_note("C4"); // Returns 60 + * @returns the corresponding midi note + * @example + * ``` + * letter_name_to_midi_note('C4'); // Returns 60 + * ``` * @function */ export function letter_name_to_midi_note(note: NoteWithOctave): MIDINote { @@ -88,9 +91,9 @@ export function midi_note_to_letter_name(midiNote: MIDINote, accidental: 'flat' * Converts a MIDI note to its corresponding frequency. * * @param note given MIDI note - * @return the frequency of the MIDI note - * @example midi_note_to_frequency(69); // Returns 440 + * @returns the frequency of the MIDI note * @function + * @example midi_note_to_frequency(69); // Returns 440 */ export function midi_note_to_frequency(note: MIDINote): number { // A4 = 440Hz = midi note 69 @@ -101,7 +104,7 @@ export function midi_note_to_frequency(note: MIDINote): number { * Converts a letter name to its corresponding frequency. * * @param note given letter name - * @return the corresponding frequency + * @returns the corresponding frequency * @example letter_name_to_frequency("A4"); // Returns 440 */ export function letter_name_to_frequency(note: NoteWithOctave): number { diff --git a/src/bundles/midi/src/utils.ts b/src/bundles/midi/src/utils.ts index 75a0450715..7504409b7d 100644 --- a/src/bundles/midi/src/utils.ts +++ b/src/bundles/midi/src/utils.ts @@ -30,7 +30,7 @@ export function noteToValues(note: NoteWithOctave, func_name: string = noteToVal ] as [NoteName, Accidental, number]; } -export function midiNoteToNoteName(midiNote: MIDINote, accidental: 'flat' | 'sharp', func_name: string = midiNoteToNoteName.name): Note { +export function midiNoteToNoteName(midiNote: MIDINote, accidental: 'flat' | 'sharp', func_name: string): Note { switch (midiNote % 12) { case 0: return 'C'; diff --git a/src/bundles/nbody/package.json b/src/bundles/nbody/package.json index cbf4d4f724..7b0cdc5e48 100644 --- a/src/bundles/nbody/package.json +++ b/src/bundles/nbody/package.json @@ -23,7 +23,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/painter/package.json b/src/bundles/painter/package.json index 0fd76367ab..913d66234d 100644 --- a/src/bundles/painter/package.json +++ b/src/bundles/painter/package.json @@ -21,7 +21,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/physics_2d/package.json b/src/bundles/physics_2d/package.json index 5ba512a551..2dbea63753 100644 --- a/src/bundles/physics_2d/package.json +++ b/src/bundles/physics_2d/package.json @@ -20,7 +20,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/pix_n_flix/package.json b/src/bundles/pix_n_flix/package.json index 14bcafe594..b1ff8a1868 100644 --- a/src/bundles/pix_n_flix/package.json +++ b/src/bundles/pix_n_flix/package.json @@ -5,13 +5,13 @@ "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", "@types/react": "^18.3.1", - "@vitest/browser-playwright": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", "playwright": "^1.55.1", "react": "^18.3.1", "react-dom": "^18.3.1", "typescript": "^5.8.2", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "type": "module", "exports": { @@ -23,7 +23,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/plotly/package.json b/src/bundles/plotly/package.json index 36536a2cc4..778e9fcffe 100644 --- a/src/bundles/plotly/package.json +++ b/src/bundles/plotly/package.json @@ -5,7 +5,7 @@ "dependencies": { "@sourceacademy/bundle-curve": "workspace:^", "@sourceacademy/bundle-sound": "workspace:^", - "js-slang": "^1.0.81", + "js-slang": "^1.0.85", "plotly.js-dist": "^3.0.0" }, "devDependencies": { @@ -23,7 +23,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/plotly/src/functions.ts b/src/bundles/plotly/src/functions.ts index 4718e82630..f7e07f1fe9 100644 --- a/src/bundles/plotly/src/functions.ts +++ b/src/bundles/plotly/src/functions.ts @@ -25,7 +25,7 @@ context.moduleContexts.plotly.state = { /** * Adds a new plotly plot to the context which will be rendered in the Plotly Tabs * @example - * ```typescript + * ``` * const z1 = [ * [8.83,8.89,8.81,8.87,8.9,8.87], * [8.89,8.94,8.85,8.94,8.96,8.92], @@ -42,79 +42,8 @@ context.moduleContexts.plotly.state = { * [9,9.01,9,9.2,9.23,9.2], * [8.99,8.99,8.98,9.18,9.2,9.19], * [8.93,8.97,8.97,9.18,9.2,9.18] - * ]; - * new_plot(list(pair("z", z1), pair("type", "surface"))) // creates a surface plot in Plotly Tab - * ``` - * - * - * @Types - * ``` typescript - * // The data format for input [{field_name}, value] from among the following fields - * data = { - * type: PlotType; - * x: Datum[] | Datum[][]; - * y: Datum[] | Datum[][]; - * z: Datum[] | Datum[][] | Datum[][][]; - * mode: - * | 'lines' - * | 'markers' - * | 'text' - * | 'lines+markers' - * | 'text+markers' - * | 'text+lines' - * | 'text+lines+markers' - * } - * - * - * type Datum = string | number | Date | null; - * type PlotType = - * | 'bar' - * | 'barpolar' - * | 'box' - * | 'candlestick' - * | 'carpet' - * | 'choropleth' - * | 'choroplethmapbox' - * | 'cone' - * | 'contour' - * | 'contourcarpet' - * | 'densitymapbox' - * | 'funnel' - * | 'funnelarea' - * | 'heatmap' - * | 'heatmapgl' - * | 'histogram' - * | 'histogram2d' - * | 'histogram2dcontour' - * | 'image' - * | 'indicator' - * | 'isosurface' - * | 'mesh3d' - * | 'ohlc' - * | 'parcats' - * | 'parcoords' - * | 'pie' - * | 'pointcloud' - * | 'sankey' - * | 'scatter' - * | 'scatter3d' - * | 'scattercarpet' - * | 'scattergeo' - * | 'scattergl' - * | 'scattermapbox' - * | 'scatterpolar' - * | 'scatterpolargl' - * | 'scatterternary' - * | 'splom' - * | 'streamtube' - * | 'sunburst' - * | 'surface' - * | 'table' - * | 'treemap' - * | 'violin' - * | 'volume' - * | 'waterfall'; - * + * ]; + * new_plot(list(pair('z', z1), pair('type', 'surface'))); // creates a surface plot in Plotly Tab * ``` * @param data The data in the form of list of pair, with the first term in the pair is * the name of the field as a string and the second term is the value of the field @@ -127,8 +56,7 @@ export function new_plot(data: ListOfPairs): void { /** * Adds a new plotly plot to the context which will be rendered in the Plotly Tabs * @example - * ```typescript - * + * ``` * const z1 = [ * [8.83,8.89,8.81,8.87,8.9,8.87], * [8.89,8.94,8.85,8.94,8.96,8.92], @@ -145,92 +73,18 @@ export function new_plot(data: ListOfPairs): void { * [9,9.01,9,9.2,9.23,9.2], * [8.99,8.99,8.98,9.18,9.2,9.19], * [8.93,8.97,8.97,9.18,9.2,9.18] - * ]; + * ]; * * let z2 = []; - * for (var i=0;i make_point(t, t)); @@ -342,7 +196,7 @@ export const draw_connected_2d = createPlotFunction( * @function * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points - * @return function of type 3D Curve → Drawing + * @returns function of type 3D Curve → Drawing * @example * ``` * draw_connected_3d(100)(t => make_point(t, t)); @@ -363,10 +217,11 @@ export const draw_connected_3d = createPlotFunction( * * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points * @function - * @return function of type 2D Curve → Drawing + * @returns function of type 2D Curve → Drawing * @example * ``` * draw_points_2d(100)(t => make_point(t, t)); + * ``` */ export const draw_points_2d = createPlotFunction( 'scatter', @@ -389,10 +244,11 @@ export const draw_points_2d = createPlotFunction( * * @param num determines the number of points, lower than 65535, to be sampled. * Including 0 and 1, there are `num + 1` evenly spaced sample points * @function - * @return function of type 3D Curve → Drawing + * @returns function of type 3D Curve → Drawing * @example * ``` * draw_points_3d(100)(t => make_point(t, t)); + * ``` */ export const draw_points_3d = createPlotFunction( 'scatter3d', diff --git a/src/bundles/remote_execution/package.json b/src/bundles/remote_execution/package.json index 9a3aa72a61..8303d2e315 100644 --- a/src/bundles/remote_execution/package.json +++ b/src/bundles/remote_execution/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -19,7 +19,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/repeat/package.json b/src/bundles/repeat/package.json index ba7ff6d790..f65d342dab 100644 --- a/src/bundles/repeat/package.json +++ b/src/bundles/repeat/package.json @@ -16,7 +16,7 @@ "test": "buildtools test --project .", "tsc": "buildtools tsc .", "lint": "buildtools lint .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/repeat/src/functions.ts b/src/bundles/repeat/src/functions.ts index 4f2b02dfe5..04b659da1b 100644 --- a/src/bundles/repeat/src/functions.ts +++ b/src/bundles/repeat/src/functions.ts @@ -7,13 +7,13 @@ * Returns a new function which when applied to an argument, has the same effect * as applying the specified function to the same argument n times. * @example - * ```typescript + * ``` * const plusTen = repeat(x => x + 2, 5); * plusTen(0); // Returns 10 * ``` * @param func the function to be repeated * @param n the number of times to repeat the function - * @return the new function that has the same effect as func repeated n times + * @returns the new function that has the same effect as func repeated n times */ export function repeat(func: Function, n: number): Function { return n === 0 ? (x: any) => x : (x: any) => func(repeat(func, n - 1)(x)); @@ -23,12 +23,12 @@ export function repeat(func: Function, n: number): Function { * Returns a new function which when applied to an argument, has the same effect * as applying the specified function to the same argument 2 times. * @example - * ```typescript + * ``` * const plusTwo = twice(x => x + 1); * plusTwo(2); // Returns 4 * ``` * @param func the function to be repeated - * @return the new function that has the same effect as `(x => func(func(x)))` + * @returns the new function that has the same effect as `(x => func(func(x)))` */ export function twice(func: Function): Function { return repeat(func, 2); @@ -38,12 +38,12 @@ export function twice(func: Function): Function { * Returns a new function which when applied to an argument, has the same effect * as applying the specified function to the same argument 3 times. * @example - * ```typescript + * ``` * const plusNine = thrice(x => x + 3); * plusNine(0); // Returns 9 * ``` * @param func the function to be repeated - * @return the new function that has the same effect as `(x => func(func(func(x))))` + * @returns the new function that has the same effect as `(x => func(func(func(x))))` */ export function thrice(func: Function): Function { return repeat(func, 3); diff --git a/src/bundles/repl/package.json b/src/bundles/repl/package.json index a0561d4c53..43f1d31c8f 100644 --- a/src/bundles/repl/package.json +++ b/src/bundles/repl/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -19,7 +19,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/robot_simulation/package.json b/src/bundles/robot_simulation/package.json index bc10827e5f..c8d974932b 100644 --- a/src/bundles/robot_simulation/package.json +++ b/src/bundles/robot_simulation/package.json @@ -4,6 +4,7 @@ "private": true, "dependencies": { "@sourceacademy/modules-lib": "workspace:^", + "js-slang": "^1.0.85", "three": "^0.181.0" }, "devDependencies": { @@ -24,7 +25,7 @@ "test": "buildtools test --project .", "tsc": "buildtools tsc .", "lint": "buildtools lint .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Chassis.test.ts b/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Chassis.test.ts index 3b4921473a..c7760eea54 100644 --- a/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Chassis.test.ts +++ b/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Chassis.test.ts @@ -4,15 +4,18 @@ import { EntityFactory, MeshFactory, Physics, Renderer } from '../../../../engin import { ChassisWrapper } from '../Chassis'; -vi.mock('../../../../engine', () => ({ +// @ts-expect-error not a complete mock of engine +vi.mock(import('../../../../engine'), () => ({ Physics: vi.fn(), Renderer: vi.fn(), EntityFactory: { addCuboid: vi.fn() }, MeshFactory: { addCuboid: vi.fn() } })); -vi.mock('../../../../engine/Entity/EntityFactory'); -vi.mock('three', async importOriginal => { +vi.mock(import('../../../../engine/Entity/EntityFactory')); + +vi.mock(import('three'), async importOriginal => { + // @ts-expect-error Not a complete mock of three.js return { ...await importOriginal(), Mesh: vi.fn(class { @@ -21,7 +24,7 @@ vi.mock('three', async importOriginal => { visible = false; }), Color: vi.fn() - }; + } as typeof THREE; }); const mockedMeshFactory = vi.mocked(MeshFactory); diff --git a/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Wheel.test.ts b/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Wheel.test.ts index e2346993e0..bb5ef0ed94 100644 --- a/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Wheel.test.ts +++ b/src/bundles/robot_simulation/src/controllers/ev3/components/__tests__/Wheel.test.ts @@ -1,6 +1,6 @@ import * as THREE from 'three'; import { beforeEach, describe, expect, it, vi } from 'vitest'; -import { Wheel } from '../../../ev3/components/Wheel'; +import { Wheel } from '../Wheel'; vi.mock(import('../../../../engine/Render/debug/DebugArrow'), () => ({ DebugArrow: class { diff --git a/src/bundles/robot_simulation/src/controllers/ev3/feedback_control/__tests__/PidController.test.ts b/src/bundles/robot_simulation/src/controllers/ev3/feedback_control/__tests__/PidController.test.ts index 4538f75b6f..f0c3a02559 100644 --- a/src/bundles/robot_simulation/src/controllers/ev3/feedback_control/__tests__/PidController.test.ts +++ b/src/bundles/robot_simulation/src/controllers/ev3/feedback_control/__tests__/PidController.test.ts @@ -1,6 +1,6 @@ import * as THREE from 'three'; import { beforeEach, describe, expect, it } from 'vitest'; -import { NumberPidController, VectorPidController } from '../../../ev3/feedback_control/PidController'; +import { NumberPidController, VectorPidController } from '../PidController'; const resetPid = (pidController: NumberPidController) => { pidController.errorsSum = 0; diff --git a/src/bundles/robot_simulation/src/controllers/program/__tests__/Program.test.ts b/src/bundles/robot_simulation/src/controllers/program/__tests__/Program.test.ts index eb09b58ec2..e61cbfdf28 100644 --- a/src/bundles/robot_simulation/src/controllers/program/__tests__/Program.test.ts +++ b/src/bundles/robot_simulation/src/controllers/program/__tests__/Program.test.ts @@ -1,10 +1,10 @@ import { beforeEach, describe, expect, it, vi } from 'vitest'; import { CallbackHandler } from '../../../engine/Core/CallbackHandler'; -import { Program, program_controller_identifier } from '../../program/Program'; -import { runECEvaluator } from '../../program/evaluate'; +import { Program, program_controller_identifier } from '../Program'; +import { runECEvaluator } from '../evaluate'; vi.mock(import('../../../engine/Core/CallbackHandler')); -vi.mock(import('../../program/evaluate')); +vi.mock(import('../evaluate')); const mockedRunECEvaluator = vi.mocked(runECEvaluator); const mockedCallbackHandler = vi.mocked(CallbackHandler); diff --git a/src/bundles/robot_simulation/src/engine/Core/__tests__/CallbackHandler.test.ts b/src/bundles/robot_simulation/src/engine/Core/__tests__/CallbackHandler.test.ts index 8b3608a625..b53e2101d8 100644 --- a/src/bundles/robot_simulation/src/engine/Core/__tests__/CallbackHandler.test.ts +++ b/src/bundles/robot_simulation/src/engine/Core/__tests__/CallbackHandler.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test, vi } from 'vitest'; -import { CallbackHandler } from '../../Core/CallbackHandler'; import type { PhysicsTimingInfo } from '../../Physics'; +import { CallbackHandler } from '../CallbackHandler'; // Helper function to create a PhysicsTimingInfo object // CallbackHandler only uses the stepCount and timestep properties diff --git a/src/bundles/robot_simulation/src/engine/Core/__tests__/Controller.test.ts b/src/bundles/robot_simulation/src/engine/Core/__tests__/Controller.test.ts index 523e92105d..bec91a6b1e 100644 --- a/src/bundles/robot_simulation/src/engine/Core/__tests__/Controller.test.ts +++ b/src/bundles/robot_simulation/src/engine/Core/__tests__/Controller.test.ts @@ -1,10 +1,10 @@ import { describe, expect, test, vi, type Mock } from 'vitest'; +import type { PhysicsTimingInfo } from '../../Physics'; import { ControllerGroup, ControllerMap, type Controller, -} from '../../Core/Controller'; -import type { PhysicsTimingInfo } from '../../Physics'; +} from '../Controller'; // Helper function to create a PhysicsTimingInfo object // CallbackHandler only uses the stepCount and timestep properties diff --git a/src/bundles/robot_simulation/src/engine/Core/__tests__/Events.test.ts b/src/bundles/robot_simulation/src/engine/Core/__tests__/Events.test.ts index a5d387ccf9..f8db54d66a 100644 --- a/src/bundles/robot_simulation/src/engine/Core/__tests__/Events.test.ts +++ b/src/bundles/robot_simulation/src/engine/Core/__tests__/Events.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { TypedEventTarget } from '../../Core/Events'; +import { TypedEventTarget } from '../Events'; class StringEvent extends Event { public data: string; diff --git a/src/bundles/robot_simulation/src/engine/Core/__tests__/RobotConsole.test.ts b/src/bundles/robot_simulation/src/engine/Core/__tests__/RobotConsole.test.ts index c43268a4b7..004d0ea3a1 100644 --- a/src/bundles/robot_simulation/src/engine/Core/__tests__/RobotConsole.test.ts +++ b/src/bundles/robot_simulation/src/engine/Core/__tests__/RobotConsole.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, test } from 'vitest'; -import { RobotConsole } from '../../Core/RobotConsole'; // Adjust the import path as necessary +import { RobotConsole } from '../RobotConsole'; describe(RobotConsole, () => { let robotConsole: RobotConsole; diff --git a/src/bundles/robot_simulation/src/engine/Core/__tests__/Timer.test.ts b/src/bundles/robot_simulation/src/engine/Core/__tests__/Timer.test.ts index 5711ceb430..5ec6171238 100644 --- a/src/bundles/robot_simulation/src/engine/Core/__tests__/Timer.test.ts +++ b/src/bundles/robot_simulation/src/engine/Core/__tests__/Timer.test.ts @@ -1,5 +1,5 @@ import { beforeEach, describe, expect, it } from 'vitest'; -import { Timer } from '../../Core/Timer'; // Adjust the import path as per your project structure +import { Timer } from '../Timer'; // Adjust the import path as per your project structure describe(Timer, () => { let timer; diff --git a/src/bundles/robot_simulation/src/engine/Entity/__tests__/Entity.test.ts b/src/bundles/robot_simulation/src/engine/Entity/__tests__/Entity.test.ts index 72228a64c3..90b239df71 100644 --- a/src/bundles/robot_simulation/src/engine/Entity/__tests__/Entity.test.ts +++ b/src/bundles/robot_simulation/src/engine/Entity/__tests__/Entity.test.ts @@ -1,8 +1,8 @@ import type Rapier from '@dimforge/rapier3d-compat'; import { beforeEach, describe, expect, test, vi } from 'vitest'; -import { Entity } from '../../Entity/Entity'; import { vec3 } from '../../Math/Convert'; import type { SimpleQuaternion, SimpleVector } from '../../Math/Vector'; +import { Entity } from '../Entity'; const createRigidBodyMock = ( translation: SimpleVector, diff --git a/src/bundles/robot_simulation/src/engine/Math/__tests__/Convert.test.ts b/src/bundles/robot_simulation/src/engine/Math/__tests__/Convert.test.ts index 291b9c7f38..4ce63f6fed 100644 --- a/src/bundles/robot_simulation/src/engine/Math/__tests__/Convert.test.ts +++ b/src/bundles/robot_simulation/src/engine/Math/__tests__/Convert.test.ts @@ -1,6 +1,6 @@ import { Euler, Quaternion, Vector3 } from 'three'; import { describe, expect, it } from 'vitest'; -import { euler, quat, vec3 } from '../../Math/Convert'; // Adjust the import path as necessary +import { euler, quat, vec3 } from '../Convert'; // Adjust the import path as necessary describe('Three.js utility functions', () => { describe('quat function', () => { diff --git a/src/bundles/robot_simulation/src/engine/Render/__tests__/MeshFactory.test.ts b/src/bundles/robot_simulation/src/engine/Render/__tests__/MeshFactory.test.ts index 63380ef46b..06fa0ab0a8 100644 --- a/src/bundles/robot_simulation/src/engine/Render/__tests__/MeshFactory.test.ts +++ b/src/bundles/robot_simulation/src/engine/Render/__tests__/MeshFactory.test.ts @@ -1,10 +1,10 @@ import * as THREE from 'three'; import { describe, expect, it, vi } from 'vitest'; -import { addCuboid } from '../../Render/helpers/MeshFactory'; +import { addCuboid } from '../helpers/MeshFactory'; // Mock the necessary Three.js methods and classes -vi.mock('three', async importOriginal => { - const originalModule: any = await importOriginal(); +vi.mock(import('three'), async importOriginal => { + const originalModule = await importOriginal(); class Vector3 { x: number; @@ -46,6 +46,7 @@ vi.mock('three', async importOriginal => { } } + // @ts-expect-error Not a complete mock of threejs return { ...originalModule, BoxGeometry: vi.fn(), @@ -61,7 +62,7 @@ vi.mock('three', async importOriginal => { Color: vi.fn().mockImplementation(function (color) { return { color }; }), - }; + } as typeof THREE; }); describe(addCuboid, () => { diff --git a/src/bundles/robot_simulation/src/engine/Render/__tests__/helpers/Camera.test.ts b/src/bundles/robot_simulation/src/engine/Render/__tests__/helpers/Camera.test.ts index 73028d8a45..92bdf79595 100644 --- a/src/bundles/robot_simulation/src/engine/Render/__tests__/helpers/Camera.test.ts +++ b/src/bundles/robot_simulation/src/engine/Render/__tests__/helpers/Camera.test.ts @@ -1,7 +1,7 @@ import * as THREE from 'three'; import { describe, expect, test } from 'vitest'; -import { getCamera, type CameraOptions } from '../../../Render/helpers/Camera'; +import { getCamera, type CameraOptions } from '../../helpers/Camera'; describe(getCamera, () => { test('returns a PerspectiveCamera when type is "perspective"', () => { diff --git a/src/bundles/robot_simulation/src/engine/__tests__/Physics.test.ts b/src/bundles/robot_simulation/src/engine/__tests__/Physics.test.ts index 6e70a95c2a..ebbd630a83 100644 --- a/src/bundles/robot_simulation/src/engine/__tests__/Physics.test.ts +++ b/src/bundles/robot_simulation/src/engine/__tests__/Physics.test.ts @@ -4,23 +4,23 @@ import { beforeEach, describe, expect, test, vi } from 'vitest'; import { Physics } from '../Physics'; // Mock rapier -vi.mock('@dimforge/rapier3d-compat', () => { - return { - default: { - init: vi.fn(), - World: class { - timestep = vi.fn(); - createRigidBody = vi.fn(); - createCollider = vi.fn(); - castRayAndGetNormal = vi.fn(); - step = vi.fn(); - castRay = vi.fn(); - }, - Ray: vi.fn(), - RigidBodyDesc: vi.fn(), - ColliderDesc: vi.fn(), - } - }; +vi.mock(import('@dimforge/rapier3d-compat'), () => { + const mocked: typeof rapier = { + init: vi.fn(), + World: class { + timestep = vi.fn(); + createRigidBody = vi.fn(); + createCollider = vi.fn(); + castRayAndGetNormal = vi.fn(); + step = vi.fn(); + castRay = vi.fn(); + }, + Ray: vi.fn(), + RigidBodyDesc: vi.fn(), + ColliderDesc: vi.fn(), + } as any; + + return { default: mocked }; }); describe(Physics, () => { diff --git a/src/bundles/robot_simulation/src/helper_functions.ts b/src/bundles/robot_simulation/src/helper_functions.ts index 8a1d48ca30..49ac78a161 100644 --- a/src/bundles/robot_simulation/src/helper_functions.ts +++ b/src/bundles/robot_simulation/src/helper_functions.ts @@ -235,17 +235,17 @@ export function createWorld( * @example * ``` * init_simulation(() => { - * const physics = createPhysics(); - * const renderer = createRenderer(); - * const timer = createTimer(); - * const robot_console = createRobotConsole(); - * const world = createWorld(physics, renderer, timer, robot_console); + * const physics = createPhysics(); + * const renderer = createRenderer(); + * const timer = createTimer(); + * const robot_console = createRobotConsole(); + * const world = createWorld(physics, renderer, timer, robot_console); * - * const cuboid = createCuboid(...); - * addControllerToWorld(cuboid, world); + * const cuboid = createCuboid(); + * addControllerToWorld(cuboid, world); * - * return world; - * }); + * return world; + * }); * ``` * * @category Controller @@ -473,10 +473,10 @@ export function saveToContext(key: string, value: any) { * @example * ``` * init_simulation(() => { - * ... + * // ... other code * const ev3 = createEv3(physics, renderer); * saveToContext('ev3', ev3); - * }) + * }); * ``` * * @param physics The physics engine of the world. See {@link createPhysics} diff --git a/src/bundles/rune/package.json b/src/bundles/rune/package.json index 51e90fecb9..212ea20643 100644 --- a/src/bundles/rune/package.json +++ b/src/bundles/rune/package.json @@ -4,11 +4,13 @@ "private": true, "dependencies": { "@sourceacademy/modules-lib": "workspace:^", - "gl-matrix": "^3.3.0" + "gl-matrix": "^3.3.0", + "lodash": "^4.17.23" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", - "js-slang": "^1.0.81", + "@types/lodash": "^4.14.198", + "js-slang": "^1.0.85", "typescript": "^5.8.2" }, "type": "module", @@ -21,7 +23,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/rune/src/display.ts b/src/bundles/rune/src/display.ts index 92b5904f1b..c00eb000de 100644 --- a/src/bundles/rune/src/display.ts +++ b/src/bundles/rune/src/display.ts @@ -68,7 +68,7 @@ class RuneDisplay { * Renders the specified Rune in a tab as a basic drawing. * @function * @param rune - The Rune to render - * @return {Rune} The specified Rune + * @returns {Rune} The specified Rune * * @category Main */ @@ -79,7 +79,7 @@ export const show = RuneDisplay.show; * anaglyph. * @function * @param rune - The Rune to render - * @return {Rune} The specified Rune + * @returns {Rune} The specified Rune * * @category Main */ @@ -90,7 +90,7 @@ export const anaglyph = RuneDisplay.anaglyph; * of 0.1. * @function * @param rune - The Rune to render - * @return {Rune} The specified Rune + * @returns {Rune} The specified Rune * * @category Main */ @@ -102,7 +102,7 @@ export const hollusion = RuneDisplay.hollusion; * @function * @param rune - The Rune to render * @param {number} magnitude - The hollusion's magnitude - * @return {Rune} The specified Rune + * @returns {Rune} The specified Rune * * @category Main */ diff --git a/src/bundles/rune/src/functions.ts b/src/bundles/rune/src/functions.ts index 7a34c5f925..84731063b2 100644 --- a/src/bundles/rune/src/functions.ts +++ b/src/bundles/rune/src/functions.ts @@ -633,7 +633,7 @@ export class HollusionRune extends DrawnRune { lastTime = timeInMs; const framePos - = Math.floor(timeInMs / (period / frameCount)) % frameCount; + = Math.floor(timeInMs / (period / frameCount)) % frameCount; const fbObject = frameBuffer[framePos]; gl.clearColor(1.0, 1.0, 1.0, 1.0); // Set clear color to white, fully opaque gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); // Clear the viewport @@ -659,7 +659,7 @@ export const isHollusionRune = (rune: DrawnRune): rune is HollusionRune => rune * of the result * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -675,7 +675,7 @@ export const beside = RuneFunctions.beside; * @param {number} frac - Fraction between 0 and 1 (inclusive) * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -755,7 +755,7 @@ export const corner = RuneFunctions.corner; * flipping it around a vertical axis, * creating a mirror image * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -767,7 +767,7 @@ export const flip_horiz = RuneFunctions.flip_horiz; * flipping it around a horizontal axis, * turning it upside down * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -817,7 +817,7 @@ export const indigo = RuneColours.indigo; * arranging into a square for copies of the * given Rune in different orientations * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -847,7 +847,7 @@ export const orange = RuneColours.orange; * The depth range of the z-axis of a rune is [0,-1], this function maps the depth range of rune1 and rune2 to [0,-0.5] and [-0.5,-1] respectively. * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Runes + * @returns {Rune} Resulting Runes * @function * * @category Main @@ -859,7 +859,7 @@ export const overlay = RuneFunctions.overlay; * @param {number} frac - Fraction between 0 and 1 (inclusive) * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -898,7 +898,7 @@ export const purple = RuneColours.purple; * by turning it a quarter-turn in * anti-clockwise direction. * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -910,7 +910,7 @@ export const quarter_turn_left = RuneFunctions.quarter_turn_left; * by turning it a quarter-turn around the centre in * clockwise direction. * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -954,7 +954,7 @@ export const red = RuneColours.red; * @param {number} n - A non-negative integer * @param {function} pattern - Unary function from Rune to Rune * @param {Rune} initial - The initial Rune - * @return {Rune} - Result of n times application of pattern to initial: + * @returns {Rune} - Result of n times application of pattern to initial: * pattern(pattern(...pattern(pattern(initial))...)) * @function * @@ -977,7 +977,7 @@ export const ribbon = RuneFunctions.ribbon; * may be cropped as a result. * @param {number} rad - Angle in radians * @param {Rune} rune - Given Rune - * @return {Rune} Rotated Rune + * @returns {Rune} Rotated Rune * @function * * @category Main @@ -995,7 +995,7 @@ export const sail = RuneFunctions.sail; * Scales a given Rune by a given factor in both x and y direction * @param {number} ratio - Scaling factor * @param {Rune} rune - Given Rune - * @return {Rune} Resulting scaled Rune + * @returns {Rune} Resulting scaled Rune * @function * * @category Main @@ -1007,7 +1007,7 @@ export const scale = RuneFunctions.scale; * @param {number} ratio_x - Scaling factor in x direction * @param {number} ratio_y - Scaling factor in y direction * @param {Rune} rune - Given Rune - * @return {Rune} Resulting scaled Rune + * @returns {Rune} Resulting scaled Rune * @function * * @category Main @@ -1021,7 +1021,7 @@ export const scale_independent = RuneFunctions.scale_independent; * result * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -1037,7 +1037,7 @@ export const stack = RuneFunctions.stack; * @param {number} frac - Fraction between 0 and 1 (inclusive) * @param {Rune} rune1 - Given Rune * @param {Rune} rune2 - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -1049,7 +1049,7 @@ export const stack_frac = RuneFunctions.stack_frac; * by vertically stacking n copies of it * @param {number} n - Positive integer * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main @@ -1068,7 +1068,7 @@ export const square = RuneFunctions.square; * @param {number} x - Translation in x direction * @param {number} y - Translation in y direction * @param {Rune} rune - Given Rune - * @return {Rune} Resulting translated Rune + * @returns {Rune} Resulting translated Rune * @function * * @category Main @@ -1086,7 +1086,7 @@ export const triangle = RuneFunctions.triangle; * Makes a new Rune from a given Rune * by turning it upside-down * @param {Rune} rune - Given Rune - * @return {Rune} Resulting Rune + * @returns {Rune} Resulting Rune * @function * * @category Main diff --git a/src/bundles/rune/src/rune.ts b/src/bundles/rune/src/rune.ts index aa25a6e255..77426d7890 100644 --- a/src/bundles/rune/src/rune.ts +++ b/src/bundles/rune/src/rune.ts @@ -52,21 +52,32 @@ void main(void) { `; /** * The basic data-representation of a Rune. When the Rune is drawn, every 3 consecutive vertex will form a triangle. - * @field vertices - A list of vertex coordinates, each vertex has 4 coordiante (x,y,z,t). - * @field colors - A list of vertex colors, each vertex has a color (r,g,b,a). - * @field transformMatrix - A mat4 that is applied to all the vertices and the sub runes - * @field subRune - A (potentially empty) list of Runes */ @classDeclaration('Rune') export class Rune { constructor( + /** + * A list of vertex coordinates, each vertex has 4 coordiante (x,y,z,t). + */ public vertices: Float32Array, + + /** + * A list of vertex colors, each vertex has a color (r,g,b,a). + */ public colors: Float32Array | null, + + /** + * A mat4 that is applied to all the vertices and the sub runes + */ public transformMatrix: mat4, + + /** + * A (potentially empty) list of Runes + */ public subRunes: Rune[], public texture: HTMLImageElement | null, public hollusionDistance: number - ) {} + ) { } public copy = () => new Rune( this.vertices, @@ -79,7 +90,7 @@ export class Rune { /** * Flatten the subrunes to return a list of runes - * @return Rune[], a list of runes + * @returns Rune[], a list of runes */ public flatten = () => { const runeList: Rune[] = []; @@ -357,7 +368,7 @@ export abstract class DrawnRune implements ReplResult { constructor( protected readonly rune: Rune, public readonly isHollusion: boolean - ) {} + ) { } public toReplString = () => ''; diff --git a/src/bundles/rune_in_words/package.json b/src/bundles/rune_in_words/package.json index 1205da91bc..941518069d 100644 --- a/src/bundles/rune_in_words/package.json +++ b/src/bundles/rune_in_words/package.json @@ -16,7 +16,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/rune_in_words/src/functions.ts b/src/bundles/rune_in_words/src/functions.ts index 7da7e9e396..b359c37875 100644 --- a/src/bundles/rune_in_words/src/functions.ts +++ b/src/bundles/rune_in_words/src/functions.ts @@ -116,7 +116,7 @@ export function from_url(imageUrl: string): string { * @param ratio_x - Scaling factor in x direction * @param ratio_y - Scaling factor in y direction * @param rune - Given Rune - * @return Resulting scaled Rune + * @returns Resulting scaled Rune * * @category Main */ @@ -133,7 +133,7 @@ export function scale_independent( * Scales a given Rune by a given factor in both x and y direction * @param ratio - Scaling factor * @param rune - Given Rune - * @return Resulting scaled Rune + * @returns Resulting scaled Rune * * @category Main */ @@ -147,7 +147,7 @@ export function scale(ratio: number, rune: string): string { * @param x - Translation in x direction * @param y - Translation in y direction * @param rune - Given Rune - * @return Resulting translated Rune + * @returns Resulting translated Rune * * @category Main */ @@ -163,7 +163,7 @@ export function translate(x: number, y: number, rune: string): string { * may be cropped as a result. * @param rad - Angle in radians * @param rune - Given Rune - * @return Rotated Rune + * @returns Rotated Rune * * @category Main */ @@ -181,7 +181,7 @@ export function rotate(rad: number, rune: string): string { * @param frac - Fraction between 0 and 1 (inclusive) * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -199,7 +199,7 @@ export function stack_frac(frac: number, rune1: string, rune2: string): string { * result * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -213,7 +213,7 @@ export function stack(rune1: string, rune2: string): string { * by vertically stacking n copies of it * @param n - Positive integer * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -228,7 +228,7 @@ export function stackn(n: number, rune: string): string { * by turning it a quarter-turn around the centre in * clockwise direction. * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -242,7 +242,7 @@ export function quarter_turn_right(rune: string): string { * by turning it a quarter-turn in * anti-clockwise direction. * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -255,7 +255,7 @@ export function quarter_turn_left(rune: string): string { * Makes a new Rune from a given Rune * by turning it upside-down * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -273,7 +273,7 @@ export function turn_upside_down(rune: string): string { * @param frac - Fraction between 0 and 1 (inclusive) * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -290,7 +290,7 @@ export function beside_frac(frac: number, rune1: string, rune2: string): string * of the result * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -304,7 +304,7 @@ export function beside(rune1: string, rune2: string): string { * flipping it around a horizontal axis, * turning it upside down * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -318,7 +318,7 @@ export function flip_vert(rune: string): string { * flipping it around a vertical axis, * creating a mirror image * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -332,7 +332,7 @@ export function flip_horiz(rune: string): string { * arranging into a square for copies of the * given Rune in different orientations * @param rune - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -349,7 +349,7 @@ export function make_cross(rune: string): string { * @param n - A non-negative integer * @param pattern - Unary function from Rune to Rune * @param initial - The initial Rune - * @return - Result of n times application of pattern to initial: + * @returns - Result of n times application of pattern to initial: * pattern(pattern(...pattern(pattern(initial))...)) * * @category Main @@ -374,7 +374,7 @@ export function repeat_pattern( * @param frac - Fraction between 0 and 1 (inclusive) * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Rune + * @returns Resulting Rune * * @category Main */ @@ -388,7 +388,7 @@ export function overlay_frac(frac: number, rune1: string, rune2: string): string * The depth range of the z-axis of a rune is [0,-1], this function maps the depth range of rune1 and rune2 to [0,-0.5] and [-0.5,-1] respectively. * @param rune1 - Given Rune * @param rune2 - Given Rune - * @return Resulting Runes + * @returns Resulting Runes * * @category Main */ @@ -573,7 +573,7 @@ export function white(rune: string): string { /** * Renders the specified Rune in a tab as a basic drawing. * @param rune - The Rune to render - * @return The specified Rune + * @returns The specified Rune * * @category Main */ @@ -586,7 +586,7 @@ export function show(rune: string): string { * Renders the specified Rune in a tab as an anaglyph. Use 3D glasses to view the * anaglyph. * @param rune - The Rune to render - * @return The specified Rune + * @returns The specified Rune * * @category Main */ @@ -599,7 +599,7 @@ export function anaglyph(rune: string): string { * Renders the specified Rune in a tab as a hollusion, with a default magnitude * of 0.1. * @param rune - The Rune to render - * @return The specified Rune + * @returns The specified Rune * * @category Main */ diff --git a/src/bundles/scrabble/package.json b/src/bundles/scrabble/package.json index 50619874a9..baa402eebe 100644 --- a/src/bundles/scrabble/package.json +++ b/src/bundles/scrabble/package.json @@ -16,7 +16,7 @@ "test": "buildtools test --project .", "tsc": "buildtools tsc .", "lint": "buildtools lint .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/sound/package.json b/src/bundles/sound/package.json index f4a1aa5e8f..720c5f43e7 100644 --- a/src/bundles/sound/package.json +++ b/src/bundles/sound/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@sourceacademy/bundle-midi": "workspace:^", - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -23,7 +23,7 @@ "lint": "buildtools lint .", "tsc": "buildtools tsc .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/sound/src/functions.ts b/src/bundles/sound/src/functions.ts index 7c6e1fa9f8..70e7c4f7c4 100644 --- a/src/bundles/sound/src/functions.ts +++ b/src/bundles/sound/src/functions.ts @@ -311,7 +311,7 @@ function validateWave(func_name: string, wave: unknown): asserts wave is Wave { * * @param wave wave function of the Sound * @param duration duration of the Sound - * @return with wave as wave function and duration as duration + * @returns with wave as wave function and duration as duration * @example const s = make_sound(t => Math_sin(2 * Math_PI * 440 * t), 5); */ export function make_sound(wave: Wave, duration: number): Sound { @@ -325,7 +325,7 @@ export function make_sound(wave: Wave, duration: number): Sound { * Accesses the wave function of a given Sound. * * @param sound given Sound - * @return the wave function of the Sound + * @returns the wave function of the Sound * @example get_wave(make_sound(t => Math_sin(2 * Math_PI * 440 * t), 5)); // Returns t => Math_sin(2 * Math_PI * 440 * t) */ export function get_wave(sound: Sound): Wave { @@ -336,7 +336,7 @@ export function get_wave(sound: Sound): Wave { * Accesses the duration of a given Sound. * * @param sound given Sound - * @return the duration of the Sound + * @returns the duration of the Sound * @example get_duration(make_sound(t => Math_sin(2 * Math_PI * 440 * t), 5)); // Returns 5 */ export function get_duration(sound: Sound): number { @@ -347,7 +347,7 @@ export function get_duration(sound: Sound): number { * Checks if the argument is a Sound * * @param x input to be checked - * @return true if x is a Sound, false otherwise + * @returns true if x is a Sound, false otherwise * @example is_sound(make_sound(t => 0, 2)); // Returns true */ export function is_sound(x: unknown): x is Sound { @@ -363,7 +363,7 @@ export function is_sound(x: unknown): x is Sound { * given in seconds. * * @param wave the wave function to play, starting at 0 - * @return the resulting Sound + * @returns the resulting Sound * @example play_wave(t => math_sin(t * 3000), 5); */ export function play_wave(wave: Wave, duration: number): Sound { @@ -378,7 +378,7 @@ export function play_wave(wave: Wave, duration: number): Sound { * on top of any Sounds that are currently playing. * * @param sound the Sound to play - * @return the given Sound + * @returns the given Sound * @example play(sine_sound(440, 5)); */ export function play(sound: Sound): Sound { @@ -459,7 +459,7 @@ export function stop(): void { * Makes a noise Sound with given duration * * @param duration the duration of the noise sound - * @return resulting noise Sound + * @returns resulting noise Sound * @example noise_sound(5); * @category Primitive */ @@ -472,7 +472,7 @@ export function noise_sound(duration: number): Sound { * Makes a silence Sound with given duration * * @param duration the duration of the silence Sound - * @return resulting silence Sound + * @returns resulting silence Sound * @example silence_sound(5); * @category Primitive */ @@ -486,7 +486,7 @@ export function silence_sound(duration: number): Sound { * * @param freq the frequency of the sine wave Sound * @param duration the duration of the sine wave Sound - * @return resulting sine wave Sound + * @returns resulting sine wave Sound * @example sine_sound(440, 5); * @category Primitive */ @@ -500,7 +500,7 @@ export function sine_sound(freq: number, duration: number): Sound { * * @param f the frequency of the square wave Sound * @param duration the duration of the square wave Sound - * @return resulting square wave Sound + * @returns resulting square wave Sound * @example square_sound(440, 5); * @category Primitive */ @@ -524,7 +524,7 @@ export function square_sound(f: number, duration: number): Sound { * * @param freq the frequency of the triangle wave Sound * @param duration the duration of the triangle wave Sound - * @return resulting triangle wave Sound + * @returns resulting triangle wave Sound * @example triangle_sound(440, 5); * @category Primitive */ @@ -550,7 +550,7 @@ export function triangle_sound(freq: number, duration: number): Sound { * * @param freq the frequency of the sawtooth wave Sound * @param duration the duration of the sawtooth wave Sound - * @return resulting sawtooth wave Sound + * @returns resulting sawtooth wave Sound * @example sawtooth_sound(440, 5); * @category Primitive */ @@ -578,7 +578,7 @@ export function sawtooth_sound(freq: number, duration: number): Sound { * so on. The effect is that the Sounds in the list are joined end-to-end * * @param list_of_sounds given list of Sounds - * @return the combined Sound + * @returns the combined Sound * @example consecutively(list(sine_sound(200, 2), sine_sound(400, 3))); */ export function consecutively(list_of_sounds: List): Sound { @@ -601,7 +601,7 @@ export function consecutively(list_of_sounds: List): Sound { * and then divided by the length of the list. * * @param list_of_sounds given list of Sounds - * @return the combined Sound + * @returns the combined Sound * @example simultaneously(list(sine_sound(200, 2), sine_sound(400, 3))) */ export function simultaneously(list_of_sounds: List): Sound { @@ -648,7 +648,7 @@ export function simultaneously(list_of_sounds: List): Sound { * @param decay_ratio proportion of Sound decay phase * @param sustain_level sustain level between 0 and 1 * @param release_ratio proportion of Sound in release phase - * @return Envelope a function from Sound to Sound + * @returns Envelope a function from Sound to Sound * @example adsr(0.2, 0.3, 0.3, 0.1)(sound); */ export function adsr( @@ -699,7 +699,7 @@ export function adsr( * @param base_frequency frequency of the first harmonic * @param duration duration of the produced Sound, in seconds * @param envelopes – list of envelopes, which are functions from Sound to Sound - * @return Sound resulting Sound + * @returns Sound resulting Sound * @example stacking_adsr(sine_sound, 300, 5, list(adsr(0.1, 0.3, 0.2, 0.5), adsr(0.2, 0.5, 0.6, 0.1), adsr(0.3, 0.1, 0.7, 0.3))); */ export function stacking_adsr( @@ -733,7 +733,7 @@ export function stacking_adsr( * @param freq the frequency of the sine wave to be modulated * @param duration the duration of the output Sound * @param amount the amount of modulation to apply to the carrier sine wave - * @return function which takes in a Sound and returns a Sound + * @returns function which takes in a Sound and returns a Sound * @example phase_mod(440, 5, 1)(sine_sound(220, 5)); */ export function phase_mod( @@ -757,7 +757,7 @@ export function phase_mod( * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting bell Sound with given pitch and duration + * @returns Sound resulting bell Sound with given pitch and duration * @example bell(40, 1); * @category Instrument */ @@ -780,7 +780,7 @@ export function bell(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting cello Sound with given pitch and duration + * @returns Sound resulting cello Sound with given pitch and duration * @example cello(36, 5); * @category Instrument */ @@ -798,7 +798,7 @@ export function cello(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting piano Sound with given pitch and duration + * @returns Sound resulting piano Sound with given pitch and duration * @example piano(48, 5); * @category Instrument * @@ -817,7 +817,7 @@ export function piano(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting trombone Sound with given pitch and duration + * @returns Sound resulting trombone Sound with given pitch and duration * @example trombone(60, 2); * @category Instrument */ @@ -835,7 +835,7 @@ export function trombone(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting violin Sound with given pitch and duration + * @returns Sound resulting violin Sound with given pitch and duration * @example violin(53, 4); * @category Instrument */ diff --git a/src/bundles/sound/src/play_in_tab.ts b/src/bundles/sound/src/play_in_tab.ts index 85e39745cd..a55aa04fb1 100644 --- a/src/bundles/sound/src/play_in_tab.ts +++ b/src/bundles/sound/src/play_in_tab.ts @@ -11,7 +11,7 @@ context.moduleContexts.sound.state = { audioPlayed }; * in a Source Academy tab. * * @param sound the Sound to play - * @return the given Sound + * @returns the given Sound * @example play_in_tab(sine_sound(440, 5)); */ diff --git a/src/bundles/sound_matrix/package.json b/src/bundles/sound_matrix/package.json index 120f48dec8..7161042b62 100644 --- a/src/bundles/sound_matrix/package.json +++ b/src/bundles/sound_matrix/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", @@ -19,7 +19,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/stereo_sound/package.json b/src/bundles/stereo_sound/package.json index 66e50b406f..b8c3a00a93 100644 --- a/src/bundles/stereo_sound/package.json +++ b/src/bundles/stereo_sound/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@sourceacademy/bundle-midi": "workspace:^", - "js-slang": "^1.0.81" + "js-slang": "^1.0.85" }, "type": "module", "exports": { @@ -20,7 +20,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/stereo_sound/src/functions.ts b/src/bundles/stereo_sound/src/functions.ts index cfa855776d..c8c193c3dd 100644 --- a/src/bundles/stereo_sound/src/functions.ts +++ b/src/bundles/stereo_sound/src/functions.ts @@ -192,7 +192,7 @@ export function record(buffer: number): () => () => Sound { * play(promise()); * @param duration duration in seconds * @param buffer pause before recording, in seconds - * @return promise: nullary function which returns the recorded sound + * @returns promise: nullary function which returns the recorded sound */ export function record_for(duration: number, buffer: number): () => Sound { recorded_sound = undefined; @@ -253,7 +253,7 @@ function validateWave(func_name: string, wave: unknown, lr?: 'left' | 'right'): * @param left_wave wave function of the left channel of the Sound * @param right_wave wave function of the right channel of the Sound * @param duration duration of the Sound - * @return resulting stereo Sound + * @returns resulting stereo Sound * @example const s = make_stereo_sound(t => math_sin(2 * math_PI * 440 * t), t => math_sin(2 * math_PI * 300 * t), 5); */ export function make_stereo_sound( @@ -282,7 +282,7 @@ export function make_stereo_sound( * * @param wave wave function of the Sound * @param duration duration of the Sound - * @return Sound with the given `wave` function for both channels and `duration` as duration + * @returns Sound with the given `wave` function for both channels and `duration` as duration * @example const s = make_sound(t => math_sin(2 * math_PI * 440 * t), 5); */ export function make_sound(wave: Wave, duration: number): Sound { @@ -302,7 +302,7 @@ export function make_sound(wave: Wave, duration: number): Sound { * Accesses the left wave function of a given Sound. * * @param sound given Sound - * @return the wave function of the Sound + * @returns the wave function of the Sound * @example get_wave(make_sound(t => math_sin(2 * math_PI * 440 * t), 5)); // Returns t => math_sin(2 * math_PI * 440 * t) */ export function get_left_wave(sound: Sound): Wave { @@ -313,7 +313,7 @@ export function get_left_wave(sound: Sound): Wave { * Accesses the left wave function of a given Sound. * * @param sound given Sound - * @return the wave function of the Sound + * @returns the wave function of the Sound * @example get_wave(make_sound(t => math_sin(2 * math_PI * 440 * t), 5)); // Returns t => math_sin(2 * math_PI * 440 * t) */ export function get_right_wave(sound: Sound): Wave { @@ -324,7 +324,7 @@ export function get_right_wave(sound: Sound): Wave { * Accesses the duration of a given Sound. * * @param sound given Sound - * @return the duration of the Sound + * @returns the duration of the Sound * @example get_duration(make_sound(t => math_sin(2 * math_PI * 440 * t), 5)); // Returns 5 */ export function get_duration(sound: Sound): number { @@ -335,7 +335,7 @@ export function get_duration(sound: Sound): number { * Checks if the argument is a Sound * * @param x input to be checked - * @return true if x is a Sound, false otherwise + * @returns true if x is a Sound, false otherwise * @example is_sound(make_sound(t => 0, 2)); // Returns true */ export function is_sound(x: unknown): x is Sound { @@ -352,7 +352,7 @@ export function is_sound(x: unknown): x is Sound { * given in seconds. * * @param wave the wave function to play, starting at 0 - * @return the given Sound + * @returns the given Sound * @example play_wave(t => math_sin(t * 3000), 5); */ export function play_wave(wave: Wave, duration: number): Sound { @@ -368,7 +368,7 @@ export function play_wave(wave: Wave, duration: number): Sound { * * @param left_wave the wave function to play on the left channel, starting at 0 * @param right_wave the wave function to play on the right channel, starting at 0 - * @return the given Sound + * @returns the given Sound * @example play_waves(t => math_sin(t * 3000), t => math_sin(t * 6000), 5); */ export function play_waves( @@ -389,7 +389,7 @@ export function play_waves( * in a Source Academy tab. * * @param sound the Sound to play - * @return the given Sound + * @returns the given Sound * @example play_in_tab(sine_sound(440, 5)); */ export function play_in_tab(sound: Sound): Sound { @@ -401,7 +401,7 @@ export function play_in_tab(sound: Sound): Sound { throw new Error(`${play_in_tab.name}: audio system still playing previous sound`); } - const duration = get_duration(sound) ; + const duration = get_duration(sound); if (duration < 0) { throw new Error(`${play_in_tab.name}: duration of sound is negative`); } else if (duration === 0) { @@ -489,7 +489,7 @@ export function play_in_tab(sound: Sound): Sound { * on top of any Sounds that are currently playing. * * @param sound the Sound to play - * @return the given Sound + * @returns the given Sound * @example play(sine_sound(440, 5)); */ export function play(sound: Sound): Sound { @@ -604,7 +604,7 @@ export function stop(): void { * resulting in an effectively mono sound. * * @param sound the sound to be squashed - * @return a new sound with the left and right channels averaged + * @returns a new sound with the left and right channels averaged */ export function squash(sound: Sound): Sound { const left = get_left_wave(sound); @@ -618,7 +618,7 @@ export function squash(sound: Sound): Sound { * An amount of `-1` is a hard left pan, `0` is balanced, `1` is hard right pan. * * @param amount the pan amount, from -1 to 1 - * @return a Sound Transformer that pans a Sound + * @returns a Sound Transformer that pans a Sound */ export function pan(amount: number): SoundTransformer { return (sound) => { @@ -644,7 +644,7 @@ export function pan(amount: number): SoundTransformer { * `-1` is a hard left pan, `0` is balanced, `1` is hard right pan. * * @param modulator the Sound used to modulate the pan of another sound - * @return a Sound Transformer that pans a Sound + * @returns a Sound Transformer that pans a Sound */ export function pan_mod(modulator: Sound): SoundTransformer { const amount = (t: number) => { @@ -673,7 +673,7 @@ export function pan_mod(modulator: Sound): SoundTransformer { * Makes a noise sound with given duration * * @param duration the duration of the noise sound - * @return resulting noise sound + * @returns resulting noise sound * @example noise_sound(5); */ export function noise_sound(duration: number): Sound { @@ -685,7 +685,7 @@ export function noise_sound(duration: number): Sound { * Makes a silence sound with given duration * * @param duration the duration of the silence sound - * @return resulting silence sound + * @returns resulting silence sound * @example silence_sound(5); */ export function silence_sound(duration: number): Sound { @@ -698,7 +698,7 @@ export function silence_sound(duration: number): Sound { * * @param freq the frequency of the sine wave sound * @param duration the duration of the sine wave sound - * @return resulting sine wave sound + * @returns resulting sine wave sound * @example sine_sound(440, 5); */ export function sine_sound(freq: number, duration: number): Sound { @@ -711,7 +711,7 @@ export function sine_sound(freq: number, duration: number): Sound { * * @param f the frequency of the square wave sound * @param duration the duration of the square wave sound - * @return resulting square wave sound + * @returns resulting square wave sound * @example square_sound(440, 5); */ export function square_sound(f: number, duration: number): Sound { @@ -734,7 +734,7 @@ export function square_sound(f: number, duration: number): Sound { * * @param freq the frequency of the triangle wave sound * @param duration the duration of the triangle wave sound - * @return resulting triangle wave sound + * @returns resulting triangle wave sound * @example triangle_sound(440, 5); */ export function triangle_sound(freq: number, duration: number): Sound { @@ -759,7 +759,7 @@ export function triangle_sound(freq: number, duration: number): Sound { * * @param freq the frequency of the sawtooth wave sound * @param duration the duration of the sawtooth wave sound - * @return resulting sawtooth wave sound + * @returns resulting sawtooth wave sound * @example sawtooth_sound(440, 5); */ export function sawtooth_sound(freq: number, duration: number): Sound { @@ -786,7 +786,7 @@ export function sawtooth_sound(freq: number, duration: number): Sound { * so on. The effect is that the sounds in the list are joined end-to-end * * @param list_of_sounds given list of sounds - * @return the combined Sound + * @returns the combined Sound * @example consecutively(list(sine_sound(200, 2), sine_sound(400, 3))); */ export function consecutively(list_of_sounds: List): Sound { @@ -812,7 +812,7 @@ export function consecutively(list_of_sounds: List): Sound { * and then divided by the length of the list. * * @param list_of_sounds given list of sounds - * @return the combined Sound + * @returns the combined Sound * @example simultaneously(list(sine_sound(200, 2), sine_sound(400, 3))) */ export function simultaneously(list_of_sounds: List): Sound { @@ -853,7 +853,7 @@ export function simultaneously(list_of_sounds: List): Sound { * @param decay_ratio proportion of Sound decay phase * @param sustain_level sustain level between 0 and 1 * @param release_ratio proportion of Sound in release phase - * @return Envelope a function from Sound to Sound + * @returns Envelope a function from Sound to Sound * @example adsr(0.2, 0.3, 0.3, 0.1)(sound); */ export function adsr( @@ -909,7 +909,7 @@ export function adsr( * @param base_frequency frequency of the first harmonic * @param duration duration of the produced Sound, in seconds * @param envelopes – list of envelopes, which are functions from Sound to Sound - * @return Sound resulting Sound + * @returns Sound resulting Sound * @example stacking_adsr(sine_sound, 300, 5, list(adsr(0.1, 0.3, 0.2, 0.5), adsr(0.2, 0.5, 0.6, 0.1), adsr(0.3, 0.1, 0.7, 0.3))); */ export function stacking_adsr( @@ -943,7 +943,7 @@ export function stacking_adsr( * @param freq the frequency of the sine wave to be modulated * @param duration the duration of the output soud * @param amount the amount of modulation to apply to the carrier sine wave - * @return function which takes in a Sound and returns a Sound + * @returns function which takes in a Sound and returns a Sound * @example phase_mod(440, 5, 1)(sine_sound(220, 5)); */ export function phase_mod( @@ -970,7 +970,7 @@ export function phase_mod( * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting bell Sound with given pitch and duration + * @returns Sound resulting bell Sound with given pitch and duration * @example bell(40, 1); */ export function bell(note: number, duration: number): Sound { @@ -992,7 +992,7 @@ export function bell(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting cello Sound with given pitch and duration + * @returns Sound resulting cello Sound with given pitch and duration * @example cello(36, 5); */ export function cello(note: number, duration: number): Sound { @@ -1009,7 +1009,7 @@ export function cello(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting piano Sound with given pitch and duration + * @returns Sound resulting piano Sound with given pitch and duration * @example piano(48, 5); */ export function piano(note: number, duration: number): Sound { @@ -1026,7 +1026,7 @@ export function piano(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting trombone Sound with given pitch and duration + * @returns Sound resulting trombone Sound with given pitch and duration * @example trombone(60, 2); */ export function trombone(note: number, duration: number): Sound { @@ -1043,7 +1043,7 @@ export function trombone(note: number, duration: number): Sound { * a given note for a given duration * @param note MIDI note * @param duration duration in seconds - * @return Sound resulting violin Sound with given pitch and duration + * @returns Sound resulting violin Sound with given pitch and duration * @example violin(53, 4); */ export function violin(note: number, duration: number): Sound { diff --git a/src/bundles/unittest/package.json b/src/bundles/unittest/package.json index e2ab7c4e4a..cd0e741960 100644 --- a/src/bundles/unittest/package.json +++ b/src/bundles/unittest/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "js-slang": "^1.0.81", + "js-slang": "^1.0.85", "lodash": "^4.17.23" }, "devDependencies": { @@ -21,7 +21,7 @@ "test": "buildtools test --project .", "tsc": "buildtools tsc .", "lint": "buildtools lint .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/unity_academy/package.json b/src/bundles/unity_academy/package.json index 8339ae4610..7a398055ee 100644 --- a/src/bundles/unity_academy/package.json +++ b/src/bundles/unity_academy/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "react": "^18.3.1", "react-dom": "^18.3.1" }, @@ -24,7 +24,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/bundles/unity_academy/src/functions.ts b/src/bundles/unity_academy/src/functions.ts index 728f5e54ce..531cd7a5fb 100644 --- a/src/bundles/unity_academy/src/functions.ts +++ b/src/bundles/unity_academy/src/functions.ts @@ -88,7 +88,7 @@ function checkParameterType(parameter: any, expectedType: string, numberAllowInf * * @param first The first GameObject identifier to compare with. * @param second The second GameObject identifier to compare with. - * @return Returns true if the two GameObject identifiers refers to the same GameObject and false otherwise. + * @returns Returns true if the two GameObject identifiers refers to the same GameObject and false otherwise. * @category Common */ export function same_gameobject(first: GameObjectIdentifier, second: GameObjectIdentifier): boolean { @@ -143,7 +143,7 @@ export function set_update(gameObjectIdentifier: GameObjectIdentifier, updateFun * Available Prefab Information: Click Here * * @param prefab_name The prefab name - * @return the identifier of the newly created GameObject + * @returns the identifier of the newly created GameObject * * @category Common * @category Outside Lifecycle @@ -166,7 +166,7 @@ export function instantiate(prefab_name: string): GameObjectIdentifier { * **2D mode only** * * @param sourceImageUrl The image url for the sprite. - * @return the identifier of the newly created GameObject + * @returns the identifier of the newly created GameObject * * @category Common * @category Outside Lifecycle @@ -186,7 +186,7 @@ export function instantiate_sprite(sourceImageUrl: string) { * * You may use the empty GameObject to run some general game management code or use the position of the empty GameObject to represent a point in the scene that the rest of your codes can access and utilize. * - * @return the identifier of the newly created GameObject + * @returns the identifier of the newly created GameObject * * @category Common * @category Outside Lifecycle @@ -212,7 +212,7 @@ export function instantiate_empty(): GameObjectIdentifier { * By assigning the above code to a GameObject with `set_update`, that GameObject will move in a constant speed for about 3 units per second along world +Z axis. * * For more information, see https://docs.unity3d.com/ScriptReference/Time-deltaTime.html - * @return the delta time value in decimal + * @returns the delta time value in decimal * * @category Common */ @@ -242,7 +242,7 @@ export function destroy(gameObjectIdentifier: GameObjectIdentifier): void { /** * Returns the world position of a given GameObject * @param gameObjectIdentifier The identifier for the GameObject that you want to get position for. - * @return The position represented in a Vector3. + * @returns The position represented in a Vector3. * * @category Transform */ @@ -271,7 +271,7 @@ export function set_position(gameObjectIdentifier: GameObjectIdentifier, positio /** * Returns the world Euler angle rotation of a given GameObject * @param gameObjectIdentifier The identifier for the GameObject that you want to get rotation for. - * @return The Euler angle rotation represented in a Vector3. + * @returns The Euler angle rotation represented in a Vector3. * * @category Transform */ @@ -302,7 +302,7 @@ export function set_rotation_euler(gameObjectIdentifier: GameObjectIdentifier, r * * By default the scale of a GameObject is (1, 1, 1) * @param gameObjectIdentifier The identifier for the GameObject that you want to get scale for. - * @return The scale represented in a Vector3. + * @returns The scale represented in a Vector3. * * @category Transform */ @@ -468,7 +468,7 @@ export function look_at(gameObjectIdentifier: GameObjectIdentifier, position: Ve * @param gameObjectIdentifier_B The identifier for the second GameObject * * - * @return The value of the distance between these two GameObjects + * @returns The value of the distance between these two GameObjects * @category Transform */ export function gameobject_distance(gameObjectIdentifier_A: GameObjectIdentifier, gameObjectIdentifier_B: GameObjectIdentifier): number { @@ -495,7 +495,7 @@ function checkKeyCodeValidityAndToLowerCase(keyCode: string): string { * When user presses a key on the keyboard or mouse button, this function will return true only at the frame when the key is just pressed down and return false afterwards. * * For more information, see https://docs.unity3d.com/ScriptReference/Input.GetKeyDown.html - * @return A boolean value equivalent to Input.GetKeyDown(keyCode) in Unity. + * @returns A boolean value equivalent to Input.GetKeyDown(keyCode) in Unity. * * @param keyCode The key to detact input for. * @category Input @@ -511,7 +511,7 @@ export function get_key_down(keyCode: string): boolean { * When user presses a key on the keyboard or mouse button, this function will return true in every frame that the key is still being pressed and false otherwise. * * For more information, see https://docs.unity3d.com/ScriptReference/Input.GetKey.html - * @return A boolean value equivalent to Input.GetKey(keyCode) in Unity. + * @returns A boolean value equivalent to Input.GetKey(keyCode) in Unity. * * @param keyCode The key to detact input for. * @category Input @@ -528,7 +528,7 @@ export function get_key(keyCode: string): boolean { * When user releases a pressed key on the keyboard or mouse button, this function will return true only at the frame when the key is just released up and return false otherwise. * * For more information, see https://docs.unity3d.com/ScriptReference/Input.GetKeyUp.html - * @return A boolean value equivalent to Input.GetKeyUp(keyCode) in Unity. + * @returns A boolean value equivalent to Input.GetKeyUp(keyCode) in Unity. * * @param keyCode The key to detact input for. * @category Input @@ -585,7 +585,7 @@ export function apply_rigidbody(gameObjectIdentifier: GameObjectIdentifier): voi * Usage of all physics functions under the Physics - Rigidbody category requires calling `apply_rigidbody` first on the applied game objects. * * @param gameObjectIdentifier The identifier for the GameObject that you want to get mass for. - * @return The mass of the rigidbody attached on the GameObject + * @returns The mass of the rigidbody attached on the GameObject * @category Physics - Rigidbody */ export function get_mass(gameObjectIdentifier: GameObjectIdentifier): number { @@ -618,7 +618,7 @@ export function set_mass(gameObjectIdentifier: GameObjectIdentifier, mass: numbe * Usage of all physics functions under the Physics - Rigidbody category requires calling `apply_rigidbody` first on the applied game objects. * * @param gameObjectIdentifier The identifier for the GameObject that you want to get velocity for. - * @return the velocity at this moment represented in a Vector3. + * @returns the velocity at this moment represented in a Vector3. * @category Physics - Rigidbody */ export function get_velocity(gameObjectIdentifier: GameObjectIdentifier): Vector3 { @@ -653,7 +653,7 @@ export function set_velocity(gameObjectIdentifier: GameObjectIdentifier, velocit * **2D Mode Special: **In 2D mode there is no angular velocity on X nor Y axis, so in the X and Y values in the returned Vector3 will always be zero. * * @param gameObjectIdentifier The identifier for the GameObject that you want to get angular velocity for. - * @return the angular velocity at this moment represented in a Vector3. + * @returns the angular velocity at this moment represented in a Vector3. * @category Physics - Rigidbody */ export function get_angular_velocity(gameObjectIdentifier: GameObjectIdentifier): Vector3 { @@ -938,7 +938,7 @@ export function gui_button(text: string, x: number, y: number, width: number, he * * **If default main camera controllers are disabled (you have called `request_for_main_camera_control`), then the following target GameObject is useless.** * - * @return The GameObject idenfitier for the main camera following target GameObject. + * @returns The GameObject idenfitier for the main camera following target GameObject. * @category Camera * @category Outside Lifecycle */ @@ -955,7 +955,7 @@ export function get_main_camera_following_target(): GameObjectIdentifier { * * This function is for totally customizing the position and rotation of the main camera. If you'd like to simplify the camera controlling with the help of the default camera controllers in Unity Academy, please consider use `get_main_camera_following_target` function. * - * @return The GameObject identifier that can directly be used to control the main camera's position and rotation + * @returns The GameObject identifier that can directly be used to control the main camera's position and rotation * @category Camera * @category Outside Lifecycle */ @@ -988,7 +988,7 @@ export function set_custom_prop(gameObjectIdentifier: GameObjectIdentifier, prop * @param gameObjectIdentifier The identifier for the GameObject that you want to get the custom property on. * @param propName The name (a string) of the custom property * - * @return The value of the custom property with the given name on the given GameObject. If the property value is not set, this function will return `undefined`. + * @returns The value of the custom property with the given name on the given GameObject. If the property value is not set, this function will return `undefined`. * * @category Common */ @@ -1006,7 +1006,7 @@ export function get_custom_prop(gameObjectIdentifier: GameObjectIdentifier, prop * @param y The y component of the new vector * @param z The z component of the new vector * - * @return The 3D vector (x, y, z) + * @returns The 3D vector (x, y, z) * * @category Maths */ @@ -1021,7 +1021,7 @@ export function vector3(x: number, y: number, z: number): Vector3 { * Get the X component of a 3D vector * @param vector The 3D vector * - * @return The X component of the given vector + * @returns The X component of the given vector * * @category Maths */ @@ -1034,7 +1034,7 @@ export function get_x(vector: Vector3): number { * Get the Y component of a 3D vector * @param vector The 3D vector * - * @return The Y component of the given vector + * @returns The Y component of the given vector * * @category Maths */ @@ -1047,7 +1047,7 @@ export function get_y(vector: Vector3): number { * Get the Z component of a 3D vector * @param vector The 3D vector * - * @return The Z component of the given vector + * @returns The Z component of the given vector * * @category Maths */ @@ -1060,7 +1060,7 @@ export function get_z(vector: Vector3): number { * Scales a 3D vector with the given factor. * @param vector The original vector * @param factor The scaling factor. - * @return The scaled vector + * @returns The scaled vector * * @category Maths */ @@ -1074,7 +1074,7 @@ export function scale_vector(vector: Vector3, factor: number): Vector3 { * Add two 3D vectors together. * @param vectorA The first vector * @param vectorB The second vector. - * @return The sum of the two vectors + * @returns The sum of the two vectors * * @category Maths */ @@ -1088,7 +1088,7 @@ export function add_vectors(vectorA: Vector3, vectorB: Vector3): Vector3 { * Calcuate the vector difference between two vectors (vectorA - vectorB). * @param vectorA The minuend vector. * @param vectorB The subtrahend vector. - * @return The result for vectorA - vectorB + * @returns The result for vectorA - vectorB * * @category Maths */ @@ -1102,7 +1102,7 @@ export function vector_difference(vectorA: Vector3, vectorB: Vector3): Vector3 { * Calcuate the dot product of two 3D vectors. * @param vectorA The first vector * @param vectorB The second vector. - * @return The dot product + * @returns The dot product * * @category Maths */ @@ -1116,7 +1116,7 @@ export function dot(vectorA: Vector3, vectorB: Vector3): number { * Calcuate the cross product of two 3D vectors. * @param vectorA The first vector * @param vectorB The second vector. - * @return The cross product + * @returns The cross product * * @category Maths */ @@ -1129,7 +1129,7 @@ export function cross(vectorA: Vector3, vectorB: Vector3): Vector3 { /** * Normalize a vector. The returned vector will have the same direction as the original vector but have a magnitude of 1. * @param vector The original vector - * @return The normalized vector. This function will return a zero vector if the original vector is a zero vector. + * @returns The normalized vector. This function will return a zero vector if the original vector is a zero vector. * * @category Maths */ @@ -1141,7 +1141,7 @@ export function normalize(vector: Vector3): Vector3 { /** * Calcuate the magnitude of a vector * @param vector The vector - * @return The magnitude of the vector + * @returns The magnitude of the vector * * @category Maths */ @@ -1152,7 +1152,7 @@ export function magnitude(vector: Vector3): number { /** * Get the zero vector - * @return The zero vector + * @returns The zero vector * * @category Maths */ @@ -1166,7 +1166,7 @@ export function zero_vector(): Vector3 { * @param pointA The first point * @param pointB The second point * - * @return The value of the distance between the two points + * @returns The value of the distance between the two points * * @category Maths */ @@ -1226,7 +1226,7 @@ export function load_audio_clip_wav(audioUrl: string): AudioClipIdentifier { * So you can still use the audio source as a regular GameObject, like setting its position with `set_position`, using `set_start` and `set_update` to set its `Start` and `Update` funtions, etc. * * @param audioClip the audio clip that you want to use for this audio source - * @return the identifier of the newly created GameObject + * @returns the identifier of the newly created GameObject * * @category Sound / Audio * @category Outside Lifecycle diff --git a/src/bundles/wasm/package.json b/src/bundles/wasm/package.json index d6d9962782..9410572f1f 100644 --- a/src/bundles/wasm/package.json +++ b/src/bundles/wasm/package.json @@ -20,7 +20,7 @@ "build": "buildtools build bundle .", "lint": "buildtools lint .", "test": "buildtools test --project .", - "postinstall": "yarn tsc", + "postinstall": "buildtools compile", "serve": "yarn buildtools serve" }, "scripts-info": { diff --git a/src/tabs/ArcadeTwod/package.json b/src/tabs/ArcadeTwod/package.json index 1d81c11203..2a2e7431c6 100644 --- a/src/tabs/ArcadeTwod/package.json +++ b/src/tabs/ArcadeTwod/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/modules-lib": "workspace:^", "phaser": "^3.54.0", "react": "^18.3.1", diff --git a/src/tabs/AugmentedReality/package.json b/src/tabs/AugmentedReality/package.json index d04773caf9..c475435f84 100644 --- a/src/tabs/AugmentedReality/package.json +++ b/src/tabs/AugmentedReality/package.json @@ -3,7 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-ar": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", diff --git a/src/tabs/CopyGc/package.json b/src/tabs/CopyGc/package.json index 4ab70be0e6..c592e14636 100644 --- a/src/tabs/CopyGc/package.json +++ b/src/tabs/CopyGc/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", "@sourceacademy/bundle-copy_gc": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", diff --git a/src/tabs/Csg/package.json b/src/tabs/Csg/package.json index e52e6e1f24..ca9a861b0f 100644 --- a/src/tabs/Csg/package.json +++ b/src/tabs/Csg/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-csg": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", diff --git a/src/tabs/Curve/package.json b/src/tabs/Curve/package.json index 1d7519582f..02a4e7ae23 100644 --- a/src/tabs/Curve/package.json +++ b/src/tabs/Curve/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-curve": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", @@ -14,11 +14,11 @@ "@sourceacademy/modules-buildtools": "workspace:^", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.1", - "@vitest/browser-playwright": "^4.0.4", - "@vitest/coverage-v8": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", + "@vitest/coverage-v8": "^4.0.18", "playwright": "^1.55.1", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "scripts": { "build": "buildtools build tab .", diff --git a/src/tabs/MarkSweep/package.json b/src/tabs/MarkSweep/package.json index 7b5b84ccee..4d63181a33 100644 --- a/src/tabs/MarkSweep/package.json +++ b/src/tabs/MarkSweep/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", "react-dom": "^18.3.1" diff --git a/src/tabs/Nbody/package.json b/src/tabs/Nbody/package.json index c4b39b3cbf..7e6af37b99 100644 --- a/src/tabs/Nbody/package.json +++ b/src/tabs/Nbody/package.json @@ -3,6 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/modules-lib": "workspace:^", "nbody": "^0.2.0", "plotly.js-dist": "^2.17.1", diff --git a/src/tabs/Physics2D/package.json b/src/tabs/Physics2D/package.json index 8c49b410da..c861933ba0 100644 --- a/src/tabs/Physics2D/package.json +++ b/src/tabs/Physics2D/package.json @@ -3,6 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@box2d/debug-draw": "^0.10.0", "@sourceacademy/bundle-physics_2d": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", diff --git a/src/tabs/Pixnflix/package.json b/src/tabs/Pixnflix/package.json index dadec2347c..906ff205cd 100644 --- a/src/tabs/Pixnflix/package.json +++ b/src/tabs/Pixnflix/package.json @@ -3,6 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-pix_n_flix": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", diff --git a/src/tabs/Repl/package.json b/src/tabs/Repl/package.json index 16752edb73..d34b584313 100644 --- a/src/tabs/Repl/package.json +++ b/src/tabs/Repl/package.json @@ -3,6 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-repl": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "ace-builds": "^1.25.1", diff --git a/src/tabs/RobotSimulation/package.json b/src/tabs/RobotSimulation/package.json index d1e4f7a1f0..9ee29e9006 100644 --- a/src/tabs/RobotSimulation/package.json +++ b/src/tabs/RobotSimulation/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", "@dimforge/rapier3d-compat": "^0.11.2", "@sourceacademy/bundle-robot_simulation": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", diff --git a/src/tabs/Rune/package.json b/src/tabs/Rune/package.json index 2879aa9ee1..cc8b731107 100644 --- a/src/tabs/Rune/package.json +++ b/src/tabs/Rune/package.json @@ -5,16 +5,17 @@ "dependencies": { "@sourceacademy/bundle-rune": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", + "lodash": "^4.17.23", "react": "^18.3.1", "react-dom": "^18.3.1" }, "devDependencies": { "@sourceacademy/modules-buildtools": "workspace:^", "@types/react": "^18.3.1", - "@vitest/browser-playwright": "^4.0.4", + "@vitest/browser-playwright": "^4.0.18", "playwright": "^1.55.1", - "vitest": "^4.0.4", - "vitest-browser-react": "^2.0.2" + "vitest": "^4.0.18", + "vitest-browser-react": "^2.0.4" }, "scripts": { "build": "buildtools build tab .", diff --git a/src/tabs/SoundMatrix/package.json b/src/tabs/SoundMatrix/package.json index 36a20a9e56..fd57f5a0f5 100644 --- a/src/tabs/SoundMatrix/package.json +++ b/src/tabs/SoundMatrix/package.json @@ -3,6 +3,7 @@ "version": "1.0.0", "private": true, "dependencies": { + "@blueprintjs/core": "^6.0.0", "@sourceacademy/modules-lib": "workspace:^", "classnames": "^2.3.1", "react": "^18.3.1", diff --git a/src/tabs/UnityAcademy/package.json b/src/tabs/UnityAcademy/package.json index 2ef97c5584..324bcf521f 100644 --- a/src/tabs/UnityAcademy/package.json +++ b/src/tabs/UnityAcademy/package.json @@ -3,8 +3,8 @@ "version": "1.0.0", "private": true, "dependencies": { - "@blueprintjs/core": "^5.10.2", - "@blueprintjs/icons": "^5.9.0", + "@blueprintjs/core": "^6.0.0", + "@blueprintjs/icons": "^6.0.0", "@sourceacademy/bundle-unity_academy": "workspace:^", "@sourceacademy/modules-lib": "workspace:^", "react": "^18.3.1", diff --git a/yarn.config.cjs b/yarn.config.cjs index b5936a27da..0053916286 100644 --- a/yarn.config.cjs +++ b/yarn.config.cjs @@ -32,8 +32,6 @@ module.exports = defineConfig({ rootWorkspace.set('resolutions.js-slang', undefined); for (const workspaceDep of Yarn.dependencies({ workspace: rootWorkspace })) { - if (workspaceDep.type === 'peerDependencies') continue; - for (const otherDep of Yarn.dependencies({ ident: workspaceDep.ident })) { if (otherDep.type === 'peerDependencies') continue; diff --git a/yarn.lock b/yarn.lock index c6af3f4466..6660f5f9d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1165,58 +1165,57 @@ __metadata: languageName: node linkType: hard -"@blueprintjs/colors@npm:^5.1.8": - version: 5.1.8 - resolution: "@blueprintjs/colors@npm:5.1.8" +"@blueprintjs/colors@npm:^5.1.12": + version: 5.1.12 + resolution: "@blueprintjs/colors@npm:5.1.12" dependencies: tslib: "npm:~2.6.2" - checksum: 10c0/d0a3d500628f60415f830df872244370efb0268f43b03a5c7c27d473ea1be5b8c9fb35fbc47330d7c022f3ddecd7afefb6ee4ef94789fe98feb2be95b15753ac + checksum: 10c0/749a59646082c5605f12b095595e9662587dafcb2fdb253ba57131faa9ce829630bd1cb1709a53ef430ba5fc1159b375523a5a578c9f8ff644d7a0a2e5911a55 languageName: node linkType: hard -"@blueprintjs/core@npm:^5.10.2": - version: 5.19.1 - resolution: "@blueprintjs/core@npm:5.19.1" +"@blueprintjs/core@npm:^6.0.0": + version: 6.6.1 + resolution: "@blueprintjs/core@npm:6.6.1" dependencies: - "@blueprintjs/colors": "npm:^5.1.8" - "@blueprintjs/icons": "npm:^5.23.0" + "@blueprintjs/colors": "npm:^5.1.12" + "@blueprintjs/icons": "npm:^6.5.0" "@popperjs/core": "npm:^2.11.8" classnames: "npm:^2.3.1" normalize.css: "npm:^8.0.1" react-popper: "npm:^2.3.0" react-transition-group: "npm:^4.4.5" - react-uid: "npm:^2.3.3" tslib: "npm:~2.6.2" use-sync-external-store: "npm:^1.2.0" peerDependencies: - "@types/react": ^16.14.41 || 17 || 18 - react: ^16.8 || 17 || 18 - react-dom: ^16.8 || 17 || 18 + "@types/react": 18 + react: 18 + react-dom: 18 peerDependenciesMeta: "@types/react": optional: true bin: upgrade-blueprint-2.0.0-rename: scripts/upgrade-blueprint-2.0.0-rename.sh upgrade-blueprint-3.0.0-rename: scripts/upgrade-blueprint-3.0.0-rename.sh - checksum: 10c0/0805c88b3da989fa242c5acf4dda0bfaf20e937f61e8c3b8e9189f34d5e4b6bde90bf7e55eefb07c18716fed77df9b76bc6197c2e53e2e662d4b82569015253c + checksum: 10c0/a9f90ee376a3a1d16314160f853460d8b279514437deeb907844bebe9749d47a2cb3bcf1f5ff82df4c2f87f7b7ca4fb2e136d3ec8706c650e15cd39dd399c1c1 languageName: node linkType: hard -"@blueprintjs/icons@npm:^5.23.0, @blueprintjs/icons@npm:^5.9.0": - version: 5.23.0 - resolution: "@blueprintjs/icons@npm:5.23.0" +"@blueprintjs/icons@npm:^6.0.0, @blueprintjs/icons@npm:^6.5.0": + version: 6.5.0 + resolution: "@blueprintjs/icons@npm:6.5.0" dependencies: change-case: "npm:^4.1.2" classnames: "npm:^2.3.1" tslib: "npm:~2.6.2" peerDependencies: - "@types/react": ^16.14.41 || 17 || 18 - react: ^16.8 || 17 || 18 - react-dom: ^16.8 || 17 || 18 + "@types/react": 18 + react: 18 + react-dom: 18 peerDependenciesMeta: "@types/react": optional: true - checksum: 10c0/9af904e3b5c2c5e9ac7c9b12e1612184805f60d560a554df8917dafd715bed1cf1586ce31d64c59c2a7c84f595b8999c770036b9ff7f9c9f480ac1b82ccfae70 + checksum: 10c0/ce911dec2d0d91e4ce1eccfd72d242c9484007f4399954f7783aad4c467ebed6ba3e97ce0c2ecce6e9432cdfb99c706ee59bd18acfc224b37792cdd3b724054f languageName: node linkType: hard @@ -1340,40 +1339,40 @@ __metadata: languageName: node linkType: hard -"@cspell/cspell-bundled-dicts@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-bundled-dicts@npm:9.6.0" +"@cspell/cspell-bundled-dicts@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-bundled-dicts@npm:9.3.1" dependencies: "@cspell/dict-ada": "npm:^4.1.1" "@cspell/dict-al": "npm:^1.1.1" - "@cspell/dict-aws": "npm:^4.0.17" + "@cspell/dict-aws": "npm:^4.0.15" "@cspell/dict-bash": "npm:^4.2.2" - "@cspell/dict-companies": "npm:^3.2.10" - "@cspell/dict-cpp": "npm:^7.0.2" + "@cspell/dict-companies": "npm:^3.2.7" + "@cspell/dict-cpp": "npm:^6.0.14" "@cspell/dict-cryptocurrencies": "npm:^5.0.5" - "@cspell/dict-csharp": "npm:^4.0.8" - "@cspell/dict-css": "npm:^4.0.19" - "@cspell/dict-dart": "npm:^2.3.2" - "@cspell/dict-data-science": "npm:^2.0.13" - "@cspell/dict-django": "npm:^4.1.6" - "@cspell/dict-docker": "npm:^1.1.17" - "@cspell/dict-dotnet": "npm:^5.0.11" + "@cspell/dict-csharp": "npm:^4.0.7" + "@cspell/dict-css": "npm:^4.0.18" + "@cspell/dict-dart": "npm:^2.3.1" + "@cspell/dict-data-science": "npm:^2.0.11" + "@cspell/dict-django": "npm:^4.1.5" + "@cspell/dict-docker": "npm:^1.1.16" + "@cspell/dict-dotnet": "npm:^5.0.10" "@cspell/dict-elixir": "npm:^4.0.8" - "@cspell/dict-en-common-misspellings": "npm:^2.1.11" - "@cspell/dict-en-gb-mit": "npm:^3.1.16" - "@cspell/dict-en_us": "npm:^4.4.27" - "@cspell/dict-filetypes": "npm:^3.0.15" + "@cspell/dict-en-common-misspellings": "npm:^2.1.8" + "@cspell/dict-en-gb-mit": "npm:^3.1.14" + "@cspell/dict-en_us": "npm:^4.4.24" + "@cspell/dict-filetypes": "npm:^3.0.14" "@cspell/dict-flutter": "npm:^1.1.1" "@cspell/dict-fonts": "npm:^4.0.5" "@cspell/dict-fsharp": "npm:^1.1.1" "@cspell/dict-fullstack": "npm:^3.2.7" "@cspell/dict-gaming-terms": "npm:^1.1.2" "@cspell/dict-git": "npm:^3.0.7" - "@cspell/dict-golang": "npm:^6.0.26" + "@cspell/dict-golang": "npm:^6.0.24" "@cspell/dict-google": "npm:^1.0.9" "@cspell/dict-haskell": "npm:^4.0.6" - "@cspell/dict-html": "npm:^4.0.14" - "@cspell/dict-html-symbol-entities": "npm:^4.0.5" + "@cspell/dict-html": "npm:^4.0.12" + "@cspell/dict-html-symbol-entities": "npm:^4.0.4" "@cspell/dict-java": "npm:^5.0.12" "@cspell/dict-julia": "npm:^1.1.1" "@cspell/dict-k8s": "npm:^1.0.12" @@ -1382,67 +1381,66 @@ __metadata: "@cspell/dict-lorem-ipsum": "npm:^4.0.5" "@cspell/dict-lua": "npm:^4.0.8" "@cspell/dict-makefile": "npm:^1.0.5" - "@cspell/dict-markdown": "npm:^2.0.14" - "@cspell/dict-monkeyc": "npm:^1.0.12" + "@cspell/dict-markdown": "npm:^2.0.12" + "@cspell/dict-monkeyc": "npm:^1.0.11" "@cspell/dict-node": "npm:^5.0.8" - "@cspell/dict-npm": "npm:^5.2.29" - "@cspell/dict-php": "npm:^4.1.1" + "@cspell/dict-npm": "npm:^5.2.20" + "@cspell/dict-php": "npm:^4.1.0" "@cspell/dict-powershell": "npm:^5.0.15" "@cspell/dict-public-licenses": "npm:^2.0.15" - "@cspell/dict-python": "npm:^4.2.25" + "@cspell/dict-python": "npm:^4.2.21" "@cspell/dict-r": "npm:^2.1.1" - "@cspell/dict-ruby": "npm:^5.1.0" - "@cspell/dict-rust": "npm:^4.1.1" - "@cspell/dict-scala": "npm:^5.0.9" + "@cspell/dict-ruby": "npm:^5.0.9" + "@cspell/dict-rust": "npm:^4.0.12" + "@cspell/dict-scala": "npm:^5.0.8" "@cspell/dict-shell": "npm:^1.1.2" - "@cspell/dict-software-terms": "npm:^5.1.20" + "@cspell/dict-software-terms": "npm:^5.1.11" "@cspell/dict-sql": "npm:^2.2.1" "@cspell/dict-svelte": "npm:^1.0.7" "@cspell/dict-swift": "npm:^2.0.6" "@cspell/dict-terraform": "npm:^1.1.3" "@cspell/dict-typescript": "npm:^3.2.3" "@cspell/dict-vue": "npm:^3.0.5" - "@cspell/dict-zig": "npm:^1.0.0" - checksum: 10c0/baa9a33b55a42cb72c3b2c0796cd7b25f4625d49e09909bc8482729286f063a9a6c4c016d94da7cbf0a3776b2b8b12165f5caf8a428f1fc8996000a458ed30af + checksum: 10c0/b0908ee774aebe01f50d7b187df53d27d45a40f69d5a50026d7387e45ca63966bc1eb3f61ecb23ba598fbc349027e613084017abdb8d27714c24e73a2c1b93e5 languageName: node linkType: hard -"@cspell/cspell-json-reporter@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-json-reporter@npm:9.6.0" +"@cspell/cspell-json-reporter@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-json-reporter@npm:9.3.1" dependencies: - "@cspell/cspell-types": "npm:9.6.0" - checksum: 10c0/f5ac8b1984065bd981702f6e8f14b91df2b6413a2e132524b02160b390a59fdf2193f0e1a1208e7af4b921cd65aa03a152de67e9329fcf58218b6d2dff828348 + "@cspell/cspell-types": "npm:9.3.1" + checksum: 10c0/e04ff6749865b985e34b1ec3b893d7098fcc5a6e4a765da722114552fda70188d4ec9ff2aa587cc765eaf190f3d0e88f2d79cc1ea81fa4a5b6d662e1a17b7b12 languageName: node linkType: hard -"@cspell/cspell-pipe@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-pipe@npm:9.6.0" - checksum: 10c0/0d182ed2e182f4f84a92c59334a8e2d44a1d45d1faae608daeb39c4554e6c6a5f6db92d0d7445cad6aa1848e19e1b9f0416b1f65993628cdb59cf88da03a6ef0 +"@cspell/cspell-pipe@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-pipe@npm:9.3.1" + checksum: 10c0/ebdc05b8ee7505c7ec4ad05269f769a80100807d137e45bfe332a384a4c3a82f2834e7a3cac31a4be68ff6cd6ecb78e930e30e54b7d485bb6bef39a3ca42de3d languageName: node linkType: hard -"@cspell/cspell-resolver@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-resolver@npm:9.6.0" +"@cspell/cspell-resolver@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-resolver@npm:9.3.1" dependencies: global-directory: "npm:^4.0.1" - checksum: 10c0/04f3e4e135235b7b57f053e9330eac57f3b9dbf7a16fcebf7eb0817d1e0f692c71a935013e16aa57cd31d87c52b4bb796e788dc53b72d63d9c87f3a4fe56c3c2 + checksum: 10c0/c154516ef6c209d0cbd8ee9c492088a5f06bfbe60e085df0d3e83ed2a5f898a498e721ece4b1743ef1bb6c51593dfebc57868d53d320a80bf850e7bc6ede91ab languageName: node linkType: hard -"@cspell/cspell-service-bus@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-service-bus@npm:9.6.0" - checksum: 10c0/45e50de655e71d395edc1a9afeeb50209670be03ae92353c54d3e050870c7b0028062dd53e09351980b687f930b9c8158d8c55ce042f3b15850ebfbe4029afa6 +"@cspell/cspell-service-bus@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-service-bus@npm:9.3.1" + checksum: 10c0/142695d3d8d550ff93e7881a4b0ba58df4219a4106d5865a8f363151d030f7eb6e7a1f8ef1c867656479c3ed6c661bdf6d447494bb178a0c3f1beed6ba968767 languageName: node linkType: hard -"@cspell/cspell-types@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/cspell-types@npm:9.6.0" - checksum: 10c0/68e5cf841d15ab45eef4049cfc64adec0eb9f0ff4aca31d26cc94b202266f65432bd667ede1cffa2e4e66e020f97aa5087576fdba4a27a125552f0db57a3666e +"@cspell/cspell-types@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-types@npm:9.3.1" + checksum: 10c0/c1815480ab85d902cf722220e1b6b5f53dad61b861ca9a15c1141a0652edd38771857fd83f89b4174d64930acaaef50ab8135304d88823c935ea2093e02a3587 languageName: node linkType: hard @@ -1460,10 +1458,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-aws@npm:^4.0.17": - version: 4.0.17 - resolution: "@cspell/dict-aws@npm:4.0.17" - checksum: 10c0/d421a78aee8cc3db78a0bdffad2ceda9ca8e476498398809f2975bae9f03233df1112e713f2d699239600a9019d5e8f11ca60dfcb49fdce56815d5e794285c7b +"@cspell/dict-aws@npm:^4.0.15": + version: 4.0.15 + resolution: "@cspell/dict-aws@npm:4.0.15" + checksum: 10c0/c5983f2e5ce3dd23d5b8ebc818cc963d9b2c91d9b8436b40491a46ebca4cb1bc7875237c443f6e883488ca66174e84bb804f8b6e37439b4ba6c2b52a146eaa20 languageName: node linkType: hard @@ -1476,17 +1474,17 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-companies@npm:^3.2.10": - version: 3.2.10 - resolution: "@cspell/dict-companies@npm:3.2.10" - checksum: 10c0/56ffda78e90a417fb470d3296d17fa74c2b86f1f73de121b12ca9510f81663eea7c20923fe4409c9159eb20b9b36ff4cf4b6cbb1b4fab48da404ebe1ee855f7b +"@cspell/dict-companies@npm:^3.2.7": + version: 3.2.7 + resolution: "@cspell/dict-companies@npm:3.2.7" + checksum: 10c0/ba2e73974560dc61742c05c00ef75719a31f24e05ad7cfe01ed8eb4a614f8f0a4bb3a0b6cfd9bec6d02e746c490d5de4a3310cfc176461bb4d6de0751c868515 languageName: node linkType: hard -"@cspell/dict-cpp@npm:^7.0.2": - version: 7.0.2 - resolution: "@cspell/dict-cpp@npm:7.0.2" - checksum: 10c0/a2926a6e896f04aa795edcd5fe3ac72cf1e05b97719946388cf31cf91737cfee816ffdd220e1960af60d7049daa37262787e76534afa5479fe10691af096b54c +"@cspell/dict-cpp@npm:^6.0.14": + version: 6.0.14 + resolution: "@cspell/dict-cpp@npm:6.0.14" + checksum: 10c0/d109ced99c9b673c57145bbcb4c20a471aac267edd9c418fefb49c78675f3c8e24a2d99834525055e80d2825ee932966edebd2e6641824261837a02e650f8bed languageName: node linkType: hard @@ -1497,52 +1495,52 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-csharp@npm:^4.0.8": - version: 4.0.8 - resolution: "@cspell/dict-csharp@npm:4.0.8" - checksum: 10c0/b55dbe323b973e0e98d76a17205b103fbb52dec01d45d55aa06a14f1acc6c8bec259f7923bbe6138d1af2b11463969d920214ce0fc6e89eaf6fa08f86b10184e +"@cspell/dict-csharp@npm:^4.0.7": + version: 4.0.7 + resolution: "@cspell/dict-csharp@npm:4.0.7" + checksum: 10c0/93afd6cfc973a5543120d1de2ee9cafbcbe64af6743e2ba3a8cfb0965fe19c85c6dee5a32c99a156cc979c8a89803b684e324ca92065b3a32faa7db786072e5e languageName: node linkType: hard -"@cspell/dict-css@npm:^4.0.19": - version: 4.0.19 - resolution: "@cspell/dict-css@npm:4.0.19" - checksum: 10c0/e0ba38ec536ce8a9b88a4afb197b9467622bd6519a84e71435e9f0d8d90d12d94f6e83d5e504337a95f6ce99ee398c920c6367c6252c6c01c794cba61b621bde +"@cspell/dict-css@npm:^4.0.18": + version: 4.0.18 + resolution: "@cspell/dict-css@npm:4.0.18" + checksum: 10c0/6d27fab2c1d2b023bdca93c2b013f69b2e782e2df444fed9406a0f9c1f2c84e6da5bfa9b7ae4c4e235498bbfd06a8822a6d6b228b5d3444fda8499d7a81dddfe languageName: node linkType: hard -"@cspell/dict-dart@npm:^2.3.2": - version: 2.3.2 - resolution: "@cspell/dict-dart@npm:2.3.2" - checksum: 10c0/1c0842ff09785aaf2bc2e68f4c05ec5e20331f3fce1503ef5a87305feb223f6e23404c68e4991bb90c6473825a7f8cd65b3ed86eef0d8032d43b13558ddb1753 +"@cspell/dict-dart@npm:^2.3.1": + version: 2.3.1 + resolution: "@cspell/dict-dart@npm:2.3.1" + checksum: 10c0/40bbb2e20b761da0be513d3476db054211bfa5a514860569c0d46f3b869b782ef8d8118b4a30aa10b51dde280d22d5199988c9a89d2495742e660de8b5bb6792 languageName: node linkType: hard -"@cspell/dict-data-science@npm:^2.0.13": - version: 2.0.13 - resolution: "@cspell/dict-data-science@npm:2.0.13" - checksum: 10c0/63d8291ef0e62defbf4b98e58bd1039747efdb6348fa64c128a01a0b28b93ce1724e878e945b1ca7d8f568a49446a46ed65ef71531130c7b1b1fddb5328a1a0e +"@cspell/dict-data-science@npm:^2.0.11": + version: 2.0.11 + resolution: "@cspell/dict-data-science@npm:2.0.11" + checksum: 10c0/b273db0ce3306355ff75963610810055c517d2aa45ebd12a45b64e8b11de548e53ff980be7e7496c4f9b438a9737142399ff528c8cf1ffc22798fcc4f3fff42c languageName: node linkType: hard -"@cspell/dict-django@npm:^4.1.6": - version: 4.1.6 - resolution: "@cspell/dict-django@npm:4.1.6" - checksum: 10c0/76f71cba5a692df48554a3cd7cff7e27df85ab826e2cddf0594c21062e5c96de3090508314659a9ec708913a4afd61afb0f044ae8c41a1ec573583d516056f2d +"@cspell/dict-django@npm:^4.1.5": + version: 4.1.5 + resolution: "@cspell/dict-django@npm:4.1.5" + checksum: 10c0/df51162b33c31ead2a983dc26face4b2d563382b082cbf13971593cec3687552d4e4e4af444beecb3b00baf1c28b5cb92944dba04de303d0864f7656a11b8921 languageName: node linkType: hard -"@cspell/dict-docker@npm:^1.1.17": - version: 1.1.17 - resolution: "@cspell/dict-docker@npm:1.1.17" - checksum: 10c0/1aaa4ffba7842b9044d1c4c6ae704907e6be3d8407c7feb986b3b7efa2e0139fc2ea3c3ad955d7ba4c92b5f577e05648ffc00a2a27b76d2bb93acde431452e58 +"@cspell/dict-docker@npm:^1.1.16": + version: 1.1.16 + resolution: "@cspell/dict-docker@npm:1.1.16" + checksum: 10c0/0e2c211da4a8d6e23311bc41c4041bf447c5c7a4ab84afe3a0229d11fc0af19ec1f6f8fcfd9c6b6793b538a81026d3957e86f3999baba973520ffe84a9420014 languageName: node linkType: hard -"@cspell/dict-dotnet@npm:^5.0.11": - version: 5.0.11 - resolution: "@cspell/dict-dotnet@npm:5.0.11" - checksum: 10c0/02f13fade5845dc444ce71d20af52add1c4755191d2bd99b17706eba27d7ef52e5e09122a48ff560eb81e06c4da73ffa680bc599d04d2c79ababf92ac0cf96e8 +"@cspell/dict-dotnet@npm:^5.0.10": + version: 5.0.10 + resolution: "@cspell/dict-dotnet@npm:5.0.10" + checksum: 10c0/ddb368955d86059d6d59a82263769af832c90028e20c61cdc1e9ba25ac7de8465fd4da2f1966c4683d870720ef7138b937bdde994ac5e991aafc84e236f218b9 languageName: node linkType: hard @@ -1553,31 +1551,31 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-en-common-misspellings@npm:^2.1.11": - version: 2.1.11 - resolution: "@cspell/dict-en-common-misspellings@npm:2.1.11" - checksum: 10c0/58625fd0134eda9930b5956514df58c8fd11e8640bba0fa6317e7cf2c058a09c527ba1a7c3cd4a5c43c02d9083c125634782c651561e451a30aff1120d8566a4 +"@cspell/dict-en-common-misspellings@npm:^2.1.8": + version: 2.1.8 + resolution: "@cspell/dict-en-common-misspellings@npm:2.1.8" + checksum: 10c0/8a9a98216c81f018aa24e76e0e997ceeaff57f5bc97c2831c072085347f403fa2809ad6c6bc298b9127444155d83ac8da9d156df98f4f5313f1d978fddb1bb27 languageName: node linkType: hard -"@cspell/dict-en-gb-mit@npm:^3.1.16": - version: 3.1.16 - resolution: "@cspell/dict-en-gb-mit@npm:3.1.16" - checksum: 10c0/f975956ba129f81f6233ac16bad9ccd0729ba52d0efbee02bed05e81a74f27b285916f5e7dac5d47d11adbeb2336fed49dbd4c7e4ef98c58ac7734ea0f93a535 +"@cspell/dict-en-gb-mit@npm:^3.1.14": + version: 3.1.14 + resolution: "@cspell/dict-en-gb-mit@npm:3.1.14" + checksum: 10c0/44f6f77bacbf8932470eeb75756cc68829be36dc19eddca2b91512fa57ddfb64e18f3a0b282cd20e496aba68b297cd962713ecf68811a7cac619652b2a5ecaad languageName: node linkType: hard -"@cspell/dict-en_us@npm:^4.4.27": - version: 4.4.27 - resolution: "@cspell/dict-en_us@npm:4.4.27" - checksum: 10c0/0d139f30664802a374ebe77647f236a3367051c31ad41ca8c7f78622b5efdaa2e898c2f624b97a85eee5d799853fdb15ae7e223016b1b709d841781fee5ef900 +"@cspell/dict-en_us@npm:^4.4.24": + version: 4.4.24 + resolution: "@cspell/dict-en_us@npm:4.4.24" + checksum: 10c0/bf38bc74753439265e80741a2312b539a36623d38ec816b0698e8e667ad291f6d3b1d4700121aab8539639a5a5f26e138f1e02a1864c72a04306bb6dd23dc3e5 languageName: node linkType: hard -"@cspell/dict-filetypes@npm:^3.0.15": - version: 3.0.15 - resolution: "@cspell/dict-filetypes@npm:3.0.15" - checksum: 10c0/2bf7c592fbe4755dfff8375fbe422b0ac6c0daebc71d4641141611520aeb67e043e9016075b7855513306b594980a6b55af2069e10848256493fcb39a34d0725 +"@cspell/dict-filetypes@npm:^3.0.14": + version: 3.0.14 + resolution: "@cspell/dict-filetypes@npm:3.0.14" + checksum: 10c0/cc51a1099e331021b2be77f7aaa554a6e4e3d9af9443c48a59903867f44ea4553056b130c965d4b599191b7c9a72d86aa151f6a76bdcdad7004d34a3050a8ab5 languageName: node linkType: hard @@ -1623,10 +1621,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-golang@npm:^6.0.26": - version: 6.0.26 - resolution: "@cspell/dict-golang@npm:6.0.26" - checksum: 10c0/514c54dc72620975e552ad91ecc8d98143611224e7fe3606fc6041f3248e9f9457be1f25027ff1d9bc2961459c5759dff3a01251054aab83bbcc9f927648b755 +"@cspell/dict-golang@npm:^6.0.24": + version: 6.0.24 + resolution: "@cspell/dict-golang@npm:6.0.24" + checksum: 10c0/2d6e63e606215db7c29fe312d2414da585372d7c994ce1ba2808a4bf13c5410b0e4318efda9b2ccaab020a3bbc6d8f06c910dbd1a5cc24946ff7e378ffbb591b languageName: node linkType: hard @@ -1644,17 +1642,17 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-html-symbol-entities@npm:^4.0.5": - version: 4.0.5 - resolution: "@cspell/dict-html-symbol-entities@npm:4.0.5" - checksum: 10c0/8278b8cca06e6d3654e81b1809227ff1d64e053f79308966ea601194ce51fa3a385dde6844509b26223de70d034e60a85c604a729f021c0de63f8a5e6f29b0ce +"@cspell/dict-html-symbol-entities@npm:^4.0.4": + version: 4.0.4 + resolution: "@cspell/dict-html-symbol-entities@npm:4.0.4" + checksum: 10c0/ff6be66c36845409622b732f010c5c7a3680c759fba55d136be5556f505bd7e7daee85834b2b9aae54c90a6f6b4055a1b39d49a5976c04226fa80f9238fa48a1 languageName: node linkType: hard -"@cspell/dict-html@npm:^4.0.14": - version: 4.0.14 - resolution: "@cspell/dict-html@npm:4.0.14" - checksum: 10c0/8dedb8a20f7bc53db4b933ae118ee0ab654b176648b2451d335ca8bd266f84ce8deb52989aa51a52f872730262e113b73874b88320b115ab2e993876a3f24cb1 +"@cspell/dict-html@npm:^4.0.12": + version: 4.0.12 + resolution: "@cspell/dict-html@npm:4.0.12" + checksum: 10c0/de3d7197859502e2bb7be4206a881cd53bc6b30516cd181116bbe83c9698da34ebaf7e8da2d62afe925bd0cc3a8abb16aea3794eb3a916a83dc1e915c7b6b49f languageName: node linkType: hard @@ -1714,22 +1712,22 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-markdown@npm:^2.0.14": - version: 2.0.14 - resolution: "@cspell/dict-markdown@npm:2.0.14" +"@cspell/dict-markdown@npm:^2.0.12": + version: 2.0.12 + resolution: "@cspell/dict-markdown@npm:2.0.12" peerDependencies: - "@cspell/dict-css": ^4.0.19 - "@cspell/dict-html": ^4.0.14 - "@cspell/dict-html-symbol-entities": ^4.0.5 + "@cspell/dict-css": ^4.0.18 + "@cspell/dict-html": ^4.0.12 + "@cspell/dict-html-symbol-entities": ^4.0.4 "@cspell/dict-typescript": ^3.2.3 - checksum: 10c0/2198375545579fe4aac7b2a53ae4125bee212fa489be5d19193b227308c3e5c687bfc140111c6263bf2d5a7963eb07f2e4b6c737b2de733fc4e0cf3b2123ece2 + checksum: 10c0/f6d53e71525dff0832950345118abcb2c2ca01aaff51922c5c18f7c3bc0d84a2168bb9bb3e400fe6b91312a5892d0b608db6ea590e2a785474ad355e60d9b535 languageName: node linkType: hard -"@cspell/dict-monkeyc@npm:^1.0.12": - version: 1.0.12 - resolution: "@cspell/dict-monkeyc@npm:1.0.12" - checksum: 10c0/97250565f808cbf37d66f2585db7accf449bc1836c72b3fac0449896fe17b8dfa3e5dc15f27f4e5cbe61dc7c24e9b17c1d7f475c934cd7c68b1aa597386a5bc0 +"@cspell/dict-monkeyc@npm:^1.0.11": + version: 1.0.11 + resolution: "@cspell/dict-monkeyc@npm:1.0.11" + checksum: 10c0/856b7107b2eb70925bf7388f6961548c205b9580298ce28352644b5d20b4779b7d0f8d3ea6888f15aceb124c4bafd51ec896cc55d73cea6853c01a37ee4b97b6 languageName: node linkType: hard @@ -1740,17 +1738,17 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-npm@npm:^5.2.29": - version: 5.2.29 - resolution: "@cspell/dict-npm@npm:5.2.29" - checksum: 10c0/dbcfef8058994615e5190f091bb8e229e263ebaadf54cb4af5bd91334776f4400ef9315eab8f392db8bc478c81d5088f57388ea3307d4edad8d85d560f2d5be6 +"@cspell/dict-npm@npm:^5.2.20": + version: 5.2.20 + resolution: "@cspell/dict-npm@npm:5.2.20" + checksum: 10c0/cf06d77311d3c8665140ec7a8f7cdf23fbc049385d687acf689231548e68dd629ce107e3f8f4f7a99e3d8fdaf58c1a2a3e6e20a30c5d41752c7494500953f274 languageName: node linkType: hard -"@cspell/dict-php@npm:^4.1.1": - version: 4.1.1 - resolution: "@cspell/dict-php@npm:4.1.1" - checksum: 10c0/e11e2a3799b2c9ea590ce8b2e69838965f3d8f83020961720afde9c9c57b6ccdb013d54346900766ccf422c548c916dd2aaa890563d36cf12498ad3ddfe67d7a +"@cspell/dict-php@npm:^4.1.0": + version: 4.1.0 + resolution: "@cspell/dict-php@npm:4.1.0" + checksum: 10c0/ff9227e9ada98f949d543ffd653b88638079b429040a6b1ef69ff7845dcaf4d4854d5303459e32a5aa306d0f87871848db72ed8ec335ede30bfae642c65e4e66 languageName: node linkType: hard @@ -1768,12 +1766,12 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-python@npm:^4.2.25": - version: 4.2.25 - resolution: "@cspell/dict-python@npm:4.2.25" +"@cspell/dict-python@npm:^4.2.21": + version: 4.2.21 + resolution: "@cspell/dict-python@npm:4.2.21" dependencies: - "@cspell/dict-data-science": "npm:^2.0.13" - checksum: 10c0/dcab0aac0075f76b0360fd07d61b4421f543e72a98a482494f9a3decb650d475f4508918c85ef8985eeabac11431bf7f67b496491d58a33cf41c25a6016e84a9 + "@cspell/dict-data-science": "npm:^2.0.11" + checksum: 10c0/138818ba2890983d0a96eda2ac659edc459b051f8d89889e3f3b0104c13aa4f02e1848200fe4d952e8b39d05cf179faabf600306e5a7e870146d05fe89fd3131 languageName: node linkType: hard @@ -1784,24 +1782,24 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-ruby@npm:^5.1.0": - version: 5.1.0 - resolution: "@cspell/dict-ruby@npm:5.1.0" - checksum: 10c0/d9ca8a8d72869b37b201fd5d17d1e7d0094185dde559861b899256b7dd55e80aedba430ac2ca393d0db479c284cc89cd2eec8f9e56e5601ebd715f0463c75b7d +"@cspell/dict-ruby@npm:^5.0.9": + version: 5.0.9 + resolution: "@cspell/dict-ruby@npm:5.0.9" + checksum: 10c0/7a63495fd12d787de9f4f72f070110b26fc3709394fb19bdcac44354ef886c0ff998ad03b90d0d3b252019d112ef34ebf99c94329070978f7d92fd4642dda4b5 languageName: node linkType: hard -"@cspell/dict-rust@npm:^4.1.1": - version: 4.1.1 - resolution: "@cspell/dict-rust@npm:4.1.1" - checksum: 10c0/dc6639ea408fc0a8ff6dfa003fc0b8d7b9b1957375e70e32885effe86bbd8a2509cc0dbc3c91b619b91f9deb211f1ff3fa7856daa5f2dbfdf043edd3633c5de2 +"@cspell/dict-rust@npm:^4.0.12": + version: 4.0.12 + resolution: "@cspell/dict-rust@npm:4.0.12" + checksum: 10c0/023f9844e32e6d22aaaf0f23a9744671a66f1d46c47f08efbe7a74e7a6e1e8671a7c394e1fb15d2b840fdbf605c55b693c539b29ad0eb10908c4bd6f7f4b2231 languageName: node linkType: hard -"@cspell/dict-scala@npm:^5.0.9": - version: 5.0.9 - resolution: "@cspell/dict-scala@npm:5.0.9" - checksum: 10c0/f6b214f4cebcb68a270f4e5cb4163fdd59b58afb28894ac6f523025f411792454c6645c0c616d00af10ea541d5fbd25d34ad7986ddef1bb2181003e39140abbe +"@cspell/dict-scala@npm:^5.0.8": + version: 5.0.8 + resolution: "@cspell/dict-scala@npm:5.0.8" + checksum: 10c0/9ae598e1dbd49554df8e6b22f8590393408690ae644ece4c28ec05c267d11cf90a6f25e088eca5a666e7e56fcd165c20511dd51ec8370a038d8bd485b77e0758 languageName: node linkType: hard @@ -1812,10 +1810,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-software-terms@npm:^5.1.20": - version: 5.1.20 - resolution: "@cspell/dict-software-terms@npm:5.1.20" - checksum: 10c0/ff7513919d842bdb804965852d35aded3a2e32b3535637d7e9ec57fce66ddf69af57d20947bb3db358abe2d0d8e5d0feee029e3e14d1fb66b235d519d5133115 +"@cspell/dict-software-terms@npm:^5.1.11": + version: 5.1.11 + resolution: "@cspell/dict-software-terms@npm:5.1.11" + checksum: 10c0/a997043e401c444762c4cfdbe0093d8155c02360338f62bb26b0b5a3ae5341eaa942edbb750f694a8023b322855abb6d36a464d538d3d71939dec5c9c08e1635 languageName: node linkType: hard @@ -1861,41 +1859,34 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-zig@npm:^1.0.0": - version: 1.0.0 - resolution: "@cspell/dict-zig@npm:1.0.0" - checksum: 10c0/bc302e117002c9d6ebfb5d3e085d9a6f2e65d63440deb9f137dce1d8a75650593f5b83d47488ab394cfbc173be032661dc36bc74c85b9826f60a7d2fc7955ffc - languageName: node - linkType: hard - -"@cspell/dynamic-import@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/dynamic-import@npm:9.6.0" +"@cspell/dynamic-import@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/dynamic-import@npm:9.3.1" dependencies: - "@cspell/url": "npm:9.6.0" + "@cspell/url": "npm:9.3.1" import-meta-resolve: "npm:^4.2.0" - checksum: 10c0/0a4a8ba9af9c4add0583f7b2201a80f36bceac619e4b6be7bd1ac12bdb33e3a975d806720826aba664bedeae6104ba808172e51b44e78f19b63d6ac58b3e265a + checksum: 10c0/b112cb7b9ed940950331e1cd125050270705a20b5f99a59d4976fffdb32e0f2229aea9e53a0839a8df074c395ee32f16934f39f43d416783a40dc017ce63af55 languageName: node linkType: hard -"@cspell/filetypes@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/filetypes@npm:9.6.0" - checksum: 10c0/e76d3ebcfe2b356e58ee7acb9ecb2b2410c4b27c9fa7f29004cf3d5a704f0cb5867ff4e35a9a95190b6fc68c77062b0cdb194e47cdf967637e0db0ae7030db9f +"@cspell/filetypes@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/filetypes@npm:9.3.1" + checksum: 10c0/80731da70f516dc21e2b6c91f170e854e85af3c2a0135b840977f19a8a73baa784a8a8ac9b702c21d3b5786cb5f8550473a1b6089ea053f8d31f4b2ac634bcae languageName: node linkType: hard -"@cspell/strong-weak-map@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/strong-weak-map@npm:9.6.0" - checksum: 10c0/b1424dae888fdfd7da638f0941c167effd4512390a387a987eefe0c804bf0687e93da66df1077d4f44a2b2eeaa5de7f811f407505c6cd9d099e0dd226456edb5 +"@cspell/strong-weak-map@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/strong-weak-map@npm:9.3.1" + checksum: 10c0/c07c1a1dd0fc5c9529a14b3dac7ed6b07e209de5d3d8e948fb602f5d36d41e6aebfcb45fb475ca5ecdfebb6ec341cb820fcf2ee6975fb777dee240e37f460996 languageName: node linkType: hard -"@cspell/url@npm:9.6.0": - version: 9.6.0 - resolution: "@cspell/url@npm:9.6.0" - checksum: 10c0/4ef1562dde0e502d42ac4443ca3fff6d1519b1308c008086f84d10b2bd205ad0d5b3f1e566d8c069163505ae676ecfb4186a8401658f16a53184c7b402ccb596 +"@cspell/url@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/url@npm:9.3.1" + checksum: 10c0/01a6f1a3fba08bc09f8b3deace3fcfe40b40ef52959e92f5500737f8942c2d3aeb2fc95286031ac570e5dbd57ccca355b911937ed92c3183502b9197ea7e27bf languageName: node linkType: hard @@ -2002,6 +1993,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.4.3": + version: 1.8.1 + resolution: "@emnapi/core@npm:1.8.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.1.0" + tslib: "npm:^2.4.0" + checksum: 10c0/2c242f4b49779bac403e1cbcc98edacdb1c8ad36562408ba9a20663824669e930bc8493be46a2522d9dc946b8d96cd7073970bae914928c7671b5221c85b432e + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3": + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1 + languageName: node + linkType: hard + "@epilot/esbuild-jest@npm:^0.5.2": version: 0.5.2 resolution: "@epilot/esbuild-jest@npm:0.5.2" @@ -2043,9 +2062,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/aix-ppc64@npm:0.27.2" +"@esbuild/aix-ppc64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/aix-ppc64@npm:0.25.4" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/aix-ppc64@npm:0.27.0" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard @@ -2057,9 +2083,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm64@npm:0.27.2" +"@esbuild/android-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/android-arm64@npm:0.25.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/android-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm64@npm:0.27.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard @@ -2071,9 +2104,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-arm@npm:0.27.2" +"@esbuild/android-arm@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/android-arm@npm:0.25.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@esbuild/android-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm@npm:0.27.0" conditions: os=android & cpu=arm languageName: node linkType: hard @@ -2085,9 +2125,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/android-x64@npm:0.27.2" +"@esbuild/android-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/android-x64@npm:0.25.4" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/android-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-x64@npm:0.27.0" conditions: os=android & cpu=x64 languageName: node linkType: hard @@ -2099,9 +2146,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-arm64@npm:0.27.2" +"@esbuild/darwin-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/darwin-arm64@npm:0.25.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/darwin-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-arm64@npm:0.27.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard @@ -2113,9 +2167,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/darwin-x64@npm:0.27.2" +"@esbuild/darwin-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/darwin-x64@npm:0.25.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/darwin-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-x64@npm:0.27.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard @@ -2127,9 +2188,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-arm64@npm:0.27.2" +"@esbuild/freebsd-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/freebsd-arm64@npm:0.25.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/freebsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-arm64@npm:0.27.0" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard @@ -2141,9 +2209,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/freebsd-x64@npm:0.27.2" +"@esbuild/freebsd-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/freebsd-x64@npm:0.25.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/freebsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-x64@npm:0.27.0" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard @@ -2155,9 +2230,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm64@npm:0.27.2" +"@esbuild/linux-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-arm64@npm:0.25.4" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/linux-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm64@npm:0.27.0" conditions: os=linux & cpu=arm64 languageName: node linkType: hard @@ -2169,9 +2251,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-arm@npm:0.27.2" +"@esbuild/linux-arm@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-arm@npm:0.25.4" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@esbuild/linux-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm@npm:0.27.0" conditions: os=linux & cpu=arm languageName: node linkType: hard @@ -2183,9 +2272,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ia32@npm:0.27.2" +"@esbuild/linux-ia32@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-ia32@npm:0.25.4" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/linux-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ia32@npm:0.27.0" conditions: os=linux & cpu=ia32 languageName: node linkType: hard @@ -2197,9 +2293,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-loong64@npm:0.27.2" +"@esbuild/linux-loong64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-loong64@npm:0.25.4" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + +"@esbuild/linux-loong64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-loong64@npm:0.27.0" conditions: os=linux & cpu=loong64 languageName: node linkType: hard @@ -2211,9 +2314,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-mips64el@npm:0.27.2" +"@esbuild/linux-mips64el@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-mips64el@npm:0.25.4" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + +"@esbuild/linux-mips64el@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-mips64el@npm:0.27.0" conditions: os=linux & cpu=mips64el languageName: node linkType: hard @@ -2225,9 +2335,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-ppc64@npm:0.27.2" +"@esbuild/linux-ppc64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-ppc64@npm:0.25.4" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + +"@esbuild/linux-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ppc64@npm:0.27.0" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard @@ -2239,9 +2356,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-riscv64@npm:0.27.2" +"@esbuild/linux-riscv64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-riscv64@npm:0.25.4" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + +"@esbuild/linux-riscv64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-riscv64@npm:0.27.0" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard @@ -2253,9 +2377,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-s390x@npm:0.27.2" +"@esbuild/linux-s390x@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-s390x@npm:0.25.4" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + +"@esbuild/linux-s390x@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-s390x@npm:0.27.0" conditions: os=linux & cpu=s390x languageName: node linkType: hard @@ -2267,16 +2398,30 @@ __metadata: languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/linux-x64@npm:0.27.2" +"@esbuild/linux-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/linux-x64@npm:0.25.4" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/linux-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-x64@npm:0.27.0" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-arm64@npm:0.27.2" +"@esbuild/netbsd-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/netbsd-arm64@npm:0.25.4" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-arm64@npm:0.27.0" conditions: os=netbsd & cpu=arm64 languageName: node linkType: hard @@ -2288,16 +2433,30 @@ __metadata: languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/netbsd-x64@npm:0.27.2" +"@esbuild/netbsd-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/netbsd-x64@npm:0.25.4" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-arm64@npm:0.27.2" +"@esbuild/netbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-x64@npm:0.27.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/openbsd-arm64@npm:0.25.4" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-arm64@npm:0.27.0" conditions: os=openbsd & cpu=arm64 languageName: node linkType: hard @@ -2309,16 +2468,23 @@ __metadata: languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openbsd-x64@npm:0.27.2" +"@esbuild/openbsd-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/openbsd-x64@npm:0.25.4" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openharmony-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/openharmony-arm64@npm:0.27.2" +"@esbuild/openbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-x64@npm:0.27.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openharmony-arm64@npm:0.27.0" conditions: os=openharmony & cpu=arm64 languageName: node linkType: hard @@ -2330,9 +2496,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/sunos-x64@npm:0.27.2" +"@esbuild/sunos-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/sunos-x64@npm:0.25.4" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/sunos-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/sunos-x64@npm:0.27.0" conditions: os=sunos & cpu=x64 languageName: node linkType: hard @@ -2344,9 +2517,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-arm64@npm:0.27.2" +"@esbuild/win32-arm64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/win32-arm64@npm:0.25.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/win32-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-arm64@npm:0.27.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard @@ -2358,9 +2538,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-ia32@npm:0.27.2" +"@esbuild/win32-ia32@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/win32-ia32@npm:0.25.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@esbuild/win32-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-ia32@npm:0.27.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard @@ -2372,9 +2559,16 @@ __metadata: languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.27.2": - version: 0.27.2 - resolution: "@esbuild/win32-x64@npm:0.27.2" +"@esbuild/win32-x64@npm:0.25.4": + version: 0.25.4 + resolution: "@esbuild/win32-x64@npm:0.25.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/win32-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-x64@npm:0.27.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2461,10 +2655,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.39.2": - version: 9.39.2 - resolution: "@eslint/js@npm:9.39.2" - checksum: 10c0/00f51c52b04ac79faebfaa65a9652b2093b9c924e945479f1f3945473f78aee83cbc76c8d70bbffbf06f7024626575b16d97b66eab16182e1d0d39daff2f26f5 +"@eslint/js@npm:9.39.1": + version: 9.39.1 + resolution: "@eslint/js@npm:9.39.1" + checksum: 10c0/6f7f26f8cdb7ad6327bbf9741973b6278eb946f18f70e35406e88194b0d5c522d0547a34a02f2a208eec95c5d1388cdf7ccb20039efd2e4cb6655615247a50f1 languageName: node linkType: hard @@ -2509,16 +2703,16 @@ __metadata: languageName: node linkType: hard -"@gerrit0/mini-shiki@npm:^3.17.0": - version: 3.21.0 - resolution: "@gerrit0/mini-shiki@npm:3.21.0" +"@gerrit0/mini-shiki@npm:^3.12.0": + version: 3.15.0 + resolution: "@gerrit0/mini-shiki@npm:3.15.0" dependencies: - "@shikijs/engine-oniguruma": "npm:^3.21.0" - "@shikijs/langs": "npm:^3.21.0" - "@shikijs/themes": "npm:^3.21.0" - "@shikijs/types": "npm:^3.21.0" + "@shikijs/engine-oniguruma": "npm:^3.15.0" + "@shikijs/langs": "npm:^3.15.0" + "@shikijs/themes": "npm:^3.15.0" + "@shikijs/types": "npm:^3.15.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/4045d19854abfa4515381a04af07096c1de07471b029ee090375652d0199ed3fed6165a22bd9f8e8250c609124d8c05f5d4604eb6de87cf13513aa89cfb8d14e + checksum: 10c0/8d0d9591267a634a09a8d1abafa92d6fc83385470ff008945b2f370223eb91682d6356e13481499bf824c42ae4b4393cfa16c30103c52161ec25a9559e39c87b languageName: node linkType: hard @@ -2560,12 +2754,12 @@ __metadata: languageName: node linkType: hard -"@iconify-json/logos@npm:^1.2.10": - version: 1.2.10 - resolution: "@iconify-json/logos@npm:1.2.10" +"@iconify-json/logos@npm:^1.2.9": + version: 1.2.9 + resolution: "@iconify-json/logos@npm:1.2.9" dependencies: "@iconify/types": "npm:*" - checksum: 10c0/0d9722cfd1bf333e3b1fe164b4e148d3420f8e809c392dad79846e16f336eef33e18cd6b18c09d38f8d4d4854892b1a8c19a334bb7a4e3d36d1825c1669cc6e9 + checksum: 10c0/7f5e2c8026560fb63489566cfc90497375543ca3649e7c7d13079f0a166dc4a738cf5686ec66a4cb9a319b8213303bc7c5ae74070e88d4bf0e5c1ef57cb3bacc languageName: node linkType: hard @@ -2578,12 +2772,12 @@ __metadata: languageName: node linkType: hard -"@iconify-json/vscode-icons@npm:^1.2.39": - version: 1.2.40 - resolution: "@iconify-json/vscode-icons@npm:1.2.40" +"@iconify-json/vscode-icons@npm:^1.2.32": + version: 1.2.33 + resolution: "@iconify-json/vscode-icons@npm:1.2.33" dependencies: "@iconify/types": "npm:*" - checksum: 10c0/29dce75c16279709cffac19bfffb0d80b19046bc5ffedb172dd00a3d80f34d741ee2b8aacbc053ac8f59f6f9ce066e6e76fd649743d68aa503cb7605432ec091 + checksum: 10c0/b55c3b263643d08a5e7ef9d35e1dd63c11c911b86e344cfaa8e7fe639bdbf5940ca4164d05f2ec5de89627c934bec4e93a4be480be2c3bcc3ade9c57fd119073 languageName: node linkType: hard @@ -2594,7 +2788,7 @@ __metadata: languageName: node linkType: hard -"@iconify/utils@npm:^3.0.1": +"@iconify/utils@npm:^3.0.1, @iconify/utils@npm:^3.0.2": version: 3.0.2 resolution: "@iconify/utils@npm:3.0.2" dependencies: @@ -2610,17 +2804,6 @@ __metadata: languageName: node linkType: hard -"@iconify/utils@npm:^3.1.0": - version: 3.1.0 - resolution: "@iconify/utils@npm:3.1.0" - dependencies: - "@antfu/install-pkg": "npm:^1.1.0" - "@iconify/types": "npm:^2.0.0" - mlly: "npm:^1.8.0" - checksum: 10c0/a39445e892b248486c186306e1ccba4b07ed1d5b21b143ddf279b33062063173feb84954b9a82e05713b927872787d6c0081073d23f55c44294de37615d4a1f7 - languageName: node - linkType: hard - "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2882,6 +3065,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" + dependencies: + "@emnapi/core": "npm:^1.4.3" + "@emnapi/runtime": "npm:^1.4.3" + "@tybys/wasm-util": "npm:^0.10.0" + checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -3622,10 +3816,10 @@ __metadata: languageName: node linkType: hard -"@rolldown/pluginutils@npm:1.0.0-beta.53": - version: 1.0.0-beta.53 - resolution: "@rolldown/pluginutils@npm:1.0.0-beta.53" - checksum: 10c0/e8b0a7eb76be22f6f103171f28072de821525a4e400454850516da91a7381957932ff0ce495f227bcb168e86815788b0c1d249ca9e34dca366a82c8825b714ce +"@rolldown/pluginutils@npm:1.0.0-beta.47": + version: 1.0.0-beta.47 + resolution: "@rolldown/pluginutils@npm:1.0.0-beta.47" + checksum: 10c0/eb0cfa7334d66f090c47eaac612174936b05f26e789352428cb6e03575b590f355de30d26b42576ea4e613d8887b587119d19b2e4b3a8909ceb232ca1cf746c8 languageName: node linkType: hard @@ -3836,6 +4030,18 @@ __metadata: languageName: node linkType: hard +"@shikijs/core@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/core@npm:3.20.0" + dependencies: + "@shikijs/types": "npm:3.20.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + hast-util-to-html: "npm:^9.0.5" + checksum: 10c0/3df490754e631bf71723aec921de623d0e464c868bccafda89cdb1f061b968ee56385f5709d7401213773dc0c36d9650db436492bd2fa13eac4cf50255f12d26 + languageName: node + linkType: hard + "@shikijs/engine-javascript@npm:2.5.0": version: 2.5.0 resolution: "@shikijs/engine-javascript@npm:2.5.0" @@ -3847,6 +4053,17 @@ __metadata: languageName: node linkType: hard +"@shikijs/engine-javascript@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/engine-javascript@npm:3.20.0" + dependencies: + "@shikijs/types": "npm:3.20.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + oniguruma-to-es: "npm:^4.3.4" + checksum: 10c0/52ee46eba86bd0e4f5ca9520736a17e5a052830685edb319d77a2929ca30bcd176353212b9978d680109fd93d7e13c9ad5b039b69223d817a6331fc9f88389f2 + languageName: node + linkType: hard + "@shikijs/engine-oniguruma@npm:2.5.0": version: 2.5.0 resolution: "@shikijs/engine-oniguruma@npm:2.5.0" @@ -3857,13 +4074,23 @@ __metadata: languageName: node linkType: hard -"@shikijs/engine-oniguruma@npm:^3.21.0": - version: 3.21.0 - resolution: "@shikijs/engine-oniguruma@npm:3.21.0" +"@shikijs/engine-oniguruma@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/engine-oniguruma@npm:3.20.0" + dependencies: + "@shikijs/types": "npm:3.20.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + checksum: 10c0/4a5a8f316a8482e799cd836c8e3f8ba83274b3631b2d66ec82ad839b0ee1dd3df50a08480f791d59f22e42bf6b707032f043a9f651445efc04e59b7ec9e669c9 + languageName: node + linkType: hard + +"@shikijs/engine-oniguruma@npm:^3.15.0": + version: 3.15.0 + resolution: "@shikijs/engine-oniguruma@npm:3.15.0" dependencies: - "@shikijs/types": "npm:3.21.0" + "@shikijs/types": "npm:3.15.0" "@shikijs/vscode-textmate": "npm:^10.0.2" - checksum: 10c0/cb17c034b04e1333f90f267081b7fac0b53e56031f7d067723363a72cdbdf79e567dea216bbcae38a6d4b910570c2dd60a953ca941f4834768c0bb721131af5f + checksum: 10c0/97cb43d1f3fbace9f5412e516ab87ad38b529550bb696891a518efcefa32680a0b625a17e1fe8db6cf2b1e6e252db7ac408e3294375ec0600a9b07e4e482ca7c languageName: node linkType: hard @@ -3876,12 +4103,21 @@ __metadata: languageName: node linkType: hard -"@shikijs/langs@npm:^3.21.0": - version: 3.21.0 - resolution: "@shikijs/langs@npm:3.21.0" +"@shikijs/langs@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/langs@npm:3.20.0" dependencies: - "@shikijs/types": "npm:3.21.0" - checksum: 10c0/79cfc2b8ac1f5c938bfb18db6233f86ca96948970068c2cc94559e30abac2036c35a2ae52015d07f72b6decfd6b2ae86321f9547ae0f994b6131e362781fbf1f + "@shikijs/types": "npm:3.20.0" + checksum: 10c0/6830460025d0df4c527ffeacf0a78cd4331ffde1cfcd1e8028aa9814be8a4cea84367dd938528a9b55de72b163c58ad3576915ea08c3d0a29ef1dc80e120116c + languageName: node + linkType: hard + +"@shikijs/langs@npm:^3.15.0": + version: 3.15.0 + resolution: "@shikijs/langs@npm:3.15.0" + dependencies: + "@shikijs/types": "npm:3.15.0" + checksum: 10c0/d5a328ec999572f50e4fec77213e7d0f106c90c04e078be29cdb2467f10012221d52435fd9711f963ce30adbf14805d2a31a2e602fa7a074fa450bbf83553eca languageName: node linkType: hard @@ -3894,12 +4130,21 @@ __metadata: languageName: node linkType: hard -"@shikijs/themes@npm:^3.21.0": - version: 3.21.0 - resolution: "@shikijs/themes@npm:3.21.0" +"@shikijs/themes@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/themes@npm:3.20.0" dependencies: - "@shikijs/types": "npm:3.21.0" - checksum: 10c0/f128a874231d84d93e16f347557e844c2b6493b41196b52e36a79874598abe2dbf3ee981dfe52dd09f8d7e21ed4ff41ab03c28de7a21313d9a0b691fbd3690c0 + "@shikijs/types": "npm:3.20.0" + checksum: 10c0/d6fc059c51c3c0694e026cc1f80eed927d9b91adaeda0fb3fd5725eabc6d066aaf022919def435245446ae91e3da541ed6d88d875cf59a35bfbabb6920efb6da + languageName: node + linkType: hard + +"@shikijs/themes@npm:^3.15.0": + version: 3.15.0 + resolution: "@shikijs/themes@npm:3.15.0" + dependencies: + "@shikijs/types": "npm:3.15.0" + checksum: 10c0/2b6a435d991d1fd924622e437c5546ecc5ab3d5c0843edbe2ca444e4e91a9c4d8d9c0a673a32afdb1c262dffcd7839518a9f9154121be8dfa7553f99458d9bab languageName: node linkType: hard @@ -3923,7 +4168,27 @@ __metadata: languageName: node linkType: hard -"@shikijs/types@npm:3.21.0, @shikijs/types@npm:^3.15.0, @shikijs/types@npm:^3.21.0": +"@shikijs/types@npm:3.15.0": + version: 3.15.0 + resolution: "@shikijs/types@npm:3.15.0" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/bc18c7e8b83fbf73f88a26dcf06e777566f8d8568a26ace4dacf5373c51e95213af1181eb389c4d0d7dc57c21824396278d6cbebf57a905676923bfdab00bb23 + languageName: node + linkType: hard + +"@shikijs/types@npm:3.20.0": + version: 3.20.0 + resolution: "@shikijs/types@npm:3.20.0" + dependencies: + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/7faea130362a6cdf3d66fcb47d6b609a8e0209e76ba86688f56a65411b6ae400a37414cd1a3a2fe1ee3fe39f18e274585d3972129c7e79244aaa0c15bc8f1c21 + languageName: node + linkType: hard + +"@shikijs/types@npm:^3.15.0": version: 3.21.0 resolution: "@shikijs/types@npm:3.21.0" dependencies: @@ -3954,9 +4219,9 @@ __metadata: languageName: node linkType: hard -"@snyk/dep-graph@npm:^2.12.0": - version: 2.12.1 - resolution: "@snyk/dep-graph@npm:2.12.1" +"@snyk/dep-graph@npm:^2.3.0": + version: 2.9.0 + resolution: "@snyk/dep-graph@npm:2.9.0" dependencies: event-loop-spinner: "npm:^2.1.0" lodash.clone: "npm:^4.5.0" @@ -3974,10 +4239,10 @@ __metadata: lodash.union: "npm:^4.6.0" lodash.values: "npm:^4.3.0" object-hash: "npm:^3.0.0" - packageurl-js: "npm:2.0.1" + packageurl-js: "npm:1.2.0" semver: "npm:^7.0.0" tslib: "npm:^2" - checksum: 10c0/1d9c9ba1c356f24135d7b8da19bdbd09068521eafa84f173bdd18a2ba6678038feea9df253e5df53eb31ffa853b3345e9f8d2649995d34f31bc32ddf621173e1 + checksum: 10c0/709116c589216b130e51bc7750bb9151ec382f749a9ccb124950a4390f6bb470e42cb6e64b56a8bff35602056685a97b66eda0b2eee2584f759d1e046293cb6e languageName: node linkType: hard @@ -4046,7 +4311,7 @@ __metadata: resolution: "@sourceacademy/bundle-binary_tree@workspace:src/bundles/binary_tree" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4082,6 +4347,7 @@ __metadata: "@jscad/stl-serializer": "npm:2.1.11" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" + js-slang: "npm:^1.0.85" save-file: "npm:^2.3.1" typescript: "npm:^5.8.2" languageName: unknown @@ -4094,7 +4360,7 @@ __metadata: "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" gl-matrix: "npm:^3.3.0" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4104,7 +4370,7 @@ __metadata: resolution: "@sourceacademy/bundle-game@workspace:src/bundles/game" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" phaser: "npm:^3.54.0" typescript: "npm:^5.8.2" languageName: unknown @@ -4124,7 +4390,7 @@ __metadata: resolution: "@sourceacademy/bundle-midi@workspace:src/bundles/midi" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4172,13 +4438,13 @@ __metadata: dependencies: "@sourceacademy/modules-buildtools": "workspace:^" "@types/react": "npm:^18.3.1" - "@vitest/browser-playwright": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" playwright: "npm:^1.55.1" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" typescript: "npm:^5.8.2" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" languageName: unknown linkType: soft @@ -4190,7 +4456,7 @@ __metadata: "@sourceacademy/bundle-sound": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@types/plotly.js": "npm:^3.0.0" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" plotly.js-dist: "npm:^3.0.0" typescript: "npm:^5.8.2" languageName: unknown @@ -4201,7 +4467,7 @@ __metadata: resolution: "@sourceacademy/bundle-remote_execution@workspace:src/bundles/remote_execution" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4220,7 +4486,7 @@ __metadata: resolution: "@sourceacademy/bundle-repl@workspace:src/bundles/repl" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4233,6 +4499,7 @@ __metadata: "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/three": "npm:^0.181.0" + js-slang: "npm:^1.0.85" three: "npm:^0.181.0" typescript: "npm:^5.8.2" languageName: unknown @@ -4244,8 +4511,10 @@ __metadata: dependencies: "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" + "@types/lodash": "npm:^4.14.198" gl-matrix: "npm:^3.3.0" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" + lodash: "npm:^4.17.23" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4275,7 +4544,7 @@ __metadata: "@sourceacademy/bundle-midi": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4285,7 +4554,7 @@ __metadata: resolution: "@sourceacademy/bundle-sound_matrix@workspace:src/bundles/sound_matrix" dependencies: "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4296,7 +4565,7 @@ __metadata: dependencies: "@sourceacademy/bundle-midi": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" typescript: "npm:^5.8.2" languageName: unknown linkType: soft @@ -4307,7 +4576,7 @@ __metadata: dependencies: "@sourceacademy/modules-buildtools": "workspace:^" "@types/lodash": "npm:^4.14.198" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" lodash: "npm:^4.17.23" typescript: "npm:^5.8.2" languageName: unknown @@ -4317,8 +4586,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/bundle-unity_academy@workspace:src/bundles/unity_academy" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@types/react": "npm:^18.3.1" "@types/react-dom": "npm:^18.3.1" @@ -4347,9 +4616,9 @@ __metadata: "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-repotools": "workspace:^" "@stylistic/eslint-plugin": "npm:^4.4.1" - "@typescript-eslint/rule-tester": "npm:^8.39.0" - "@typescript-eslint/utils": "npm:^8.39.0" - "@vitest/eslint-plugin": "npm:^1.3.4" + "@typescript-eslint/rule-tester": "npm:^8.53.1" + "@typescript-eslint/utils": "npm:^8.53.1" + "@vitest/eslint-plugin": "npm:^1.6.6" eslint: "npm:^9.35.0" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jsdoc: "npm:^62.0.0" @@ -4357,7 +4626,7 @@ __metadata: eslint-plugin-react-hooks: "npm:^5.1.0" globals: "npm:^15.11.0" typescript: "npm:^5.8.2" - typescript-eslint: "npm:^8.33.1" + typescript-eslint: "npm:^8.53.1" peerDependencies: "@eslint/markdown": ^6.6.0 "@stylistic/eslint-plugin": ^4.4.1 @@ -4376,12 +4645,12 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/markdown-plugin-directory-tree@workspace:lib/markdown-tree" dependencies: - "@shikijs/types": "npm:^3.15.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-repotools": "workspace:^" "@types/lodash": "npm:^4.14.198" "@types/markdown-it": "npm:^14.1.2" lodash: "npm:^4.17.23" + shiki: "npm:^3.15.0" tm-themes: "npm:^1.10.12" typescript: "npm:^5.8.2" yaml: "npm:^2.8.0" @@ -4402,9 +4671,10 @@ __metadata: "@types/lodash": "npm:^4.14.198" "@types/node": "npm:^22.15.30" "@vitejs/plugin-react": "npm:^5.1.0" - "@vitest/browser-playwright": "npm:^4.0.4" - "@vitest/coverage-v8": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" + "@vitest/coverage-v8": "npm:^4.0.18" acorn: "npm:^8.8.1" + acorn-typescript: "npm:^1.4.13" astring: "npm:^1.8.6" chalk: "npm:^5.0.1" commander: "npm:^14.0.0" @@ -4416,7 +4686,7 @@ __metadata: typedoc: "npm:^0.28.9" typescript: "npm:^5.8.2" vite: "npm:^7.1.11" - vitest: "npm:^4.0.4" + vitest: "npm:^4.0.18" bin: buildtools: ./dist/index.js languageName: unknown @@ -4426,20 +4696,20 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/modules-devserver@workspace:devserver" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@commander-js/extra-typings": "npm:^14.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" "@types/react-dom": "npm:^18.3.1" "@vitejs/plugin-react": "npm:^5.1.0" - "@vitest/browser-playwright": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" ace-builds: "npm:^1.25.1" classnames: "npm:^2.3.1" commander: "npm:^14.0.0" eslint: "npm:^9.35.0" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" playwright: "npm:^1.55.1" re-resizable: "npm:^6.9.11" react: "npm:^18.3.1" @@ -4449,8 +4719,8 @@ __metadata: typescript: "npm:^5.8.2" vite: "npm:^7.1.11" vite-plugin-node-polyfills: "npm:^0.24.0" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" bin: devserver: ./bin.js languageName: unknown @@ -4480,11 +4750,12 @@ __metadata: "@actions/core": "npm:^1.11.1" "@actions/exec": "npm:^1.1.1" "@sourceacademy/modules-repotools": "workspace:^" + "@types/lodash": "npm:^4.14.198" "@types/node": "npm:^22.15.30" lodash: "npm:^4.17.23" snyk-nodejs-lockfile-parser: "npm:^2.4.2" typescript: "npm:^5.8.2" - vitest: "npm:^4.0.4" + vitest: "npm:^4.0.18" languageName: unknown linkType: soft @@ -4492,15 +4763,17 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/modules-lib@workspace:lib/modules-lib" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" + "@types/lodash": "npm:^4.14.198" "@types/react": "npm:^18.3.1" "@types/react-dom": "npm:^18.3.1" "@vitejs/plugin-react": "npm:^5.1.0" - "@vitest/browser-playwright": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" eslint: "npm:^9.35.0" - js-slang: "npm:^1.0.81" + js-slang: "npm:^1.0.85" + lodash: "npm:^4.17.23" playwright: "npm:^1.55.1" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" @@ -4509,8 +4782,8 @@ __metadata: typedoc-plugin-markdown: "npm:^4.7.0" typedoc-plugin-rename-defaults: "npm:^0.7.3" typescript: "npm:^5.8.2" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" languageName: unknown linkType: soft @@ -4522,16 +4795,16 @@ __metadata: "@types/lodash": "npm:^4.14.198" "@types/node": "npm:^22.15.30" "@vitejs/plugin-react": "npm:^5.1.0" - "@vitest/browser-playwright": "npm:^4.0.4" - "@vitest/coverage-v8": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" + "@vitest/coverage-v8": "npm:^4.0.18" chalk: "npm:^5.0.1" commander: "npm:^14.0.0" esbuild: "npm:^0.27.0" jsonschema: "npm:^1.5.0" lodash: "npm:^4.17.23" typescript: "npm:^5.8.2" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" peerDependencies: "@vitejs/plugin-react": "*" vitest-browser-react: "*" @@ -4551,11 +4824,12 @@ __metadata: "@types/node": "npm:^22.15.30" "@types/react": "npm:^18.3.1" "@types/react-dom": "npm:^18.3.1" - "@vitest/coverage-v8": "npm:^4.0.4" - "@vitest/eslint-plugin": "npm:^1.3.4" + "@vitest/coverage-v8": "npm:^4.0.18" + "@vitest/eslint-plugin": "npm:^1.6.6" "@yarnpkg/types": "npm:^4.0.1" esbuild: "npm:^0.27.0" eslint: "npm:^9.35.0" + eslint-import-resolver-typescript: "npm:^4.4.4" eslint-plugin-import: "npm:^2.32.0" eslint-plugin-jsdoc: "npm:^62.0.0" eslint-plugin-mdx: "npm:^3.6.2" @@ -4563,16 +4837,19 @@ __metadata: eslint-plugin-react-hooks: "npm:^5.1.0" eslint-plugin-yml: "npm:^1.19.0" husky: "npm:^9.1.7" - js-slang: "npm:^1.0.81" jsdom: "npm:^26.1.0" jsonc-eslint-parser: "npm:^2.4.0" - lodash: "npm:^4.17.23" - react: "npm:^18.3.1" - react-dom: "npm:^18.3.1" typescript: "npm:^5.8.2" - typescript-eslint: "npm:^8.33.1" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + typescript-eslint: "npm:^8.53.1" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" + peerDependencies: + "@blueprintjs/core": ^6.0.0 + "@blueprintjs/icons": ^6.0.0 + js-slang: ^1.0.85 + lodash: ^4.17.23 + react: ^18.3.1 + react-dom: ^18.3.1 languageName: unknown linkType: soft @@ -4580,8 +4857,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-ArcadeTwod@workspace:src/tabs/ArcadeTwod" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" @@ -4596,7 +4873,7 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-AugmentedReality@workspace:src/tabs/AugmentedReality" dependencies: - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-ar": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4612,6 +4889,7 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-CopyGc@workspace:src/tabs/CopyGc" dependencies: + "@blueprintjs/core": "npm:^6.0.0" "@sourceacademy/bundle-copy_gc": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4626,8 +4904,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Csg@workspace:src/tabs/Csg" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-csg": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4642,20 +4920,20 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Curve@workspace:src/tabs/Curve" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-curve": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" "@types/react-dom": "npm:^18.3.1" - "@vitest/browser-playwright": "npm:^4.0.4" - "@vitest/coverage-v8": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" + "@vitest/coverage-v8": "npm:^4.0.18" playwright: "npm:^1.55.1" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" languageName: unknown linkType: soft @@ -4675,6 +4953,7 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-MarkSweep@workspace:src/tabs/MarkSweep" dependencies: + "@blueprintjs/core": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" @@ -4687,6 +4966,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Nbody@workspace:src/tabs/Nbody" dependencies: + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/plotly.js": "npm:^2.35.4" @@ -4718,6 +4999,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Physics2D@workspace:src/tabs/Physics2D" dependencies: + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@box2d/debug-draw": "npm:^0.10.0" "@sourceacademy/bundle-physics_2d": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" @@ -4732,6 +5015,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Pixnflix@workspace:src/tabs/Pixnflix" dependencies: + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-pix_n_flix": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4770,6 +5055,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-Repl@workspace:src/tabs/Repl" dependencies: + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-repl": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4786,6 +5073,7 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-RobotSimulation@workspace:src/tabs/RobotSimulation" dependencies: + "@blueprintjs/core": "npm:^6.0.0" "@dimforge/rapier3d-compat": "npm:^0.11.2" "@sourceacademy/bundle-robot_simulation": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" @@ -4804,12 +5092,13 @@ __metadata: "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" - "@vitest/browser-playwright": "npm:^4.0.4" + "@vitest/browser-playwright": "npm:^4.0.18" + lodash: "npm:^4.17.23" playwright: "npm:^1.55.1" react: "npm:^18.3.1" react-dom: "npm:^18.3.1" - vitest: "npm:^4.0.4" - vitest-browser-react: "npm:^2.0.2" + vitest: "npm:^4.0.18" + vitest-browser-react: "npm:^2.0.4" languageName: unknown linkType: soft @@ -4830,6 +5119,7 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-SoundMatrix@workspace:src/tabs/SoundMatrix" dependencies: + "@blueprintjs/core": "npm:^6.0.0" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" "@types/react": "npm:^18.3.1" @@ -4871,8 +5161,8 @@ __metadata: version: 0.0.0-use.local resolution: "@sourceacademy/tab-UnityAcademy@workspace:src/tabs/UnityAcademy" dependencies: - "@blueprintjs/core": "npm:^5.10.2" - "@blueprintjs/icons": "npm:^5.9.0" + "@blueprintjs/core": "npm:^6.0.0" + "@blueprintjs/icons": "npm:^6.0.0" "@sourceacademy/bundle-unity_academy": "workspace:^" "@sourceacademy/modules-buildtools": "workspace:^" "@sourceacademy/modules-lib": "workspace:^" @@ -4889,11 +5179,11 @@ __metadata: dependencies: "@types/istanbul-lib-report": "npm:^3.0.3" "@types/node": "npm:^22.15.30" - "@vitest/coverage-v8": "npm:^4.0.4" + "@vitest/coverage-v8": "npm:^4.0.18" esbuild: "npm:^0.27.0" istanbul-lib-report: "npm:^3.0.1" typescript: "npm:^5.8.2" - vitest: "npm:^4.0.4" + vitest: "npm:^4.0.18" languageName: unknown linkType: soft @@ -4956,6 +5246,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.0": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.0.0, @types/babel__core@npm:^7.1.7, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -5458,9 +5757,9 @@ __metadata: linkType: hard "@types/lodash@npm:^4.14.198": - version: 4.17.23 - resolution: "@types/lodash@npm:4.17.23" - checksum: 10c0/9d9cbfb684e064a2b78aab9e220d398c9c2a7d36bc51a07b184ff382fa043a99b3d00c16c7f109b4eb8614118f4869678dbae7d5c6700ed16fb9340e26cc0bf6 + version: 4.17.20 + resolution: "@types/lodash@npm:4.17.20" + checksum: 10c0/98cdd0faae22cbb8079a01a3bb65aa8f8c41143367486c1cbf5adc83f16c9272a2a5d2c1f541f61d0d73da543c16ee1d21cf2ef86cb93cd0cc0ac3bced6dd88f languageName: node linkType: hard @@ -5498,20 +5797,20 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 25.0.9 - resolution: "@types/node@npm:25.0.9" + version: 24.10.1 + resolution: "@types/node@npm:24.10.1" dependencies: undici-types: "npm:~7.16.0" - checksum: 10c0/a757efafe303d9c8833eb53c2e9a0981cd5ac725cdc04c5612a71db86468c938778d4fa328be4231b68fffc68258638764df7b9c69e86cf55f0bb67105eb056f + checksum: 10c0/d6bca7a78f550fbb376f236f92b405d676003a8a09a1b411f55920ef34286ee3ee51f566203920e835478784df52662b5b2af89159d9d319352e9ea21801c002 languageName: node linkType: hard "@types/node@npm:^22.0.0, @types/node@npm:^22.15.30": - version: 22.19.7 - resolution: "@types/node@npm:22.19.7" + version: 22.19.1 + resolution: "@types/node@npm:22.19.1" dependencies: undici-types: "npm:~6.21.0" - checksum: 10c0/0a4b13fd51306a72393f145693063e074be1bf884bdc642c879436d2c053ac9d573cc0a0d69867f60b14d3f1b9d03317e8ec0e4377f7527cb645e7b2a5d34045 + checksum: 10c0/6edd93aea86da740cb7872626839cd6f4a67a049d3a3a6639cb592c620ec591408a30989ab7410008d1a0b2d4985ce50f1e488e79c033e4476d3bec6833b0a2f languageName: node linkType: hard @@ -5530,9 +5829,9 @@ __metadata: linkType: hard "@types/plotly.js@npm:^3.0.0": - version: 3.0.9 - resolution: "@types/plotly.js@npm:3.0.9" - checksum: 10c0/8f5aa3cc96f6351e978d491356407e69cd417f6fc64df458cb90a5e382515b37e61dff7fe7416ed7d8ad2f3cdbbe1d7c1629d184bcf33e00111c39b3dce0b28e + version: 3.0.8 + resolution: "@types/plotly.js@npm:3.0.8" + checksum: 10c0/7b8b26a07c8fb863ab1950089eb5c6f67896d65628409f17ab1beaf0a0ffa338cb2171aec108b2460205267ad65e67b10e739f8f74fbf476229202d4487d869b languageName: node linkType: hard @@ -5571,21 +5870,21 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 19.2.8 - resolution: "@types/react@npm:19.2.8" + version: 19.2.2 + resolution: "@types/react@npm:19.2.2" dependencies: - csstype: "npm:^3.2.2" - checksum: 10c0/832834998c4ee971fca72ecf1eb95dc924ad3931a2112c687a4dae498aabd115c5fa4db09186853e34a646226b0223808c8f867df03d17601168f9cf119448de + csstype: "npm:^3.0.2" + checksum: 10c0/f830b1204aca4634ce3c6cb3477b5d3d066b80a4dd832a4ee0069acb504b6debd2416548a43a11c1407c12bc60e2dc6cf362934a18fe75fe06a69c0a98cba8ab languageName: node linkType: hard "@types/react@npm:^18.3.1": - version: 18.3.27 - resolution: "@types/react@npm:18.3.27" + version: 18.3.26 + resolution: "@types/react@npm:18.3.26" dependencies: "@types/prop-types": "npm:*" - csstype: "npm:^3.2.2" - checksum: 10c0/a761d2f58de03d0714806cc65d32bb3d73fb33a08dd030d255b47a295e5fff2a775cf1c20b786824d8deb6454eaccce9bc6998d9899c14fc04bbd1b0b0b72897 + csstype: "npm:^3.0.2" + checksum: 10c0/7b62d91c33758f14637311921c92db6045b6328e2300666a35ef8130d06385e39acada005eaf317eee93228edc10ea5f0cd34a0385654d2014d24699a65bfeef languageName: node linkType: hard @@ -5726,39 +6025,52 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.53.0": - version: 8.53.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.53.0" +"@typescript-eslint/eslint-plugin@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.53.1" dependencies: "@eslint-community/regexpp": "npm:^4.12.2" - "@typescript-eslint/scope-manager": "npm:8.53.0" - "@typescript-eslint/type-utils": "npm:8.53.0" - "@typescript-eslint/utils": "npm:8.53.0" - "@typescript-eslint/visitor-keys": "npm:8.53.0" + "@typescript-eslint/scope-manager": "npm:8.53.1" + "@typescript-eslint/type-utils": "npm:8.53.1" + "@typescript-eslint/utils": "npm:8.53.1" + "@typescript-eslint/visitor-keys": "npm:8.53.1" ignore: "npm:^7.0.5" natural-compare: "npm:^1.4.0" ts-api-utils: "npm:^2.4.0" peerDependencies: - "@typescript-eslint/parser": ^8.53.0 + "@typescript-eslint/parser": ^8.53.1 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/c28925423023853591696f20844c9365ad4353c8beb004fc5ccc1995903c42202070165a2c750f53abf43420ff8daa19d874010efc4ba925311ca2f320ce55fe + checksum: 10c0/d24e41d0117ef841cc05e4c52d33277de2e57981fa38412f93034082a3467f804201c180f1baca9f967388c7e5965ffcc61e445cf726a0064b8ed71a84f59aa2 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.53.0": - version: 8.53.0 - resolution: "@typescript-eslint/parser@npm:8.53.0" +"@typescript-eslint/parser@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/parser@npm:8.53.1" dependencies: - "@typescript-eslint/scope-manager": "npm:8.53.0" - "@typescript-eslint/types": "npm:8.53.0" - "@typescript-eslint/typescript-estree": "npm:8.53.0" - "@typescript-eslint/visitor-keys": "npm:8.53.0" + "@typescript-eslint/scope-manager": "npm:8.53.1" + "@typescript-eslint/types": "npm:8.53.1" + "@typescript-eslint/typescript-estree": "npm:8.53.1" + "@typescript-eslint/visitor-keys": "npm:8.53.1" debug: "npm:^4.4.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/5c6aae71f4015fc3ebbfe6fa6e040dcc99fc15b6bd36631b67ae61523b2da57651cbb1cd2de430380df5fd13cd03c43f233073af6a8a85714e651a3db74a5cf6 + checksum: 10c0/fb7602dc3ea45b838f4da2d0173161b222442ed2007487dfce57d6ce24ff16606ec99de9eb6ac114a815e11a47248303d941dca1a7bf13f70350372cee509886 + languageName: node + linkType: hard + +"@typescript-eslint/project-service@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/project-service@npm:8.52.0" + dependencies: + "@typescript-eslint/tsconfig-utils": "npm:^8.52.0" + "@typescript-eslint/types": "npm:^8.52.0" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/2dc7379572b4b1340daff5923fbf7987ebd2de5a4203ece0ec9e8a9e85cf182cd4cd24c25bd7df62b981fb633c91dd35f27fed1341719c2f8a48eb80682b4658 languageName: node linkType: hard @@ -5775,20 +6087,43 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/rule-tester@npm:^8.39.0": - version: 8.53.0 - resolution: "@typescript-eslint/rule-tester@npm:8.53.0" +"@typescript-eslint/project-service@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/project-service@npm:8.53.1" dependencies: - "@typescript-eslint/parser": "npm:8.53.0" - "@typescript-eslint/typescript-estree": "npm:8.53.0" - "@typescript-eslint/utils": "npm:8.53.0" + "@typescript-eslint/tsconfig-utils": "npm:^8.53.1" + "@typescript-eslint/types": "npm:^8.53.1" + debug: "npm:^4.4.3" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/eecc7ad86b45c6969a05e984e645a4ece2a1cc27d825af046efb6ed369cab32062c17f33a1154ab6dcab349099885db7b39945f1b318753395630f3dfa1e5895 + languageName: node + linkType: hard + +"@typescript-eslint/rule-tester@npm:^8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/rule-tester@npm:8.53.1" + dependencies: + "@typescript-eslint/parser": "npm:8.53.1" + "@typescript-eslint/typescript-estree": "npm:8.53.1" + "@typescript-eslint/utils": "npm:8.53.1" ajv: "npm:^6.12.6" json-stable-stringify-without-jsonify: "npm:^1.0.1" lodash.merge: "npm:4.6.2" semver: "npm:^7.7.3" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10c0/695623b09708abaf752d3dc3e0706eb2de6a8949bb043c41c1eb698895916b889676f12f62d24bf0c47608c3e13ca5d59a9d3b7f53756d43796eec255a878866 + checksum: 10c0/418c5d9c646c9879050a4a4e9f297955fca8862f76363c05bedd0cd48e7f3e2ca3608dffc873658dbc96e485f1cdd97fdbf64289ab10e8cd91940c11323a39b5 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:8.52.0, @typescript-eslint/scope-manager@npm:^8.51.0": + version: 8.52.0 + resolution: "@typescript-eslint/scope-manager@npm:8.52.0" + dependencies: + "@typescript-eslint/types": "npm:8.52.0" + "@typescript-eslint/visitor-keys": "npm:8.52.0" + checksum: 10c0/385105ad1bb63eddcfc65039a7c13ec339aef4823c3021110cffe72c545b27c6b197e40ec55000b5b1bf278946a3e1a77eba19203f461c1a77ba3fe82d007f3e languageName: node linkType: hard @@ -5802,13 +6137,22 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:^8.51.0": - version: 8.52.0 - resolution: "@typescript-eslint/scope-manager@npm:8.52.0" +"@typescript-eslint/scope-manager@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/scope-manager@npm:8.53.1" dependencies: - "@typescript-eslint/types": "npm:8.52.0" - "@typescript-eslint/visitor-keys": "npm:8.52.0" - checksum: 10c0/385105ad1bb63eddcfc65039a7c13ec339aef4823c3021110cffe72c545b27c6b197e40ec55000b5b1bf278946a3e1a77eba19203f461c1a77ba3fe82d007f3e + "@typescript-eslint/types": "npm:8.53.1" + "@typescript-eslint/visitor-keys": "npm:8.53.1" + checksum: 10c0/d971eb115f2a2c4c25c79df9eee68b93354b32d7cc1174c167241cd2ebbc77858fe7a032c7ecdbacef936b56e8317b56037d21461cb83b4789f7e764e9faa455 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.52.0, @typescript-eslint/tsconfig-utils@npm:^8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.52.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/a45f6c1453031c149b2dedaa4e8ace53aa71c751a5702b028cbd9a899928d46141cc4343d8de6260e3e27024f6645b12669d8759f66ebde4cbae2f703b859747 languageName: node linkType: hard @@ -5821,19 +6165,28 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.53.0": - version: 8.53.0 - resolution: "@typescript-eslint/type-utils@npm:8.53.0" +"@typescript-eslint/tsconfig-utils@npm:8.53.1, @typescript-eslint/tsconfig-utils@npm:^8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.53.1" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/e2bfa91f9306dbfa82bdcb64bfcf634fee6313b03e93b35b0010907983c9ffc73c732264deff870896dea18f34b872d39d90d32f7631fd4618e4a6866ffff578 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/type-utils@npm:8.53.1" dependencies: - "@typescript-eslint/types": "npm:8.53.0" - "@typescript-eslint/typescript-estree": "npm:8.53.0" - "@typescript-eslint/utils": "npm:8.53.0" + "@typescript-eslint/types": "npm:8.53.1" + "@typescript-eslint/typescript-estree": "npm:8.53.1" + "@typescript-eslint/utils": "npm:8.53.1" debug: "npm:^4.4.3" ts-api-utils: "npm:^2.4.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/6d7d6eb80a6b214d9c8e185527e21fa44e1f4d2fe48d4f29f964f8c3921da47757a8cc537edc5c233fc47af02a487935c176b1c918ce4d22ba8341dbd1b455e0 + checksum: 10c0/d97ac3bf901eeeb1ad01a423409db654f849d49f8ce7a2b0d482e093d5c8c9cab9ed810554d130a1eaf4921ddb2d98dbe9a8d22bfd08fd6c8ab004fb640a3fbe languageName: node linkType: hard @@ -5851,6 +6204,32 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.53.1, @typescript-eslint/types@npm:^8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/types@npm:8.53.1" + checksum: 10c0/fa49f5f60de6851de45a9aff0a3ba3c4d00a0991100414e8af1a5d6f32764a48b6b7c0f65748a651f0da0e57df0745cdb8f11c590fa0fb22dd0e54e4c6b5c878 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.52.0" + dependencies: + "@typescript-eslint/project-service": "npm:8.52.0" + "@typescript-eslint/tsconfig-utils": "npm:8.52.0" + "@typescript-eslint/types": "npm:8.52.0" + "@typescript-eslint/visitor-keys": "npm:8.52.0" + debug: "npm:^4.4.3" + minimatch: "npm:^9.0.5" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.4.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/e4158a6364d3f009eac780947504ac1dad2ee3f1fdd4dfd99e4a7b48719ce0d342a769dc05fa5d4bc5de9de28175aa8e9ba612385f6b6f215039ff41e91f2de5 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:8.53.0": version: 8.53.0 resolution: "@typescript-eslint/typescript-estree@npm:8.53.0" @@ -5870,67 +6249,261 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.53.0, @typescript-eslint/utils@npm:^8.32.1, @typescript-eslint/utils@npm:^8.39.0, @typescript-eslint/utils@npm:^8.51.0": - version: 8.53.0 - resolution: "@typescript-eslint/utils@npm:8.53.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.9.1" - "@typescript-eslint/scope-manager": "npm:8.53.0" - "@typescript-eslint/types": "npm:8.53.0" - "@typescript-eslint/typescript-estree": "npm:8.53.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/6af761fc5ed89606bd8dd1abf7c526afe0060c115035a4fcddfa173ba8a01b7422edf84bc4d74aab2a086911db57a893a2753b3c025ace3e86adc1c2259a6253 +"@typescript-eslint/typescript-estree@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.53.1" + dependencies: + "@typescript-eslint/project-service": "npm:8.53.1" + "@typescript-eslint/tsconfig-utils": "npm:8.53.1" + "@typescript-eslint/types": "npm:8.53.1" + "@typescript-eslint/visitor-keys": "npm:8.53.1" + debug: "npm:^4.4.3" + minimatch: "npm:^9.0.5" + semver: "npm:^7.7.3" + tinyglobby: "npm:^0.2.15" + ts-api-utils: "npm:^2.4.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/e1b48990ba90f0ee5c9630fe91e2d5123c55348e374e586de6cf25e6e03e6e8274bf15317794d171a2e82d9dc663c229807e603ecc661dbe70d61bd23d0c37c4 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.53.1, @typescript-eslint/utils@npm:^8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/utils@npm:8.53.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.53.1" + "@typescript-eslint/types": "npm:8.53.1" + "@typescript-eslint/typescript-estree": "npm:8.53.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/9a2a11c00b97eb9a053782e303cc384649807779e9adeb0b645bc198c83f54431f7ca56d4b38411dcf7ed06a2c2d9aa129874c20c037de2393a4cd0fa3b93c25 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^8.32.1": + version: 8.53.0 + resolution: "@typescript-eslint/utils@npm:8.53.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.53.0" + "@typescript-eslint/types": "npm:8.53.0" + "@typescript-eslint/typescript-estree": "npm:8.53.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/6af761fc5ed89606bd8dd1abf7c526afe0060c115035a4fcddfa173ba8a01b7422edf84bc4d74aab2a086911db57a893a2753b3c025ace3e86adc1c2259a6253 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:^8.51.0": + version: 8.52.0 + resolution: "@typescript-eslint/utils@npm:8.52.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.9.1" + "@typescript-eslint/scope-manager": "npm:8.52.0" + "@typescript-eslint/types": "npm:8.52.0" + "@typescript-eslint/typescript-estree": "npm:8.52.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 10c0/67e501e8ef4c4a5510237e3bfcfee37512137075a18c24f615924559bcca64ce9903118e7e4288cd4f58361979243f457d43684cdafa6c193fa8963a7431d0f3 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.52.0" + dependencies: + "@typescript-eslint/types": "npm:8.52.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/7163735d872df0930301ecccd454602d241a65223b84ff3ef78ede02f27941c0cbb95d0c8b4fe51637d1fbd981e6558d454fc485a2488d7190e264e12a8a355f + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.53.0": + version: 8.53.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.53.0" + dependencies: + "@typescript-eslint/types": "npm:8.53.0" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/be2062073c9fd28762f73d442e8536f16e1eab0935df463ed45bd95575b4b79b4a4ca1f45c04b1964dc424b8d25c6489253e3ea2236bb74cff9b7e02e1e7f5be + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.53.1": + version: 8.53.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.53.1" + dependencies: + "@typescript-eslint/types": "npm:8.53.1" + eslint-visitor-keys: "npm:^4.2.1" + checksum: 10c0/73a21d34052bcb0b46ed738f8fddb76ae8f56a0c27932616b49022cf8603c3e36bb6ab30acd709f9bc05c673708180527b4c4aaffcb858acfc66d8fb39cc6c29 + languageName: node + linkType: hard + +"@typescript/vfs@npm:^1.5.2": + version: 1.6.1 + resolution: "@typescript/vfs@npm:1.6.1" + dependencies: + debug: "npm:^4.1.1" + peerDependencies: + typescript: "*" + checksum: 10c0/3878686aff4bf26813dad9242aa8e01c5c9734f4d37f31035f93e9c8b850f15ec6a4480f04cf3a3a1cbf78a4e796ae1be5d6c54f7f7c91556eafee913a8d0da4 + languageName: node + linkType: hard + +"@typespec/ts-http-runtime@npm:^0.3.0": + version: 0.3.0 + resolution: "@typespec/ts-http-runtime@npm:0.3.0" + dependencies: + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.0" + tslib: "npm:^2.6.2" + checksum: 10c0/fe6121ce9015d32a38755244ecabd7f44ff7e40cc07a5656e84d19a0ea8a644a67b49804c5e851ad768d774194221accf8388ac834e1f9f1e148a03c054355dd + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.0.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm-eabi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.11.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.11.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.11.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.11.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1" + conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.52.0": - version: 8.52.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.52.0" - dependencies: - "@typescript-eslint/types": "npm:8.52.0" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/7163735d872df0930301ecccd454602d241a65223b84ff3ef78ede02f27941c0cbb95d0c8b4fe51637d1fbd981e6558d454fc485a2488d7190e264e12a8a355f +"@unrs/resolver-binding-linux-x64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.11.1" + conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.53.0": - version: 8.53.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.53.0" +"@unrs/resolver-binding-wasm32-wasi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.11.1" dependencies: - "@typescript-eslint/types": "npm:8.53.0" - eslint-visitor-keys: "npm:^4.2.1" - checksum: 10c0/be2062073c9fd28762f73d442e8536f16e1eab0935df463ed45bd95575b4b79b4a4ca1f45c04b1964dc424b8d25c6489253e3ea2236bb74cff9b7e02e1e7f5be + "@napi-rs/wasm-runtime": "npm:^0.2.11" + conditions: cpu=wasm32 languageName: node linkType: hard -"@typescript/vfs@npm:^1.5.2": - version: 1.6.1 - resolution: "@typescript/vfs@npm:1.6.1" - dependencies: - debug: "npm:^4.1.1" - peerDependencies: - typescript: "*" - checksum: 10c0/3878686aff4bf26813dad9242aa8e01c5c9734f4d37f31035f93e9c8b850f15ec6a4480f04cf3a3a1cbf78a4e796ae1be5d6c54f7f7c91556eafee913a8d0da4 +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1" + conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@typespec/ts-http-runtime@npm:^0.3.0": - version: 0.3.0 - resolution: "@typespec/ts-http-runtime@npm:0.3.0" - dependencies: - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.0" - tslib: "npm:^2.6.2" - checksum: 10c0/fe6121ce9015d32a38755244ecabd7f44ff7e40cc07a5656e84d19a0ea8a644a67b49804c5e851ad768d774194221accf8388ac834e1f9f1e148a03c054355dd +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1" + conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.0.0": - version: 1.3.0 - resolution: "@ungap/structured-clone@npm:1.3.0" - checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a +"@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -5953,18 +6526,18 @@ __metadata: linkType: hard "@vitejs/plugin-react@npm:^5.1.0": - version: 5.1.2 - resolution: "@vitejs/plugin-react@npm:5.1.2" + version: 5.1.1 + resolution: "@vitejs/plugin-react@npm:5.1.1" dependencies: "@babel/core": "npm:^7.28.5" "@babel/plugin-transform-react-jsx-self": "npm:^7.27.1" "@babel/plugin-transform-react-jsx-source": "npm:^7.27.1" - "@rolldown/pluginutils": "npm:1.0.0-beta.53" + "@rolldown/pluginutils": "npm:1.0.0-beta.47" "@types/babel__core": "npm:^7.20.5" react-refresh: "npm:^0.18.0" peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/d788f269cdf7474425071ba7c4ea7013f174ddaef12b758defe809a551a03ac62a4a80cd858872deb618e7936ccc7cffe178bc12b62e9c836a467e13f15b9390 + checksum: 10c0/e590efaea1eabfbb1beb6e8c9fac0742fd299808e3368e63b2825ce24740adb8a28fcb2668b14b7ca1bdb42890cfefe94d02dd358dcbbf8a27ddf377b9a82abf languageName: node linkType: hard @@ -5978,29 +6551,29 @@ __metadata: languageName: node linkType: hard -"@vitest/browser-playwright@npm:^4.0.4": - version: 4.0.17 - resolution: "@vitest/browser-playwright@npm:4.0.17" +"@vitest/browser-playwright@npm:^4.0.18": + version: 4.0.18 + resolution: "@vitest/browser-playwright@npm:4.0.18" dependencies: - "@vitest/browser": "npm:4.0.17" - "@vitest/mocker": "npm:4.0.17" + "@vitest/browser": "npm:4.0.18" + "@vitest/mocker": "npm:4.0.18" tinyrainbow: "npm:^3.0.3" peerDependencies: playwright: "*" - vitest: 4.0.17 + vitest: 4.0.18 peerDependenciesMeta: playwright: optional: false - checksum: 10c0/c05da663d06d5c5f164ea14cd46cf6fa6a4d5e4b1d2bb1319be330a40ea48573783f0ee908f15b4ebe1ff9f254283e58949cb2c11b53db65307fa2f4f5551f45 + checksum: 10c0/505fafe6f957d020b74914ed328de57cba0be65ff82810da85297523776a0d7389669660e58734a416fc09ce262632b4d2cf257a9e8ab1115b695d133bba7bb5 languageName: node linkType: hard -"@vitest/browser@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/browser@npm:4.0.17" +"@vitest/browser@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/browser@npm:4.0.18" dependencies: - "@vitest/mocker": "npm:4.0.17" - "@vitest/utils": "npm:4.0.17" + "@vitest/mocker": "npm:4.0.18" + "@vitest/utils": "npm:4.0.18" magic-string: "npm:^0.30.21" pixelmatch: "npm:7.1.0" pngjs: "npm:^7.0.0" @@ -6008,17 +6581,17 @@ __metadata: tinyrainbow: "npm:^3.0.3" ws: "npm:^8.18.3" peerDependencies: - vitest: 4.0.17 - checksum: 10c0/f2abda1073403ad00d16b8eba4646e618ef6c12e9882849817c4a9443f19f6f5ea73352736d77519aa468db235d055415780f16b2ca1ba77eaf44da271a9a17f + vitest: 4.0.18 + checksum: 10c0/6b7bda92fa2e8c68de3e51c97322161484c3f1dd7a7417cdeabb4f1d98eab7dba96c156ac4282ea537c58d55cc0e5959abb4b9d90d3823b3cc3071c3f7460633 languageName: node linkType: hard -"@vitest/coverage-v8@npm:^4.0.4": - version: 4.0.17 - resolution: "@vitest/coverage-v8@npm:4.0.17" +"@vitest/coverage-v8@npm:^4.0.18": + version: 4.0.18 + resolution: "@vitest/coverage-v8@npm:4.0.18" dependencies: "@bcoe/v8-coverage": "npm:^1.0.2" - "@vitest/utils": "npm:4.0.17" + "@vitest/utils": "npm:4.0.18" ast-v8-to-istanbul: "npm:^0.3.10" istanbul-lib-coverage: "npm:^3.2.2" istanbul-lib-report: "npm:^3.0.1" @@ -6028,16 +6601,16 @@ __metadata: std-env: "npm:^3.10.0" tinyrainbow: "npm:^3.0.3" peerDependencies: - "@vitest/browser": 4.0.17 - vitest: 4.0.17 + "@vitest/browser": 4.0.18 + vitest: 4.0.18 peerDependenciesMeta: "@vitest/browser": optional: true - checksum: 10c0/a7120ec1446f4a7a3d0d1c2963a406ec281e99a2c7d163725de0a7ad166d9b996f00a14f8386da09bc3fde0441356e4fb9f3ff99e3cb5a3e8d09ddc8c076cf42 + checksum: 10c0/e23e0da86f0b2a020c51562bc40ebdc7fc7553c24f8071dfb39a6df0161badbd5eaf2eebbf8ceaef18933a18c1934ff52d1c0c4bde77bb87e0c1feb0c8cbee4d languageName: node linkType: hard -"@vitest/eslint-plugin@npm:^1.3.4": +"@vitest/eslint-plugin@npm:^1.6.6": version: 1.6.6 resolution: "@vitest/eslint-plugin@npm:1.6.6" dependencies: @@ -6056,25 +6629,25 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/expect@npm:4.0.17" +"@vitest/expect@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/expect@npm:4.0.18" dependencies: "@standard-schema/spec": "npm:^1.0.0" "@types/chai": "npm:^5.2.2" - "@vitest/spy": "npm:4.0.17" - "@vitest/utils": "npm:4.0.17" + "@vitest/spy": "npm:4.0.18" + "@vitest/utils": "npm:4.0.18" chai: "npm:^6.2.1" tinyrainbow: "npm:^3.0.3" - checksum: 10c0/cdaa6827aa3a9473d51fd0944bcd698a94507929fa3c98b00bbdb74342319ec04279f01108d7d2dd7cbcd0d8062f65a3f21bb3615c0d5223e61adcc036c8b370 + checksum: 10c0/123b0aa111682e82ec5289186df18037b1a1768700e468ee0f9879709aaa320cf790463c15c0d8ee10df92b402f4394baf5d27797e604d78e674766d87bcaadc languageName: node linkType: hard -"@vitest/mocker@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/mocker@npm:4.0.17" +"@vitest/mocker@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/mocker@npm:4.0.18" dependencies: - "@vitest/spy": "npm:4.0.17" + "@vitest/spy": "npm:4.0.18" estree-walker: "npm:^3.0.3" magic-string: "npm:^0.30.21" peerDependencies: @@ -6085,54 +6658,54 @@ __metadata: optional: true vite: optional: true - checksum: 10c0/54e657fa5b79764926b15aac993528bfe7083f6731209253617b1f27d328aa3297fcbf96b67e84d1a5632553231f795585f2396f563837cf117a574c87f5cef7 + checksum: 10c0/fb0a257e7e167759d4ad228d53fa7bad2267586459c4a62188f2043dd7163b4b02e1e496dc3c227837f776e7d73d6c4343613e89e7da379d9d30de8260f1ee4b languageName: node linkType: hard -"@vitest/pretty-format@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/pretty-format@npm:4.0.17" +"@vitest/pretty-format@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/pretty-format@npm:4.0.18" dependencies: tinyrainbow: "npm:^3.0.3" - checksum: 10c0/10a2dd7e2daf7ee006107d380bbd28b66b09a7014d31087daab0dea7dee0d12868cfcf6b3372729268502fd9065162345b68b9b9c5d225f5c6c2fd2c664a2a86 + checksum: 10c0/0086b8c88eeca896d8e4b98fcdef452c8041a1b63eb9e85d3e0bcc96c8aa76d8e9e0b6990ebb0bb0a697c4ebab347e7735888b24f507dbff2742ddce7723fd94 languageName: node linkType: hard -"@vitest/runner@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/runner@npm:4.0.17" +"@vitest/runner@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/runner@npm:4.0.18" dependencies: - "@vitest/utils": "npm:4.0.17" + "@vitest/utils": "npm:4.0.18" pathe: "npm:^2.0.3" - checksum: 10c0/f4ccc236d1ed5ba2186d5f36ff0306d4ac7b711a40d7316ad6fd71c0f7229482b19969a8737e87670f3d4efb08f2138ff5b47a744fd7ae8db6c03cf991293a04 + checksum: 10c0/fdb4afa411475133c05ba266c8092eaf1e56cbd5fb601f92ec6ccb9bab7ca52e06733ee8626599355cba4ee71cb3a8f28c84d3b69dc972e41047edc50229bc01 languageName: node linkType: hard -"@vitest/snapshot@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/snapshot@npm:4.0.17" +"@vitest/snapshot@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/snapshot@npm:4.0.18" dependencies: - "@vitest/pretty-format": "npm:4.0.17" + "@vitest/pretty-format": "npm:4.0.18" magic-string: "npm:^0.30.21" pathe: "npm:^2.0.3" - checksum: 10c0/31a047a097b13eff6c0f5393ea3e7203771ae9a22afe6465cd9023fd2ed516ddccd84523d48504a032c9d04a86a12e3f1235e08bb2ffc7d7a125e372c41ef53d + checksum: 10c0/d3bfefa558db9a69a66886ace6575eb96903a5ba59f4d9a5d0fecb4acc2bb8dbb443ef409f5ac1475f2e1add30bd1d71280f98912da35e89c75829df9e84ea43 languageName: node linkType: hard -"@vitest/spy@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/spy@npm:4.0.17" - checksum: 10c0/c290731ba3392f11eaba8fc7fa08063a3a4d14af6baeec210b260ccd5a46613196fb4a8ff3ac8bf91a9606aef90eee9b6364bda130ce71abff368e35dfe2b265 +"@vitest/spy@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/spy@npm:4.0.18" + checksum: 10c0/6de537890b3994fcadb8e8d8ac05942320ae184f071ec395d978a5fba7fa928cbb0c5de85af86a1c165706c466e840de8779eaff8c93450c511c7abaeb9b8a4e languageName: node linkType: hard -"@vitest/utils@npm:4.0.17": - version: 4.0.17 - resolution: "@vitest/utils@npm:4.0.17" +"@vitest/utils@npm:4.0.18": + version: 4.0.18 + resolution: "@vitest/utils@npm:4.0.18" dependencies: - "@vitest/pretty-format": "npm:4.0.17" + "@vitest/pretty-format": "npm:4.0.18" tinyrainbow: "npm:^3.0.3" - checksum: 10c0/1e2e4d7d7709ec022f603a1e12015523a2290f326c0bbe0c6bd5481ec396d4efc6bf8c738d601915d88e74267e9841df1e05157edced10f5048865204aeb86ff + checksum: 10c0/4a3c43c1421eb90f38576926496f6c80056167ba111e63f77cf118983902673737a1a38880b890d7c06ec0a12475024587344ee502b3c43093781533022f2aeb languageName: node linkType: hard @@ -6477,9 +7050,9 @@ __metadata: linkType: hard "ace-builds@npm:^1.25.1, ace-builds@npm:^1.4.14": - version: 1.43.5 - resolution: "ace-builds@npm:1.43.5" - checksum: 10c0/ee155b912e177bc37ba619979be08730ed5ed142f5bd6a3ca9ee6359685e5372b6a646625b7a1c2ce31b44ce3b7c0d6a47af3e18c4db1b75e1d892bffc5c3038 + version: 1.41.0 + resolution: "ace-builds@npm:1.41.0" + checksum: 10c0/9473ee03c6dea43793fd431f6bfeb1381f1efeb82949e69432c7aea9fe32004067c0dfe837a395a0bc7c9ab61d61aab3a0e136c2bde1cdb808283718eefee603 languageName: node linkType: hard @@ -6521,6 +7094,15 @@ __metadata: languageName: node linkType: hard +"acorn-typescript@npm:^1.4.13": + version: 1.4.13 + resolution: "acorn-typescript@npm:1.4.13" + peerDependencies: + acorn: ">=8.9.0" + checksum: 10c0/f2f17cf03379d63beeb007f0feea02cebbd9af261f6b5619ea7345b177bd7a5f99752927cbf652baa3fc97962ae4561592093ab0a1c3e00ca4f354ba23c557ae + languageName: node + linkType: hard + "acorn-walk@npm:^8.0.0": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" @@ -6603,13 +7185,6 @@ __metadata: languageName: node linkType: hard -"ansi-regex@npm:^6.2.2": - version: 6.2.2 - resolution: "ansi-regex@npm:6.2.2" - checksum: 10c0/05d4acb1d2f59ab2cf4b794339c7b168890d44dda4bf0ce01152a8da0213aca207802f930442ce8cd22d7a92f44907664aac6508904e75e038fa944d2601b30f - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -7822,14 +8397,14 @@ __metadata: languageName: node linkType: hard -"comment-json@npm:^4.5.1": - version: 4.5.1 - resolution: "comment-json@npm:4.5.1" +"comment-json@npm:^4.4.1": + version: 4.4.1 + resolution: "comment-json@npm:4.4.1" dependencies: array-timsort: "npm:^1.0.3" core-util-is: "npm:^1.0.3" esprima: "npm:^4.0.1" - checksum: 10c0/aea59becb413fef2d21ec8f3d58b0dd024c47901c5f77c8436b19cc17f9ead0841b2f40d7a87a9b4061b8c048cd10c3c502e512eb8756ffc9aa58915ba5e4482 + checksum: 10c0/be6a197132543a3c286c725af412d582882c1eaf450cb124e4148e7542449f216aa717e7be81989f8b8cfe3e38a6f9bc06d209351b8ea82514cafc8feec11a2d languageName: node linkType: hard @@ -8109,94 +8684,94 @@ __metadata: languageName: node linkType: hard -"cspell-config-lib@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-config-lib@npm:9.6.0" +"cspell-config-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-config-lib@npm:9.3.1" dependencies: - "@cspell/cspell-types": "npm:9.6.0" - comment-json: "npm:^4.5.1" - smol-toml: "npm:^1.6.0" - yaml: "npm:^2.8.2" - checksum: 10c0/89d9dddaaf28fc01d1efba208d618aaf7036779f49b1e2a981e1154de66f895cb243c41b4657a631633780906dfa6a9ef579fadcee8050d8fa510c77efd5970a + "@cspell/cspell-types": "npm:9.3.1" + comment-json: "npm:^4.4.1" + smol-toml: "npm:^1.4.2" + yaml: "npm:^2.8.1" + checksum: 10c0/4f3f4f4837a10a378778b4e5a1e930aad94be70072cff2d6c59d4025549354a85ea51253de472ff36da8b8fa75cb23e4c01bbab1ee8274d98cc1b3a32a2b8866 languageName: node linkType: hard -"cspell-dictionary@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-dictionary@npm:9.6.0" +"cspell-dictionary@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-dictionary@npm:9.3.1" dependencies: - "@cspell/cspell-pipe": "npm:9.6.0" - "@cspell/cspell-types": "npm:9.6.0" - cspell-trie-lib: "npm:9.6.0" - fast-equals: "npm:^6.0.0" - checksum: 10c0/46f1cc1d156cb9350e96386d8ed72b63c7c35b58352747d78738f5d7e006f4fcbc77ee307d58a8482a267d6dbad97a1020b83245ea1d8297297b7390590215e2 + "@cspell/cspell-pipe": "npm:9.3.1" + "@cspell/cspell-types": "npm:9.3.1" + cspell-trie-lib: "npm:9.3.1" + fast-equals: "npm:^5.3.2" + checksum: 10c0/03cf75a456791c7c54a52cd281ee01d50c0d1237635655115468153e4a35713b7ce9189dd908d0436f30a29a17c03703c90b34ed0493befbe8e62679fcb37c4a languageName: node linkType: hard -"cspell-gitignore@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-gitignore@npm:9.6.0" +"cspell-gitignore@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-gitignore@npm:9.3.1" dependencies: - "@cspell/url": "npm:9.6.0" - cspell-glob: "npm:9.6.0" - cspell-io: "npm:9.6.0" + "@cspell/url": "npm:9.3.1" + cspell-glob: "npm:9.3.1" + cspell-io: "npm:9.3.1" bin: cspell-gitignore: bin.mjs - checksum: 10c0/cc81bad3fb05e28d5d9f7f276d1819d25aed847ab729c083ef39abdae90389ae63fd9f840f737e9a771e282ed10debfc4db995e94b917c91061f9b8bafaed912 + checksum: 10c0/a9bf15690e988095deb0e030e6070235567d0337d3c770e5cb1bf7e69581f5120901c367b805bdf7511a3a5ae6acffe266f13395f48e1aacf361d43c93d276b7 languageName: node linkType: hard -"cspell-glob@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-glob@npm:9.6.0" +"cspell-glob@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-glob@npm:9.3.1" dependencies: - "@cspell/url": "npm:9.6.0" + "@cspell/url": "npm:9.3.1" picomatch: "npm:^4.0.3" - checksum: 10c0/76c2f8c300dfa55b613669a00e8780537c6c719b3d3a8fbcc5da19ba036c3916cf0d6e7deb966f4d3c4738d0d3a04b689466f0657e059a63c631746c6c709e36 + checksum: 10c0/37df1c34f1fb6c3a16d29a0b1833ac6f168408fbf6478f962db049dde515e8ad639e005b30fd75d8ffe208b392d4f6b112c81519575612a95d41c3f20d8c442f languageName: node linkType: hard -"cspell-grammar@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-grammar@npm:9.6.0" +"cspell-grammar@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-grammar@npm:9.3.1" dependencies: - "@cspell/cspell-pipe": "npm:9.6.0" - "@cspell/cspell-types": "npm:9.6.0" + "@cspell/cspell-pipe": "npm:9.3.1" + "@cspell/cspell-types": "npm:9.3.1" bin: cspell-grammar: bin.mjs - checksum: 10c0/75658330b5f9ba4822457949f0c2bc6dd1e5470dbbf93a7f0c45e8dbc786b3f862a325a0840d51f3e1170cfb5fb3cc0490893bdec5b2261efa713a3e0e20d8b8 + checksum: 10c0/e4e4bb1b8effff50032cb5f0407e1f9f666b4b5502520e49070ed00a9bfd1e863033212ef0523a5898ebc9761133b100592f1d2ec200169326e52409c69b827a languageName: node linkType: hard -"cspell-io@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-io@npm:9.6.0" +"cspell-io@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-io@npm:9.3.1" dependencies: - "@cspell/cspell-service-bus": "npm:9.6.0" - "@cspell/url": "npm:9.6.0" - checksum: 10c0/b20c3b5bb9f0d16abcd96f090730986fcabc9baf9be72c921eb11102b88d3ab6031f0bd23c891227be97113178432604cb06e9107da355b24e7ff00bfba76f5f + "@cspell/cspell-service-bus": "npm:9.3.1" + "@cspell/url": "npm:9.3.1" + checksum: 10c0/a4b709bc0ad7f489e33e07a946c7947794bc5b21318c85e0ee1763ef5086c7eca93b9ca276572309b478c7470e8697607542eb2fe46135218783d9c4262de93f languageName: node linkType: hard -"cspell-lib@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-lib@npm:9.6.0" +"cspell-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-lib@npm:9.3.1" dependencies: - "@cspell/cspell-bundled-dicts": "npm:9.6.0" - "@cspell/cspell-pipe": "npm:9.6.0" - "@cspell/cspell-resolver": "npm:9.6.0" - "@cspell/cspell-types": "npm:9.6.0" - "@cspell/dynamic-import": "npm:9.6.0" - "@cspell/filetypes": "npm:9.6.0" - "@cspell/strong-weak-map": "npm:9.6.0" - "@cspell/url": "npm:9.6.0" + "@cspell/cspell-bundled-dicts": "npm:9.3.1" + "@cspell/cspell-pipe": "npm:9.3.1" + "@cspell/cspell-resolver": "npm:9.3.1" + "@cspell/cspell-types": "npm:9.3.1" + "@cspell/dynamic-import": "npm:9.3.1" + "@cspell/filetypes": "npm:9.3.1" + "@cspell/strong-weak-map": "npm:9.3.1" + "@cspell/url": "npm:9.3.1" clear-module: "npm:^4.1.2" - cspell-config-lib: "npm:9.6.0" - cspell-dictionary: "npm:9.6.0" - cspell-glob: "npm:9.6.0" - cspell-grammar: "npm:9.6.0" - cspell-io: "npm:9.6.0" - cspell-trie-lib: "npm:9.6.0" + cspell-config-lib: "npm:9.3.1" + cspell-dictionary: "npm:9.3.1" + cspell-glob: "npm:9.3.1" + cspell-grammar: "npm:9.3.1" + cspell-io: "npm:9.3.1" + cspell-trie-lib: "npm:9.3.1" env-paths: "npm:^3.0.0" gensequence: "npm:^8.0.8" import-fresh: "npm:^3.3.1" @@ -8204,38 +8779,39 @@ __metadata: vscode-languageserver-textdocument: "npm:^1.0.12" vscode-uri: "npm:^3.1.0" xdg-basedir: "npm:^5.1.0" - checksum: 10c0/70656af8f0c6e90974374173d417ea1a849ec4630c4bf12fc0f214649d809b98e53ae16ba144e4349333ee432b2cdb91d57b48f9633fda9bea165782d69452dc + checksum: 10c0/22e6e1e71a0322a5c70d7ca2039fa55c2e65508309885e8442671bdd072944913901e60afd50bcd4a4f7679697b5986b0e4eed6bb60611728fc9d07486cfbd67 languageName: node linkType: hard -"cspell-trie-lib@npm:9.6.0": - version: 9.6.0 - resolution: "cspell-trie-lib@npm:9.6.0" - peerDependencies: - "@cspell/cspell-types": 9.6.0 - checksum: 10c0/d0bc09f5853186767dfe4be1f4383caf2a88c9b607f6b5b469991ee0e43aafb022d918c51b721fc4660fb9317e64d11af1f2fed295b78658842bdfc48b193911 +"cspell-trie-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-trie-lib@npm:9.3.1" + dependencies: + "@cspell/cspell-pipe": "npm:9.3.1" + "@cspell/cspell-types": "npm:9.3.1" + gensequence: "npm:^8.0.8" + checksum: 10c0/f43b2af1a04d8aeb97a3df465e34d7aa23e2ada1e7666691ba969c55a3f99148d841f6a9eeed2b86b7b4b05c0a885bf1c9ec197dec8925326749b478ea11f091 languageName: node linkType: hard "cspell@npm:^9.2.1": - version: 9.6.0 - resolution: "cspell@npm:9.6.0" - dependencies: - "@cspell/cspell-json-reporter": "npm:9.6.0" - "@cspell/cspell-pipe": "npm:9.6.0" - "@cspell/cspell-types": "npm:9.6.0" - "@cspell/dynamic-import": "npm:9.6.0" - "@cspell/url": "npm:9.6.0" - ansi-regex: "npm:^6.2.2" + version: 9.3.1 + resolution: "cspell@npm:9.3.1" + dependencies: + "@cspell/cspell-json-reporter": "npm:9.3.1" + "@cspell/cspell-pipe": "npm:9.3.1" + "@cspell/cspell-types": "npm:9.3.1" + "@cspell/dynamic-import": "npm:9.3.1" + "@cspell/url": "npm:9.3.1" chalk: "npm:^5.6.2" chalk-template: "npm:^1.1.2" commander: "npm:^14.0.2" - cspell-config-lib: "npm:9.6.0" - cspell-dictionary: "npm:9.6.0" - cspell-gitignore: "npm:9.6.0" - cspell-glob: "npm:9.6.0" - cspell-io: "npm:9.6.0" - cspell-lib: "npm:9.6.0" + cspell-config-lib: "npm:9.3.1" + cspell-dictionary: "npm:9.3.1" + cspell-gitignore: "npm:9.3.1" + cspell-glob: "npm:9.3.1" + cspell-io: "npm:9.3.1" + cspell-lib: "npm:9.3.1" fast-json-stable-stringify: "npm:^2.1.0" flatted: "npm:^3.3.3" semver: "npm:^7.7.3" @@ -8243,7 +8819,7 @@ __metadata: bin: cspell: bin.mjs cspell-esm: bin.mjs - checksum: 10c0/ddc585c2480c1fff7a58347ad14a70fc5490fefd1be95e8344b8370cb7de757b14076b2f673e52f6bce6b23fd78f8fe43a2cd364ca91b9fdc64f35982d22fb46 + checksum: 10c0/15cd54a26ed868fcfb7b672a4305bd04bec18077a71fb039c756194ee324592d32e889616636d050aa45858d221fdac1e1f991114a7ecd0236fb58a4b97cd92d languageName: node linkType: hard @@ -8264,13 +8840,6 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.2.2": - version: 3.2.3 - resolution: "csstype@npm:3.2.3" - checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce - languageName: node - linkType: hard - "cytoscape-cose-bilkent@npm:^4.1.0": version: 4.1.0 resolution: "cytoscape-cose-bilkent@npm:4.1.0" @@ -9474,36 +10043,122 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.25.0": + version: 0.25.4 + resolution: "esbuild@npm:0.25.4" + dependencies: + "@esbuild/aix-ppc64": "npm:0.25.4" + "@esbuild/android-arm": "npm:0.25.4" + "@esbuild/android-arm64": "npm:0.25.4" + "@esbuild/android-x64": "npm:0.25.4" + "@esbuild/darwin-arm64": "npm:0.25.4" + "@esbuild/darwin-x64": "npm:0.25.4" + "@esbuild/freebsd-arm64": "npm:0.25.4" + "@esbuild/freebsd-x64": "npm:0.25.4" + "@esbuild/linux-arm": "npm:0.25.4" + "@esbuild/linux-arm64": "npm:0.25.4" + "@esbuild/linux-ia32": "npm:0.25.4" + "@esbuild/linux-loong64": "npm:0.25.4" + "@esbuild/linux-mips64el": "npm:0.25.4" + "@esbuild/linux-ppc64": "npm:0.25.4" + "@esbuild/linux-riscv64": "npm:0.25.4" + "@esbuild/linux-s390x": "npm:0.25.4" + "@esbuild/linux-x64": "npm:0.25.4" + "@esbuild/netbsd-arm64": "npm:0.25.4" + "@esbuild/netbsd-x64": "npm:0.25.4" + "@esbuild/openbsd-arm64": "npm:0.25.4" + "@esbuild/openbsd-x64": "npm:0.25.4" + "@esbuild/sunos-x64": "npm:0.25.4" + "@esbuild/win32-arm64": "npm:0.25.4" + "@esbuild/win32-ia32": "npm:0.25.4" + "@esbuild/win32-x64": "npm:0.25.4" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10c0/db9f51248f0560bc46ab219461d338047617f6caf373c95f643b204760bdfa10c95b48cfde948949f7e509599ae4ab61c3f112092a3534936c6abfb800c565b0 + languageName: node + linkType: hard + "esbuild@npm:^0.27.0": - version: 0.27.2 - resolution: "esbuild@npm:0.27.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.27.2" - "@esbuild/android-arm": "npm:0.27.2" - "@esbuild/android-arm64": "npm:0.27.2" - "@esbuild/android-x64": "npm:0.27.2" - "@esbuild/darwin-arm64": "npm:0.27.2" - "@esbuild/darwin-x64": "npm:0.27.2" - "@esbuild/freebsd-arm64": "npm:0.27.2" - "@esbuild/freebsd-x64": "npm:0.27.2" - "@esbuild/linux-arm": "npm:0.27.2" - "@esbuild/linux-arm64": "npm:0.27.2" - "@esbuild/linux-ia32": "npm:0.27.2" - "@esbuild/linux-loong64": "npm:0.27.2" - "@esbuild/linux-mips64el": "npm:0.27.2" - "@esbuild/linux-ppc64": "npm:0.27.2" - "@esbuild/linux-riscv64": "npm:0.27.2" - "@esbuild/linux-s390x": "npm:0.27.2" - "@esbuild/linux-x64": "npm:0.27.2" - "@esbuild/netbsd-arm64": "npm:0.27.2" - "@esbuild/netbsd-x64": "npm:0.27.2" - "@esbuild/openbsd-arm64": "npm:0.27.2" - "@esbuild/openbsd-x64": "npm:0.27.2" - "@esbuild/openharmony-arm64": "npm:0.27.2" - "@esbuild/sunos-x64": "npm:0.27.2" - "@esbuild/win32-arm64": "npm:0.27.2" - "@esbuild/win32-ia32": "npm:0.27.2" - "@esbuild/win32-x64": "npm:0.27.2" + version: 0.27.0 + resolution: "esbuild@npm:0.27.0" + dependencies: + "@esbuild/aix-ppc64": "npm:0.27.0" + "@esbuild/android-arm": "npm:0.27.0" + "@esbuild/android-arm64": "npm:0.27.0" + "@esbuild/android-x64": "npm:0.27.0" + "@esbuild/darwin-arm64": "npm:0.27.0" + "@esbuild/darwin-x64": "npm:0.27.0" + "@esbuild/freebsd-arm64": "npm:0.27.0" + "@esbuild/freebsd-x64": "npm:0.27.0" + "@esbuild/linux-arm": "npm:0.27.0" + "@esbuild/linux-arm64": "npm:0.27.0" + "@esbuild/linux-ia32": "npm:0.27.0" + "@esbuild/linux-loong64": "npm:0.27.0" + "@esbuild/linux-mips64el": "npm:0.27.0" + "@esbuild/linux-ppc64": "npm:0.27.0" + "@esbuild/linux-riscv64": "npm:0.27.0" + "@esbuild/linux-s390x": "npm:0.27.0" + "@esbuild/linux-x64": "npm:0.27.0" + "@esbuild/netbsd-arm64": "npm:0.27.0" + "@esbuild/netbsd-x64": "npm:0.27.0" + "@esbuild/openbsd-arm64": "npm:0.27.0" + "@esbuild/openbsd-x64": "npm:0.27.0" + "@esbuild/openharmony-arm64": "npm:0.27.0" + "@esbuild/sunos-x64": "npm:0.27.0" + "@esbuild/win32-arm64": "npm:0.27.0" + "@esbuild/win32-ia32": "npm:0.27.0" + "@esbuild/win32-x64": "npm:0.27.0" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -9559,7 +10214,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10c0/cf83f626f55500f521d5fe7f4bc5871bec240d3deb2a01fbd379edc43b3664d1167428738a5aad8794b35d1cca985c44c375b1cd38a2ca613c77ced2c83aafcd + checksum: 10c0/a3a1deec285337b7dfe25cbb9aa8765d27a0192b610a8477a39bf5bd907a6bdb75e98898b61fb4337114cfadb13163bd95977db14e241373115f548e235b40a2 languageName: node linkType: hard @@ -9595,6 +10250,21 @@ __metadata: languageName: node linkType: hard +"eslint-import-context@npm:^0.1.8": + version: 0.1.9 + resolution: "eslint-import-context@npm:0.1.9" + dependencies: + get-tsconfig: "npm:^4.10.1" + stable-hash-x: "npm:^0.2.0" + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + checksum: 10c0/07851103443b70af681c5988e2702e681ff9b956e055e11d4bd9b2322847fa0d9e8da50c18fc7cb1165106b043f34fbd0384d7011c239465c4645c52132e56f3 + languageName: node + linkType: hard + "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -9606,6 +10276,30 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-typescript@npm:^4.4.4": + version: 4.4.4 + resolution: "eslint-import-resolver-typescript@npm:4.4.4" + dependencies: + debug: "npm:^4.4.1" + eslint-import-context: "npm:^0.1.8" + get-tsconfig: "npm:^4.10.1" + is-bun-module: "npm:^2.0.0" + stable-hash-x: "npm:^0.2.0" + tinyglobby: "npm:^0.2.14" + unrs-resolver: "npm:^1.7.11" + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 10c0/3bf8ad77c21660f77a0e455555ab179420f68ae7a132906c85a217ccce51cb6680cf70027cab32a358d193e5b9e476f6ba2e595585242aa97d4f6435ca22104e + languageName: node + linkType: hard + "eslint-mdx@npm:^3.6.2": version: 3.6.2 resolution: "eslint-mdx@npm:3.6.2" @@ -9756,8 +10450,8 @@ __metadata: linkType: hard "eslint-plugin-yml@npm:^1.19.0": - version: 1.19.1 - resolution: "eslint-plugin-yml@npm:1.19.1" + version: 1.19.0 + resolution: "eslint-plugin-yml@npm:1.19.0" dependencies: debug: "npm:^4.3.2" diff-sequences: "npm:^27.5.1" @@ -9767,7 +10461,7 @@ __metadata: yaml-eslint-parser: "npm:^1.2.1" peerDependencies: eslint: ">=6.0.0" - checksum: 10c0/c442966b7c3bc091b9973ec167408a509802b039643d7fd2b30d7440b72030dec916741925c58d33b098220b7d73809ac7786d970157e356f3a7eec0f74471b0 + checksum: 10c0/5e418d3e5f847491a143f048b9aece30c0bbb6c2218185bfb24d5be2d31974aa71f92ead4fe5f8c51d356577c5b2c36e26b2406f1baeb501bed86344a4d0f40c languageName: node linkType: hard @@ -9810,8 +10504,8 @@ __metadata: linkType: hard "eslint@npm:^9.35.0": - version: 9.39.2 - resolution: "eslint@npm:9.39.2" + version: 9.39.1 + resolution: "eslint@npm:9.39.1" dependencies: "@eslint-community/eslint-utils": "npm:^4.8.0" "@eslint-community/regexpp": "npm:^4.12.1" @@ -9819,7 +10513,7 @@ __metadata: "@eslint/config-helpers": "npm:^0.4.2" "@eslint/core": "npm:^0.17.0" "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.39.2" + "@eslint/js": "npm:9.39.1" "@eslint/plugin-kit": "npm:^0.4.1" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -9854,7 +10548,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/bb88ca8fd16bb7e1ac3e13804c54d41c583214460c0faa7b3e7c574e69c5600c7122295500fb4b0c06067831111db740931e98da1340329527658e1cf80073d3 + checksum: 10c0/59b2480639404ba24578ca480f973683b87b7aac8aa7e349240474a39067804fd13cd8b9cb22fee074170b8c7c563b57bab703ec0f0d3f81ea017e5d2cad299d languageName: node linkType: hard @@ -10141,10 +10835,10 @@ __metadata: languageName: node linkType: hard -"fast-equals@npm:^6.0.0": - version: 6.0.0 - resolution: "fast-equals@npm:6.0.0" - checksum: 10c0/aae54699ce848726679a947c8bbea78f2ea0384e4e1ee213c98f10881a17bb376bd11085eda4d6c89db5285635ee2f809b126d773532fcf602be355008a9d5ed +"fast-equals@npm:^5.3.2": + version: 5.3.3 + resolution: "fast-equals@npm:5.3.3" + checksum: 10c0/a186cbfe4d9171911af9c6bb02d059e28bc177f66527790bf95d35a08f6f070033caea5755d2bbf2ce7af56374c1d4d854ee8184f9e906e3e01b54dbd09c414c languageName: node linkType: hard @@ -10183,13 +10877,13 @@ __metadata: linkType: hard "fast-xml-parser@npm:^5.0.7": - version: 5.3.4 - resolution: "fast-xml-parser@npm:5.3.4" + version: 5.2.5 + resolution: "fast-xml-parser@npm:5.2.5" dependencies: strnum: "npm:^2.1.0" bin: fxparser: src/cli/cli.js - checksum: 10c0/d77866ca860ad185153e12f6ba12274d32026319ad8064e4681342b8a8e1ffad3f1f98daf04d77239fb12eb1d906ee7185fd328deda74529680e8dae0f3e9327 + checksum: 10c0/d1057d2e790c327ccfc42b872b91786a4912a152d44f9507bf053f800102dfb07ece3da0a86b33ff6a0caa5a5cad86da3326744f6ae5efb0c6c571d754fe48cd languageName: node linkType: hard @@ -10571,6 +11265,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.10.1": + version: 4.13.0 + resolution: "get-tsconfig@npm:4.13.0" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 10c0/2c49ef8d3907047a107f229fd610386fe3b7fe9e42dfd6b42e7406499493cdda8c62e83e57e8d7a98125610774b9f604d3a0ff308d7f9de5c7ac6d1b07cb6036 + languageName: node + linkType: hard + "get-value@npm:^2.0.3, get-value@npm:^2.0.6": version: 2.0.6 resolution: "get-value@npm:2.0.6" @@ -10899,7 +11602,7 @@ __metadata: languageName: node linkType: hard -"hast-util-to-html@npm:^9.0.4": +"hast-util-to-html@npm:^9.0.4, hast-util-to-html@npm:^9.0.5": version: 9.0.5 resolution: "hast-util-to-html@npm:9.0.5" dependencies: @@ -11399,6 +12102,15 @@ __metadata: languageName: node linkType: hard +"is-bun-module@npm:^2.0.0": + version: 2.0.0 + resolution: "is-bun-module@npm:2.0.0" + dependencies: + semver: "npm:^7.7.1" + checksum: 10c0/7d27a0679cfa5be1f5052650391f9b11040cd70c48d45112e312c56bc6b6ca9c9aea70dcce6cc40b1e8947bfff8567a5c5715d3b066fb478522dab46ea379240 + languageName: node + linkType: hard + "is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -11974,7 +12686,7 @@ __metadata: languageName: node linkType: hard -"js-slang@npm:^1.0.81": +"js-slang@npm:^1.0.85": version: 1.0.85 resolution: "js-slang@npm:1.0.85" dependencies: @@ -12140,14 +12852,14 @@ __metadata: linkType: hard "jsonc-eslint-parser@npm:^2.4.0": - version: 2.4.2 - resolution: "jsonc-eslint-parser@npm:2.4.2" + version: 2.4.1 + resolution: "jsonc-eslint-parser@npm:2.4.1" dependencies: acorn: "npm:^8.5.0" eslint-visitor-keys: "npm:^3.0.0" espree: "npm:^9.0.0" semver: "npm:^7.3.5" - checksum: 10c0/821af0231cb8eba2afde34535bd76d723ed5b4b3711fdccff3f300f32de7bbf463ceab3ce2de9e6fd78dc3b24a9c7248ca12eb43e280cfa2695f49bd16908f87 + checksum: 10c0/735bd33435fee002bf7f07d23ba969b994971ab3b333a0e2641b79cd413819fe36540ba6ed29da9ebc69062625e8bfb167ff4415321f9640fdd9d0cf92dfa999 languageName: node linkType: hard @@ -13028,8 +13740,8 @@ __metadata: linkType: hard "mermaid@npm:^11.10.0": - version: 11.12.2 - resolution: "mermaid@npm:11.12.2" + version: 11.12.1 + resolution: "mermaid@npm:11.12.1" dependencies: "@braintree/sanitize-url": "npm:^7.1.1" "@iconify/utils": "npm:^3.0.1" @@ -13051,7 +13763,7 @@ __metadata: stylis: "npm:^4.3.6" ts-dedent: "npm:^2.2.0" uuid: "npm:^11.1.0" - checksum: 10c0/00969b96171f1f11cf897df205d932237a6303041d9519b82bd727cfca43507b54cbf28dfb951aa7ff5e6129607f2297703a464361fc95942db9364c579da9f3 + checksum: 10c0/0dd07a5986bb25ca038f68f7a187a0b6ccf5fa8c738603c3145bd4b6289d50312053818f52617cf575a6652e6c57809ae115c016725f7ce446496be5971a150a languageName: node linkType: hard @@ -13806,18 +14518,6 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.8.0": - version: 1.8.0 - resolution: "mlly@npm:1.8.0" - dependencies: - acorn: "npm:^8.15.0" - pathe: "npm:^2.0.3" - pkg-types: "npm:^1.3.1" - ufo: "npm:^1.6.1" - checksum: 10c0/f174b844ae066c71e9b128046677868e2e28694f0bbeeffbe760b2a9d8ff24de0748d0fde6fabe706700c1d2e11d3c0d7a53071b5ea99671592fac03364604ab - languageName: node - linkType: hard - "mqtt-packet@npm:^6.8.0": version: 6.10.0 resolution: "mqtt-packet@npm:6.10.0" @@ -13914,6 +14614,15 @@ __metadata: languageName: node linkType: hard +"napi-postinstall@npm:^0.3.0": + version: 0.3.4 + resolution: "napi-postinstall@npm:0.3.4" + bin: + napi-postinstall: lib/cli.js + checksum: 10c0/b33d64150828bdade3a5d07368a8b30da22ee393f8dd8432f1b9e5486867be21c84ec443dd875dd3ef3c7401a079a7ab7e2aa9d3538a889abbcd96495d5104fe + languageName: node + linkType: hard + "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" @@ -14339,6 +15048,13 @@ __metadata: languageName: node linkType: hard +"oniguruma-parser@npm:^0.12.1": + version: 0.12.1 + resolution: "oniguruma-parser@npm:0.12.1" + checksum: 10c0/b843ea54cda833efb19f856314afcbd43e903ece3de489ab78c527ddec84859208052557daa9fad4bdba89ebdd15b0cc250de86b3daf8c7cbe37bac5a6a185d3 + languageName: node + linkType: hard + "oniguruma-to-es@npm:^3.1.0": version: 3.1.1 resolution: "oniguruma-to-es@npm:3.1.1" @@ -14350,6 +15066,17 @@ __metadata: languageName: node linkType: hard +"oniguruma-to-es@npm:^4.3.4": + version: 4.3.4 + resolution: "oniguruma-to-es@npm:4.3.4" + dependencies: + oniguruma-parser: "npm:^0.12.1" + regex: "npm:^6.0.1" + regex-recursion: "npm:^6.0.2" + checksum: 10c0/fb58459f50db71c2c4785205636186bfbb125b094c4275512a8f41f123ed3fbf61f37c455f4360ef14a56c693981aecd7da3ae2c05614a222e872c4643b463fc + languageName: node + linkType: hard + "opener@npm:^1.5.1": version: 1.5.2 resolution: "opener@npm:1.5.2" @@ -14492,10 +15219,10 @@ __metadata: languageName: node linkType: hard -"packageurl-js@npm:2.0.1": - version: 2.0.1 - resolution: "packageurl-js@npm:2.0.1" - checksum: 10c0/8a45bc925243bea0fd7f027b54bf7c363ab70dae2b01676d67856eb788352d7344f38b86c8cfa510410220c6848dc57bc152146bf6518fb06c272d3dbe003b55 +"packageurl-js@npm:1.2.0": + version: 1.2.0 + resolution: "packageurl-js@npm:1.2.0" + checksum: 10c0/4ab4f63483e3ae516ec458bc8113d7e86c199698fa66a4b290c039f92415a9d8908a9421155677fe56bc6ba682c5930bf1db432401ad8dbf0a3350a6d92bd3d8 languageName: node linkType: hard @@ -14716,11 +15443,11 @@ __metadata: linkType: hard "phaser@npm:^3.54.0": - version: 3.90.0 - resolution: "phaser@npm:3.90.0" + version: 3.88.2 + resolution: "phaser@npm:3.88.2" dependencies: eventemitter3: "npm:^5.0.1" - checksum: 10c0/43d405832fc84c8641e22842fe8d4ca954950ffde364bfb60e4d07b05a29f33eb0c9d4a64acda088122ee6649b7b3ed6d9b3b99bbb67671a528c6ceb10d71689 + checksum: 10c0/eb583f741aaa42975180c56e3149dfa762de78c9c2d80c74c545f62bcc1ab8e88be84d99d82bef32aa931a79cc2416f92109a076e051d998b3f173595d8e908e languageName: node linkType: hard @@ -14779,7 +15506,7 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.3.0, pkg-types@npm:^1.3.1": +"pkg-types@npm:^1.3.0": version: 1.3.1 resolution: "pkg-types@npm:1.3.1" dependencies: @@ -14801,27 +15528,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.57.0": - version: 1.57.0 - resolution: "playwright-core@npm:1.57.0" +"playwright-core@npm:1.56.1": + version: 1.56.1 + resolution: "playwright-core@npm:1.56.1" bin: playwright-core: cli.js - checksum: 10c0/798e35d83bf48419a8c73de20bb94d68be5dde68de23f95d80a0ebe401e3b83e29e3e84aea7894d67fa6c79d2d3d40cc5bcde3e166f657ce50987aaa2421b6a9 + checksum: 10c0/ffd40142b99c68678b387445d5b42f1fee4ab0b65d983058c37f342e5629f9cdbdac0506ea80a0dfd41a8f9f13345bad54e9a8c35826ef66dc765f4eb3db8da7 languageName: node linkType: hard "playwright@npm:^1.55.1": - version: 1.57.0 - resolution: "playwright@npm:1.57.0" + version: 1.56.1 + resolution: "playwright@npm:1.56.1" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.57.0" + playwright-core: "npm:1.56.1" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/ab03c99a67b835bdea9059f516ad3b6e42c21025f9adaa161a4ef6bc7ca716dcba476d287140bb240d06126eb23f889a8933b8f5f1f1a56b80659d92d1358899 + checksum: 10c0/8e9965aede86df0f4722063385748498977b219630a40a10d1b82b8bd8d4d4e9b6b65ecbfa024331a30800163161aca292fb6dd7446c531a1ad25f4155625ab4 languageName: node linkType: hard @@ -14833,9 +15560,9 @@ __metadata: linkType: hard "plotly.js-dist@npm:^3.0.0": - version: 3.3.1 - resolution: "plotly.js-dist@npm:3.3.1" - checksum: 10c0/8332667bc104a7fa13465f2462cb322c2b445ec4f3e2c522214508bd5eeca6b6471153c9f805e7f8228528a9faf6749fbfbc4f2e4612499397aeff8e928330c4 + version: 3.0.1 + resolution: "plotly.js-dist@npm:3.0.1" + checksum: 10c0/cc5725d043fb052a28952fa8b7f72bbf91cc4460d2742e68f49801fe34cf7164ad0d55fe262da0c2e530ef4541845a030d129aab8d90795987052236bb8372c4 languageName: node linkType: hard @@ -14906,9 +15633,9 @@ __metadata: linkType: hard "preact@npm:^10.0.0": - version: 10.28.2 - resolution: "preact@npm:10.28.2" - checksum: 10c0/eb60bf526eb6971701e6ac9c25236aca451f17f99e9c24704419196989b15bb576ed3101e084b151cd0fb30546b3e5e1ba73b774e8be2f2ed8187db42ec65faf + version: 10.26.9 + resolution: "preact@npm:10.26.9" + checksum: 10c0/15f187e3278ae749b70e887f88bb01be63ebcc2eea46ffa86be69180716db40b8b4304e9768767fd68a5910ef5fd1f9ea6389e17cd25e950be76574d568e8fc3 languageName: node linkType: hard @@ -15038,11 +15765,11 @@ __metadata: linkType: hard "qs@npm:^6.12.3, qs@npm:^6.4.0": - version: 6.14.1 - resolution: "qs@npm:6.14.1" + version: 6.14.0 + resolution: "qs@npm:6.14.0" dependencies: side-channel: "npm:^1.1.0" - checksum: 10c0/0e3b22dc451f48ce5940cbbc7c7d9068d895074f8c969c0801ac15c1313d1859c4d738e46dc4da2f498f41a9ffd8c201bd9fb12df67799b827db94cc373d2613 + checksum: 10c0/8ea5d91bf34f440598ee389d4a7d95820e3b837d3fd9f433871f7924801becaa0cd3b3b4628d49a7784d06a8aea9bc4554d2b6d8d584e2d221dc06238a42909c languageName: node linkType: hard @@ -15211,21 +15938,6 @@ __metadata: languageName: node linkType: hard -"react-uid@npm:^2.3.3": - version: 2.4.0 - resolution: "react-uid@npm:2.4.0" - dependencies: - tslib: "npm:^2.0.0" - peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/5e01e8d3a4144d160af26f7ea8300887ed8379ee14b1fad7979ea755d5bfa4badfdab531cb7d4495488e94083f829bd5b28a8f6661522b11729fceb42dcf73ea - languageName: node - linkType: hard - "react-use-measure@npm:^2.1.7": version: 2.1.7 resolution: "react-use-measure@npm:2.1.7" @@ -15495,6 +16207,13 @@ __metadata: languageName: node linkType: hard +"resolve-pkg-maps@npm:^1.0.0": + version: 1.0.0 + resolution: "resolve-pkg-maps@npm:1.0.0" + checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab + languageName: node + linkType: hard + "resolve-url@npm:^0.2.1": version: 0.2.1 resolution: "resolve-url@npm:0.2.1" @@ -15858,8 +16577,8 @@ __metadata: linkType: hard "sass@npm:^1.85.0": - version: 1.97.2 - resolution: "sass@npm:1.97.2" + version: 1.88.0 + resolution: "sass@npm:1.88.0" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -15870,7 +16589,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/5622a4f9d0acf5cdfb72c73c448366b3ec7bfe2b6e1ecb62c6e9f8eaff9c02a6afd86a31ded246fc818fe660cedea6bd27335e82fc9bd7cce46c29f95774bece + checksum: 10c0/dcb16dc29116bfa5a90485d24fd8020d2b0d95155bd2e31285901588729343b59fefe44365c5f146b2ba5a9ebadef90b23a7220b902507bdbd91ca2ba0a0b688 languageName: node linkType: hard @@ -15950,7 +16669,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.3.8, semver@npm:^7.7.3": +"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.3.8, semver@npm:^7.7.1, semver@npm:^7.7.3": version: 7.7.3 resolution: "semver@npm:7.7.3" bin: @@ -16096,6 +16815,22 @@ __metadata: languageName: node linkType: hard +"shiki@npm:^3.15.0": + version: 3.20.0 + resolution: "shiki@npm:3.20.0" + dependencies: + "@shikijs/core": "npm:3.20.0" + "@shikijs/engine-javascript": "npm:3.20.0" + "@shikijs/engine-oniguruma": "npm:3.20.0" + "@shikijs/langs": "npm:3.20.0" + "@shikijs/themes": "npm:3.20.0" + "@shikijs/types": "npm:3.20.0" + "@shikijs/vscode-textmate": "npm:^10.0.2" + "@types/hast": "npm:^3.0.4" + checksum: 10c0/e7f0a8e6b8748b1d25cccc186e5cd32cbc8b272c08b4b554a3328c95714ee564d5525747d5ceb52c1ee766ec25cb7a5fa1de748edeb6508a57be15433de1564f + languageName: node + linkType: hard + "side-channel-list@npm:^1.0.0": version: 1.0.0 resolution: "side-channel-list@npm:1.0.0" @@ -16197,10 +16932,10 @@ __metadata: languageName: node linkType: hard -"smol-toml@npm:^1.6.0": - version: 1.6.0 - resolution: "smol-toml@npm:1.6.0" - checksum: 10c0/baf33bb6cd914d481329e31998a12829cd126541458ba400791212c80f1245d5b27dac04a56a52c02b287d2a494f1628c05fc19643286b258b2e0bb9fe67747c +"smol-toml@npm:^1.4.2": + version: 1.4.2 + resolution: "smol-toml@npm:1.4.2" + checksum: 10c0/e01e5f249b1ad852d09aa22f338a6cb3896ac35c92bf0d35744ce1b1e2f4b67901d4a0e886027617a2a8aa9f1a6c67c919c41b544c4aec137b6ebe042ca10d36 languageName: node linkType: hard @@ -16263,10 +16998,10 @@ __metadata: linkType: hard "snyk-nodejs-lockfile-parser@npm:^2.4.2": - version: 2.5.0 - resolution: "snyk-nodejs-lockfile-parser@npm:2.5.0" + version: 2.4.2 + resolution: "snyk-nodejs-lockfile-parser@npm:2.4.2" dependencies: - "@snyk/dep-graph": "npm:^2.12.0" + "@snyk/dep-graph": "npm:^2.3.0" "@snyk/error-catalog-nodejs-public": "npm:^5.16.0" "@snyk/graphlib": "npm:2.1.9-patch.3" "@yarnpkg/core": "npm:^4.4.1" @@ -16286,7 +17021,7 @@ __metadata: uuid: "npm:^8.3.0" bin: parse-nodejs-lockfile: bin/index.js - checksum: 10c0/9cc7d03322d76dd66df9372f542b3d980a0278e458a9402d29c4320e2054dab3821c59b0ac6c43b85fbaa0d216353e2b411b4c61efe8f60bf551c5c481a86518 + checksum: 10c0/205aff1ea79306975a881f63d857af446e61ff7537d94efb591b993bd152e413b8688f360d58f5bcaef833e00395898c35b31ab179d6aa07dce9d1f753617fe0 languageName: node linkType: hard @@ -16485,6 +17220,13 @@ __metadata: languageName: node linkType: hard +"stable-hash-x@npm:^0.2.0": + version: 0.2.0 + resolution: "stable-hash-x@npm:0.2.0" + checksum: 10c0/c757df58366ee4bb266a9486b8932eab7c1ba730469eaf4b68d2dee404814e9f84089c44c9b5205f8c7d99a0ab036cce2af69139ce5ed44b635923c011a8aea8 + languageName: node + linkType: hard + "stackback@npm:0.0.2": version: 0.0.2 resolution: "stackback@npm:0.0.2" @@ -16991,7 +17733,7 @@ __metadata: languageName: node linkType: hard -"tinyglobby@npm:^0.2.15": +"tinyglobby@npm:^0.2.14, tinyglobby@npm:^0.2.15": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" dependencies: @@ -17034,9 +17776,9 @@ __metadata: linkType: hard "tm-themes@npm:^1.10.12": - version: 1.10.16 - resolution: "tm-themes@npm:1.10.16" - checksum: 10c0/916ed911cb4630a5f069bab44055e96823a7ff9cb85c399736b42c682283a3f8568fe3b420692ca6ae4de2b1ba5a6fb7d4105b4333dd947ca09cbcb236068d7f + version: 1.10.12 + resolution: "tm-themes@npm:1.10.12" + checksum: 10c0/dcb3ef2fede7ed373909caed11d8c6a89837eb7682515182cc9f52f0c580b5bb4d9f0019cb1c1199fea416bb8d327f31d5b696903aeaf66b2a88cbcad80cf632 languageName: node linkType: hard @@ -17244,7 +17986,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2, tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.8.1": +"tslib@npm:^2, tslib@npm:^2.0.3, tslib@npm:^2.4.0, tslib@npm:^2.6.2, tslib@npm:^2.6.3, tslib@npm:^2.8.1": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 @@ -17374,13 +18116,13 @@ __metadata: linkType: hard "typedoc-plugin-frontmatter@npm:^1.3.0": - version: 1.3.1 - resolution: "typedoc-plugin-frontmatter@npm:1.3.1" + version: 1.3.0 + resolution: "typedoc-plugin-frontmatter@npm:1.3.0" dependencies: - yaml: "npm:^2.8.1" + yaml: "npm:^2.7.0" peerDependencies: - typedoc-plugin-markdown: ">=4.9.0" - checksum: 10c0/8bdda87c7a89b2a9dfdd3925c4b1a633c92696ca3fa110d96870a9d9bc2433afbe6d48e2b1b899bad4c7ae00970a8af1543d58e3e122db6d61055d1a2aff7dab + typedoc-plugin-markdown: ">=4.5.0" + checksum: 10c0/967ee5c38ab64b94489b9001744bbecc1cb6951bb07232caf2f4925f6a4dc0ac53305c4305e34ba10d6fddaab8f939642a2fbf10f1da884d6d6885d370c94cf3 languageName: node linkType: hard @@ -17405,10 +18147,10 @@ __metadata: linkType: hard "typedoc@npm:^0.28.9": - version: 0.28.16 - resolution: "typedoc@npm:0.28.16" + version: 0.28.14 + resolution: "typedoc@npm:0.28.14" dependencies: - "@gerrit0/mini-shiki": "npm:^3.17.0" + "@gerrit0/mini-shiki": "npm:^3.12.0" lunr: "npm:^2.3.9" markdown-it: "npm:^14.1.0" minimatch: "npm:^9.0.5" @@ -17417,22 +18159,22 @@ __metadata: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x bin: typedoc: bin/typedoc - checksum: 10c0/ae444913068088e88be6319a017a3a18f69cbd91dbb5b959fbdd0cf87d1a2a07f3a0d4ab29c957a83dd72808ff35bdd6ceec3ad1803fa412ddceffb78fa60ebb + checksum: 10c0/a8727134991ba3f9a982e9f6ceecfbcf0fac531e4865e4865cdee68ea6fe1a594228b8654011d38ffa2332b7e84e4eaa3d0dac04a8bdf36a0686d1c3f327e80b languageName: node linkType: hard -"typescript-eslint@npm:^8.33.1": - version: 8.53.0 - resolution: "typescript-eslint@npm:8.53.0" +"typescript-eslint@npm:^8.53.1": + version: 8.53.1 + resolution: "typescript-eslint@npm:8.53.1" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.53.0" - "@typescript-eslint/parser": "npm:8.53.0" - "@typescript-eslint/typescript-estree": "npm:8.53.0" - "@typescript-eslint/utils": "npm:8.53.0" + "@typescript-eslint/eslint-plugin": "npm:8.53.1" + "@typescript-eslint/parser": "npm:8.53.1" + "@typescript-eslint/typescript-estree": "npm:8.53.1" + "@typescript-eslint/utils": "npm:8.53.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 10c0/eb12a31f6bfb1edd9a381ca85c1095b917f57d56ab58720e893f48637613761d384300debe43f19999724201627596cc5b5dcde97f92de32b7146b038072fd7c + checksum: 10c0/520d68df8e1e1bba99c2713029b63837b101370c460bf5e75b8065fb0a6bc1ac9c6eb967432dbc220464479fe981630a6b2eddf31cfb378441ee8b8a43c0eb5a languageName: node linkType: hard @@ -17530,13 +18272,6 @@ __metadata: languageName: node linkType: hard -"ufo@npm:^1.6.1": - version: 1.6.3 - resolution: "ufo@npm:1.6.3" - checksum: 10c0/bf0e4ebff99e54da1b9c7182ac2f40475988b41faa881d579bc97bc2a0509672107b0a0e94c4b8d31a0ab8c4bf07f4aa0b469ac6da8536d56bda5b085ea2e953 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -17735,6 +18470,73 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.7.11": + version: 1.11.1 + resolution: "unrs-resolver@npm:1.11.1" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": "npm:1.11.1" + "@unrs/resolver-binding-android-arm64": "npm:1.11.1" + "@unrs/resolver-binding-darwin-arm64": "npm:1.11.1" + "@unrs/resolver-binding-darwin-x64": "npm:1.11.1" + "@unrs/resolver-binding-freebsd-x64": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.11.1" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.11.1" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.11.1" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.11.1" + napi-postinstall: "npm:^0.3.0" + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10c0/c91b112c71a33d6b24e5c708dab43ab80911f2df8ee65b87cd7a18fb5af446708e98c4b415ca262026ad8df326debcc7ca6a801b2935504d87fd6f0b9d70dce1 + languageName: node + linkType: hard + "unset-value@npm:^1.0.0": version: 1.0.0 resolution: "unset-value@npm:1.0.0" @@ -18024,10 +18826,10 @@ __metadata: linkType: hard "vite@npm:^6.0.0 || ^7.0.0, vite@npm:^7.1.11": - version: 7.3.1 - resolution: "vite@npm:7.3.1" + version: 7.1.11 + resolution: "vite@npm:7.1.11" dependencies: - esbuild: "npm:^0.27.0" + esbuild: "npm:^0.25.0" fdir: "npm:^6.5.0" fsevents: "npm:~2.3.3" picomatch: "npm:^4.0.3" @@ -18074,23 +18876,23 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 10c0/5c7548f5f43a23533e53324304db4ad85f1896b1bfd3ee32ae9b866bac2933782c77b350eb2b52a02c625c8ad1ddd4c000df077419410650c982cd97fde8d014 + checksum: 10c0/c4aa7f47b1fb07f734ed6f4f605d73e5acf7ff9754d75b4adbfbdddf0e520413019834620c1f7b4a207bce7e1d20a2636c584db2b1b17f5a3ba2cd23d47e50ab languageName: node linkType: hard "vitepress-plugin-group-icons@npm:^1.6.5": - version: 1.7.1 - resolution: "vitepress-plugin-group-icons@npm:1.7.1" + version: 1.6.5 + resolution: "vitepress-plugin-group-icons@npm:1.6.5" dependencies: - "@iconify-json/logos": "npm:^1.2.10" - "@iconify-json/vscode-icons": "npm:^1.2.39" - "@iconify/utils": "npm:^3.1.0" + "@iconify-json/logos": "npm:^1.2.9" + "@iconify-json/vscode-icons": "npm:^1.2.32" + "@iconify/utils": "npm:^3.0.2" peerDependencies: vite: ">=3" peerDependenciesMeta: vite: optional: true - checksum: 10c0/9d24c09ef38155d5f2efb61e27162350bb90e9b89677f4af5e4287bebff2899506751ea8ef305f30feeead4416422955c45dbc0c38e48de884ec62c40b04dc56 + checksum: 10c0/8e30800925cdc2ae1aeafcb42d9aae5da4a3c922e8aa0bd629461f29ff1ba3a766cb45f7ee66a350a4be8acce5f7069457da36a3977255bf241858ba8a5dad36 languageName: node linkType: hard @@ -18156,9 +18958,9 @@ __metadata: languageName: node linkType: hard -"vitest-browser-react@npm:^2.0.2": - version: 2.0.2 - resolution: "vitest-browser-react@npm:2.0.2" +"vitest-browser-react@npm:^2.0.4": + version: 2.0.4 + resolution: "vitest-browser-react@npm:2.0.4" peerDependencies: "@types/react": ^18.0.0 || ^19.0.0 "@types/react-dom": ^18.0.0 || ^19.0.0 @@ -18170,21 +18972,21 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10c0/95941efb09fa26533974029c70f5bc295b35de0ddef36e8852ce2e97221e10c660d4251af837f875a264a5b08ced965145a2d90a67d11dc595e91b16adbf3808 + checksum: 10c0/d5c4c65dbdc42bb9a78ac3545f5294bcabb217b6d70f00464f1f1583e8c7f4e5d71d454e3a84f1dba1ce341b8885e84fcd716eca290a052c342c950b5aaa7c1b languageName: node linkType: hard -"vitest@npm:^4.0.4": - version: 4.0.17 - resolution: "vitest@npm:4.0.17" +"vitest@npm:^4.0.18": + version: 4.0.18 + resolution: "vitest@npm:4.0.18" dependencies: - "@vitest/expect": "npm:4.0.17" - "@vitest/mocker": "npm:4.0.17" - "@vitest/pretty-format": "npm:4.0.17" - "@vitest/runner": "npm:4.0.17" - "@vitest/snapshot": "npm:4.0.17" - "@vitest/spy": "npm:4.0.17" - "@vitest/utils": "npm:4.0.17" + "@vitest/expect": "npm:4.0.18" + "@vitest/mocker": "npm:4.0.18" + "@vitest/pretty-format": "npm:4.0.18" + "@vitest/runner": "npm:4.0.18" + "@vitest/snapshot": "npm:4.0.18" + "@vitest/spy": "npm:4.0.18" + "@vitest/utils": "npm:4.0.18" es-module-lexer: "npm:^1.7.0" expect-type: "npm:^1.2.2" magic-string: "npm:^0.30.21" @@ -18202,10 +19004,10 @@ __metadata: "@edge-runtime/vm": "*" "@opentelemetry/api": ^1.9.0 "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 - "@vitest/browser-playwright": 4.0.17 - "@vitest/browser-preview": 4.0.17 - "@vitest/browser-webdriverio": 4.0.17 - "@vitest/ui": 4.0.17 + "@vitest/browser-playwright": 4.0.18 + "@vitest/browser-preview": 4.0.18 + "@vitest/browser-webdriverio": 4.0.18 + "@vitest/ui": 4.0.18 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -18229,7 +19031,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10c0/e1648bbfe2d01e23ceb6856863344035d2a1c139f39e8b15859e6ea8dc510ac3ba425df7c45486492d85ca516472aa892540dfd11ab6ad0613be98fd56d40716 + checksum: 10c0/b913cd32032c95f29ff08c931f4b4c6fd6d2da498908d6770952c561a1b8d75c62499a1f04cadf82fb89cc0f9a33f29fb5dfdb899f6dbb27686a9d91571be5fa languageName: node linkType: hard @@ -18699,7 +19501,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.0.0, yaml@npm:^2.8.0, yaml@npm:^2.8.1, yaml@npm:^2.8.2": +"yaml@npm:^2.0.0, yaml@npm:^2.8.0, yaml@npm:^2.8.1": version: 2.8.2 resolution: "yaml@npm:2.8.2" bin: @@ -18708,6 +19510,15 @@ __metadata: languageName: node linkType: hard +"yaml@npm:^2.7.0": + version: 2.8.1 + resolution: "yaml@npm:2.8.1" + bin: + yaml: bin.mjs + checksum: 10c0/7c587be00d9303d2ae1566e03bc5bc7fe978ba0d9bf39cc418c3139d37929dfcb93a230d9749f2cb578b6aa5d9ebebc322415e4b653cb83acd8bc0bc321707f3 + languageName: node + linkType: hard + "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0"