diff --git a/.agents/skills/_artifacts/domain_map.yaml b/.agents/skills/_artifacts/domain_map.yaml
index d6d59dfda8..860740633d 100644
--- a/.agents/skills/_artifacts/domain_map.yaml
+++ b/.agents/skills/_artifacts/domain_map.yaml
@@ -1,13 +1,13 @@
# domain_map.yaml
# Generated by skill-domain-discovery
# Library: livecodes
-# Version: 0.13.0
+# Version: 0.14.1
# Date: 2025-03-28
# Status: reviewed
library:
name: 'livecodes'
- version: '0.13.0'
+ version: '0.14.1'
repository: 'https://github.com/live-codes/livecodes'
description: 'A feature-rich, open-source, client-side code playground that supports 90+ languages/frameworks. Runs entirely in the browser with no server required.'
primary_framework: 'framework-agnostic'
diff --git a/.agents/skills/_artifacts/skill_tree.yaml b/.agents/skills/_artifacts/skill_tree.yaml
index e64839a4b5..8a3af01c73 100644
--- a/.agents/skills/_artifacts/skill_tree.yaml
+++ b/.agents/skills/_artifacts/skill_tree.yaml
@@ -4,7 +4,7 @@
library:
name: 'livecodes'
- version: '0.13.0'
+ version: '0.14.1'
repository: 'https://github.com/live-codes/livecodes'
description: 'A feature-rich, open-source, client-side code playground supporting 90+ languages/frameworks with SDK for embedding'
generated_from:
diff --git a/.agents/skills/livecodes/SKILL.md b/.agents/skills/livecodes/SKILL.md
index b1d952dc6e..469b041607 100644
--- a/.agents/skills/livecodes/SKILL.md
+++ b/.agents/skills/livecodes/SKILL.md
@@ -6,7 +6,7 @@ description: >-
LiveCodes skills.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
---
# LiveCodes Overview
@@ -24,7 +24,7 @@ LiveCodes is a feature-rich, open-source, client-side code playground that runs
| Quick start for beginners | [livecodes/getting-started/SKILL.md](./getting-started/SKILL.md) |
| Create embedded playgrounds | [livecodes/sdk-embedding/SKILL.md](./sdk-embedding/SKILL.md) |
| Use SDK methods (run, getCode, setConfig, watch) | [livecodes/sdk-methods/SKILL.md](./sdk-methods/SKILL.md) |
-| Compress/decompress config utilities | [livecodes/sdk-embedding/SKILL.md](./sdk-embedding/SKILL.md) |
+| Compress/decompress config utilities | [livecodes/sdk-embedding/SKILL.md](./sdk-embedding/SKILL.md) |
| Configure via Config object, query params | [livecodes/configuration/SKILL.md](./configuration/SKILL.md) |
| Choose display mode (full, simple, result, etc.) | [livecodes/display-modes/SKILL.md](./display-modes/SKILL.md) |
| Run playgrounds without visible UI | [livecodes/headless-mode/SKILL.md](./headless-mode/SKILL.md) |
diff --git a/.agents/skills/livecodes/configuration/SKILL.md b/.agents/skills/livecodes/configuration/SKILL.md
index 294e1f2c3b..68428af3cf 100644
--- a/.agents/skills/livecodes/configuration/SKILL.md
+++ b/.agents/skills/livecodes/configuration/SKILL.md
@@ -6,7 +6,7 @@ description: >
when setting up project content, configuring CSS processors, or customizing display.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/configuration/configuration-object.mdx
- live-codes/livecodes:docs/docs/configuration/query-params.mdx
diff --git a/.agents/skills/livecodes/display-modes/SKILL.md b/.agents/skills/livecodes/display-modes/SKILL.md
index d918019f0a..ce3607650d 100644
--- a/.agents/skills/livecodes/display-modes/SKILL.md
+++ b/.agents/skills/livecodes/display-modes/SKILL.md
@@ -6,7 +6,7 @@ description: >
embeddings, configuring read-only views, or showing only result or editor.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- configuration
sources:
diff --git a/.agents/skills/livecodes/framework-wrappers/SKILL.md b/.agents/skills/livecodes/framework-wrappers/SKILL.md
index 220c557510..fb42542a1d 100644
--- a/.agents/skills/livecodes/framework-wrappers/SKILL.md
+++ b/.agents/skills/livecodes/framework-wrappers/SKILL.md
@@ -6,7 +6,7 @@ description: >
Load this skill when embedding LiveCodes in a framework application.
type: framework
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- sdk-embedding
- sdk-methods
diff --git a/.agents/skills/livecodes/getting-started/SKILL.md b/.agents/skills/livecodes/getting-started/SKILL.md
index 0631c48529..efd3628d38 100644
--- a/.agents/skills/livecodes/getting-started/SKILL.md
+++ b/.agents/skills/livecodes/getting-started/SKILL.md
@@ -5,7 +5,7 @@ description: >
and self-hosting basics. Load this skill for initial setup and basic usage patterns.
type: lifecycle
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:README.md
- live-codes/livecodes:docs/docs/getting-started.mdx
@@ -132,7 +132,7 @@ createPlayground('#container', {
});
// SDK version pinning
-import { createPlayground } from 'https://cdn.jsdelivr.net/npm/livecodes@0.13.0';
+import { createPlayground } from 'https://cdn.jsdelivr.net/npm/livecodes@0.14.1';
```
## Common Patterns by Use Case
diff --git a/.agents/skills/livecodes/gh-action/SKILL.md b/.agents/skills/livecodes/gh-action/SKILL.md
index 629f6f1de5..173df23611 100644
--- a/.agents/skills/livecodes/gh-action/SKILL.md
+++ b/.agents/skills/livecodes/gh-action/SKILL.md
@@ -5,7 +5,7 @@ description: >
for pull request code changes. Automates playground creation and PR comments.
type: composition
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires: []
sources:
- live-codes/preview-in-livecodes:README.md
diff --git a/.agents/skills/livecodes/headless-mode/SKILL.md b/.agents/skills/livecodes/headless-mode/SKILL.md
index e68c614e65..547e8717a6 100644
--- a/.agents/skills/livecodes/headless-mode/SKILL.md
+++ b/.agents/skills/livecodes/headless-mode/SKILL.md
@@ -6,7 +6,7 @@ description: >
output without display.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- sdk-embedding
- sdk-methods
diff --git a/.agents/skills/livecodes/import-export/SKILL.md b/.agents/skills/livecodes/import-export/SKILL.md
index 8f723e1cb5..d49055c1b1 100644
--- a/.agents/skills/livecodes/import-export/SKILL.md
+++ b/.agents/skills/livecodes/import-export/SKILL.md
@@ -6,7 +6,7 @@ description: >
when loading projects from external sources or exporting project state.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/features/import.mdx
- live-codes/livecodes:docs/docs/features/export.mdx
diff --git a/.agents/skills/livecodes/language-support/SKILL.md b/.agents/skills/livecodes/language-support/SKILL.md
index 6f783cd14e..a5f80aff06 100644
--- a/.agents/skills/livecodes/language-support/SKILL.md
+++ b/.agents/skills/livecodes/language-support/SKILL.md
@@ -7,7 +7,7 @@ description: >
Python, Ruby, or Go.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/languages/index.mdx
- live-codes/livecodes:docs/docs/languages/_template.mdx
diff --git a/.agents/skills/livecodes/markdown-integration/SKILL.md b/.agents/skills/livecodes/markdown-integration/SKILL.md
index b6fc3b9132..fc41f2c442 100644
--- a/.agents/skills/livecodes/markdown-integration/SKILL.md
+++ b/.agents/skills/livecodes/markdown-integration/SKILL.md
@@ -6,7 +6,7 @@ description: >
Docusaurus, Astro, VitePress, Next.js, and Storybook.
type: composition
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- sdk-embedding
sources:
diff --git a/.agents/skills/livecodes/module-resolution/SKILL.md b/.agents/skills/livecodes/module-resolution/SKILL.md
index c24dc34daf..5340034a48 100644
--- a/.agents/skills/livecodes/module-resolution/SKILL.md
+++ b/.agents/skills/livecodes/module-resolution/SKILL.md
@@ -7,7 +7,7 @@ description: >
or resolving import conflicts.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/features/module-resolution.mdx
- live-codes/livecodes:src/livecodes/compiler/import-map.ts
diff --git a/.agents/skills/livecodes/sdk-embedding/SKILL.md b/.agents/skills/livecodes/sdk-embedding/SKILL.md
index ae2937eb7f..108e57d677 100644
--- a/.agents/skills/livecodes/sdk-embedding/SKILL.md
+++ b/.agents/skills/livecodes/sdk-embedding/SKILL.md
@@ -7,7 +7,7 @@ description: >
containers, or setting up SDK integration.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/sdk/js-ts.mdx
- live-codes/livecodes:src/sdk/index.ts
diff --git a/.agents/skills/livecodes/sdk-methods/SKILL.md b/.agents/skills/livecodes/sdk-methods/SKILL.md
index 7640676303..7b6e1bfcc4 100644
--- a/.agents/skills/livecodes/sdk-methods/SKILL.md
+++ b/.agents/skills/livecodes/sdk-methods/SKILL.md
@@ -7,7 +7,7 @@ description: >
or retrieving compiled output.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- sdk-embedding
sources:
diff --git a/.agents/skills/livecodes/self-hosting/SKILL.md b/.agents/skills/livecodes/self-hosting/SKILL.md
index 9ae8746a94..8efdb8c6bd 100644
--- a/.agents/skills/livecodes/self-hosting/SKILL.md
+++ b/.agents/skills/livecodes/self-hosting/SKILL.md
@@ -6,7 +6,7 @@ description: >
when self-hosting LiveCodes or using a custom app URL.
type: composition
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
requires:
- sdk-embedding
sources:
@@ -152,9 +152,9 @@ createPlayground('#container', {
});
// Pin SDK version
-import { createPlayground } from 'livecodes@0.13.0';
+import { createPlayground } from 'livecodes@0.14.1';
// or
-import { createPlayground } from 'https://cdn.jsdelivr.net/npm/livecodes@0.13.0';
+import { createPlayground } from 'https://cdn.jsdelivr.net/npm/livecodes@0.14.1';
```
Permanent URLs format: `https://v{VERSION}.livecodes.io`
diff --git a/.agents/skills/livecodes/testing/SKILL.md b/.agents/skills/livecodes/testing/SKILL.md
index 97e65fecb6..2ae6f6f3aa 100644
--- a/.agents/skills/livecodes/testing/SKILL.md
+++ b/.agents/skills/livecodes/testing/SKILL.md
@@ -6,7 +6,7 @@ description: >
Load this skill when writing tests for playground code or running tests via SDK.
type: core
library: livecodes
-library_version: 0.13.0
+library_version: 0.14.1
sources:
- live-codes/livecodes:docs/docs/features/tests.mdx
---
diff --git a/README.md b/README.md
index af2eeb3183..b9b1168515 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ A [feature-rich](https://livecodes.io/docs/features/), open-source, **client-sid
[](https://www.npmjs.com/package/livecodes)
[](https://www.npmjs.com/package/livecodes)
[](https://www.jsdelivr.com/package/npm/livecodes)
-[](https://livecodes.io/docs/languages/)
+[](https://livecodes.io/docs/languages/)
[](https://livecodes.io/docs/)
[](https://livecodes.io/docs/llms.txt)
[](https://livecodes.io/docs/llms-full.txt)
diff --git a/docs/docs/configuration/configuration-object.mdx b/docs/docs/configuration/configuration-object.mdx
index ad1e2d9891..3a5dc9fc87 100644
--- a/docs/docs/configuration/configuration-object.mdx
+++ b/docs/docs/configuration/configuration-object.mdx
@@ -141,6 +141,12 @@ An object that configures the language and content of the markup editor. This ca
A URL to load `content` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `content` property had no value.
+- `hidden`:
+ Type: [`boolean | undefined`](../api/interfaces/Config.md#hidden)
+ Default: `""`
+ If `true`, the title of the code editor is hidden, however its code is still evaluated.
+ This can be useful in embedded playgrounds (e.g. for hiding unnecessary code).
+
- `hiddenContent`:
Type: [`string | undefined`](../api/interfaces/Config.md#hiddencontent)
Default: `undefined`
@@ -153,18 +159,12 @@ An object that configures the language and content of the markup editor. This ca
A URL to load `hiddenContent` from. It has to be a valid URL that is CORS-enabled.
The URL is only fetched if `hiddenContent` property had no value.
-- `foldedLines`:
- Type: [`Array<{ from: number; to: number }> | undefined`](../api/interfaces/Config.md#foldedlines)
- Default: `undefined`
- Lines that get folded when the editor loads. The code can be unfolded by clicking on arrow beside the line.
- This can be useful for less relevant code in embedded playgrounds.
-
- `title`:
Type: [`string | undefined`](../api/interfaces/Config.md#title)
Default: `""`
If set, this is used as the title of the editor in the UI, overriding the default title set to the language name (e.g. "Python" can be used instead of "Py (Wasm)").
-- `hideTitle`:
+- `hideTitle` (**deprecated**, use `hidden` instead):
Type: [`boolean | undefined`](../api/interfaces/Config.md#hidetitle)
Default: `""`
If `true`, the title of the code editor is hidden, however its code is still evaluated.
@@ -186,6 +186,12 @@ An object that configures the language and content of the markup editor. This ca
The initial position of the cursor in the code editor.
Example: `{lineNumber: 5, column: 10}`
+- `foldedLines`:
+ Type: [`Array<{ from: number; to: number }> | undefined`](../api/interfaces/Config.md#foldedlines)
+ Default: `undefined`
+ Lines that get folded when the editor loads. The code can be unfolded by clicking on arrow beside the line.
+ This can be useful for less relevant code in embedded playgrounds.
+
### `style`
Type: [`Editor`](../api/interfaces/Config.md#style)
diff --git a/docs/docs/features/import.mdx b/docs/docs/features/import.mdx
index adc81f6c4b..bfbb1cbff5 100644
--- a/docs/docs/features/import.mdx
+++ b/docs/docs/features/import.mdx
@@ -81,7 +81,7 @@ Import is supported from any of the following:
- Local file(s)
- Code in zip file (Local or URL)
- Code in image - OCR (Local or URL)
-- Projects shared in official playgrounds of [TypeScript](https://www.typescriptlang.org/play) and [Vue](https://play.vuejs.org/)
+- Projects shared in official playgrounds of [TypeScript](https://www.typescriptlang.org/play), [Vue](https://play.vuejs.org/), [Svelte](https://svelte.dev/playground), [Preact](https://preactjs.com/repl/) and [Solid](https://playground.solidjs.com/)
- [Exported project JSON](./export.mdx) (single project and bulk import)
Import sources are identified by URL patterns (e.g. origin, pathname and extension).
@@ -90,34 +90,6 @@ Import sources are identified by URL patterns (e.g. origin, pathname and extensi
Local files can be imported from the "Import Screen" or by dragging and dropping the file(s) in the editor.
:::
-## File Selection
-
-For sources that provide multiple files (e.g. GitHub/GitLab directories, GitHub gists, GitLab snippets and local files), a best guess is tried to load files in respective editors. Best results are when there are 3 files and each file is in a language (identified by file extension) that can be loaded to a different editor, for example:
-
-- index.html, style.css, script.js
-- default.pug, app.scss, main.ts
-
-The following file names are given higher priority:
-
-- Markup files starting with `index.` or `default.`
-- Style files starting with `style.` or `styles.`
-- Script files starting with `script.`, `app.`, `main.` or `index.`
-
-While README, markdown files and files with no extension are given lower priority.
-
-Alternatively, files can be specified using the `files` [query param](../configuration/query-params.mdx). It takes a **comma-separated list** of filenames. The first 3 found files are loaded. If 1 or 2 files are specified, only these will be loaded. The first matching file is shown by default in the active editor.
-
-The query params should have the following format:
-`?x={url}&files={file1},{file2},{file3}`
-
-Example:
-`?x={url}&files=Counter.tsx,counter.scss,counter.html`
-
-The active editor can be specified using the [`activeEditor`](../configuration/configuration-object.mdx#activeeditor) (or its alias `active`) [query param](../configuration/query-params.mdx). It takes the name of the editor (`markup`, `style` or `script`) or its ID (`0`, `1` or `2`) to be shown by default.
-
-Example:
-`?x={url}&activeEditor=style` or `?x={url}&active=1`
-
## Import Shared Projects
[Shared Projects](./share.mdx) can be imported using the value of the query param `x` generated by the Share screen. This starts with either:
diff --git a/docs/docs/languages/cssmodules.mdx b/docs/docs/languages/cssmodules.mdx
index 11579dfd82..95df85639c 100644
--- a/docs/docs/languages/cssmodules.mdx
+++ b/docs/docs/languages/cssmodules.mdx
@@ -8,7 +8,7 @@ The selector names are unique to avoid naming collision. They can then be import
CSS Modules can be enabled from the style editor menu.
-Selectors added to the style editor (using any language e.g. CSS, SCSS, Less, etc.) are transformed to unique selectors. The transformed classes are then accessible in the script editor as a JSON object, and are injected into the HTML elements.
+Selectors added to the style editor (using any language e.g. CSS, SCSS, Less, etc.) are transformed to unique selectors. The transformed classes are then accessible in the script editor as a JSON object, and can be injected into the HTML elements.
**Example:**
@@ -193,7 +193,7 @@ In addition, the following settings are available:
- `addClassesToHTML`
- Type: `boolean`. Default: `true`.
+ Type: `boolean`. Default: `false`.
The generated classes are injected into the HTML elements, so the styles are applied without having to assign them using JavaScript.
@@ -212,7 +212,7 @@ Please note that custom settings should be valid JSON (i.e. functions are not al
"cssmodules": {
"exportGlobals": true,
"localsConvention": "camelCaseOnly",
- "addClassesToHTML": false
+ "addClassesToHTML": true
}
}
```
@@ -234,16 +234,30 @@ If you get this working, [please create a pull request](https://github.com/live-
import LiveCodes from '../../src/components/LiveCodes.tsx';
-export const params = {
+export const config = {
activeEditor: 'style',
- html: '
\n
Page Title
\n
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dolore earum blanditiis quidem non beatae ipsam autem maiores ut et delectus unde repudiandae, repellendus aut. Aspernatur similique facere facilis minima tempora.
\n
\n',
- css: ':global .page {\n padding: 20px;\n}\n\n.text {\n color: black;\n font-family: sans-serif;\n}\n\n.small-text {\n composes: text;\n font-size: 20px;\n}\n\n.large-text {\n composes: text;\n font-size: 40px;\n}\n\n.large-text:hover {\n color: red;\n}\n\n.title {\n composes: large-text;\n color: green;\n}\n',
- js: "import classes from './style.module.css';\n\ndocument.querySelector('h1').className = classes.title;\nconsole.log(classes);\n",
- processors: 'cssmodules',
- compiled: 'open',
-};
-
-
+ markup: {
+ language: 'html',
+ content: '\n
Page Title
\n
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Dolore earum blanditiis quidem non beatae ipsam autem maiores ut et delectus unde repudiandae, repellendus aut. Aspernatur similique facere facilis minima tempora.
\n
\n',
+ },
+ style: {
+ language: 'css',
+ content: ':global .page {\n padding: 20px;\n}\n\n.text {\n color: black;\n font-family: sans-serif;\n}\n\n.small-text {\n composes: text;\n font-size: 20px;\n}\n\n.large-text {\n composes: text;\n font-size: 40px;\n}\n\n.large-text:hover {\n color: red;\n}\n\n.title {\n composes: large-text;\n color: green;\n}\n',
+ },
+ script: {
+ language: 'js',
+ content: "import classes from './style.module.css';\n\ndocument.querySelector('h1').className = classes.title;\nconsole.log(classes);\n",
+ },
+ processors: ['cssmodules'],
+ tools: { active: 'compiled' },
+ customSettings: {
+ cssmodules: {
+ addClassesToHTML: true,
+ },
+ }
+}
+
+
## Links
diff --git a/docs/docs/languages/html.mdx b/docs/docs/languages/html.mdx
index 88498534b8..7d44329f3a 100644
--- a/docs/docs/languages/html.mdx
+++ b/docs/docs/languages/html.mdx
@@ -48,7 +48,7 @@ or adding JavaScript together with a different script editor language (e.g. see
### Extensions
-`.html`, `.htm`
+`.html`, `.htm`, `.svg`
### Editor
diff --git a/docs/docs/languages/json.mdx b/docs/docs/languages/json.mdx
new file mode 100644
index 0000000000..3c7dbc17c0
--- /dev/null
+++ b/docs/docs/languages/json.mdx
@@ -0,0 +1,3 @@
+# JSON
+
+TODO ...
diff --git a/docs/docs/languages/json5.mdx b/docs/docs/languages/json5.mdx
new file mode 100644
index 0000000000..27bf778a0c
--- /dev/null
+++ b/docs/docs/languages/json5.mdx
@@ -0,0 +1,3 @@
+# JSON5
+
+TODO ...
diff --git a/docs/docs/languages/jsonc.mdx b/docs/docs/languages/jsonc.mdx
new file mode 100644
index 0000000000..030ad2e69f
--- /dev/null
+++ b/docs/docs/languages/jsonc.mdx
@@ -0,0 +1,3 @@
+# JSONC
+
+TODO ...
diff --git a/docs/docs/languages/svelte.mdx b/docs/docs/languages/svelte.mdx
index ce4c89aef0..a78f31998b 100644
--- a/docs/docs/languages/svelte.mdx
+++ b/docs/docs/languages/svelte.mdx
@@ -116,7 +116,7 @@ import Counter from './Counter.svelte';
-Please note that LiveCodes [does not have the concept of a file system](../features/projects.mdx). However, you can configure [editor options](../configuration/configuration-object.mdx#markup) like `title`, `order` and `hideTitle` to simulate multiple files, change editor order or even hide editors.
+Please note that LiveCodes [does not have the concept of a file system](../features/projects.mdx). However, you can configure [editor options](../configuration/configuration-object.mdx#markup) like `title`, `order` and `hidden` to simulate multiple files, change editor order or even hide editors.
Example:
diff --git a/docs/docs/languages/text.mdx b/docs/docs/languages/text.mdx
new file mode 100644
index 0000000000..d80b25de3c
--- /dev/null
+++ b/docs/docs/languages/text.mdx
@@ -0,0 +1,3 @@
+# Text
+
+TODO ...
diff --git a/docs/docs/languages/vue.mdx b/docs/docs/languages/vue.mdx
index ff0928adad..01abb418d0 100644
--- a/docs/docs/languages/vue.mdx
+++ b/docs/docs/languages/vue.mdx
@@ -188,7 +188,7 @@ import Counter from './Counter.vue';
-Please note that LiveCodes [does not have the concept of a file system](../features/projects.mdx). However, you can configure [editor options](../configuration/configuration-object.mdx#markup) like `title`, `order` and `hideTitle` to simulate multiple files, change editor order or even hide editors.
+Please note that LiveCodes [does not have the concept of a file system](../features/projects.mdx). However, you can configure [editor options](../configuration/configuration-object.mdx#markup) like `title`, `order` and `hidden` to simulate multiple files, change editor order or even hide editors.
Example:
diff --git a/docs/docs/languages/yaml.mdx b/docs/docs/languages/yaml.mdx
new file mode 100644
index 0000000000..85a014e9c7
--- /dev/null
+++ b/docs/docs/languages/yaml.mdx
@@ -0,0 +1,3 @@
+# YAML
+
+TODO ...
diff --git a/docs/docusaurus.config.ts b/docs/docusaurus.config.ts
index 8aaecf8883..de4673149d 100644
--- a/docs/docusaurus.config.ts
+++ b/docs/docusaurus.config.ts
@@ -20,7 +20,7 @@ const config: Config = {
tagline: 'A Code Playground That Just Works!',
url: 'https://livecodes.io/',
baseUrl,
- onBrokenLinks: 'throw',
+ onBrokenLinks: 'warn',
onBrokenMarkdownLinks: 'warn',
favicon: 'img/favicon.ico',
organizationName: 'LiveCodes',
diff --git a/docs/package-lock.json b/docs/package-lock.json
index 7966ba03fc..7a583cc0e8 100644
--- a/docs/package-lock.json
+++ b/docs/package-lock.json
@@ -28,10 +28,10 @@
"@types/node": "22.13.0",
"@types/react": "19.0.10",
"docusaurus-plugin-typedoc": "1.0.5",
- "typedoc": "0.26.11",
- "typedoc-plugin-markdown": "4.2.10",
- "typedoc-plugin-missing-exports": "3.1.0",
- "typescript": "5.5.4"
+ "typedoc": "0.28.16",
+ "typedoc-plugin-markdown": "4.10.0",
+ "typedoc-plugin-missing-exports": "4.1.2",
+ "typescript": "5.9.3"
}
},
"node_modules/@algolia/autocomplete-core": {
@@ -3818,6 +3818,20 @@
"node": ">=18.0"
}
},
+ "node_modules/@gerrit0/mini-shiki": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz",
+ "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/engine-oniguruma": "^3.22.0",
+ "@shikijs/langs": "^3.22.0",
+ "@shikijs/themes": "^3.22.0",
+ "@shikijs/types": "^3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -4088,66 +4102,45 @@
"node": ">=16.0.0"
}
},
- "node_modules/@shikijs/core": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.29.2.tgz",
- "integrity": "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ==",
- "dev": true,
- "dependencies": {
- "@shikijs/engine-javascript": "1.29.2",
- "@shikijs/engine-oniguruma": "1.29.2",
- "@shikijs/types": "1.29.2",
- "@shikijs/vscode-textmate": "^10.0.1",
- "@types/hast": "^3.0.4",
- "hast-util-to-html": "^9.0.4"
- }
- },
- "node_modules/@shikijs/engine-javascript": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.29.2.tgz",
- "integrity": "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A==",
- "dev": true,
- "dependencies": {
- "@shikijs/types": "1.29.2",
- "@shikijs/vscode-textmate": "^10.0.1",
- "oniguruma-to-es": "^2.2.0"
- }
- },
"node_modules/@shikijs/engine-oniguruma": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.29.2.tgz",
- "integrity": "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA==",
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz",
+ "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@shikijs/types": "1.29.2",
- "@shikijs/vscode-textmate": "^10.0.1"
+ "@shikijs/types": "3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
}
},
"node_modules/@shikijs/langs": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-1.29.2.tgz",
- "integrity": "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ==",
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz",
+ "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@shikijs/types": "1.29.2"
+ "@shikijs/types": "3.22.0"
}
},
"node_modules/@shikijs/themes": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-1.29.2.tgz",
- "integrity": "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g==",
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz",
+ "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@shikijs/types": "1.29.2"
+ "@shikijs/types": "3.22.0"
}
},
"node_modules/@shikijs/types": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.29.2.tgz",
- "integrity": "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw==",
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz",
+ "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@shikijs/vscode-textmate": "^10.0.1",
+ "@shikijs/vscode-textmate": "^10.0.2",
"@types/hast": "^3.0.4"
}
},
@@ -4155,7 +4148,8 @@
"version": "10.0.2",
"resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
"integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@sideway/address": {
"version": "4.1.5",
@@ -7475,12 +7469,6 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
},
- "node_modules/emoji-regex-xs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz",
- "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==",
- "dev": true
- },
"node_modules/emojilib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
@@ -8869,29 +8857,6 @@
"url": "https://opencollective.com/unified"
}
},
- "node_modules/hast-util-to-html": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz",
- "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==",
- "dev": true,
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "ccount": "^2.0.0",
- "comma-separated-tokens": "^2.0.0",
- "hast-util-whitespace": "^3.0.0",
- "html-void-elements": "^3.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "property-information": "^7.0.0",
- "space-separated-tokens": "^2.0.0",
- "stringify-entities": "^4.0.0",
- "zwitch": "^2.0.4"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
"node_modules/hast-util-to-jsx-runtime": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.3.tgz",
@@ -12852,17 +12817,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/oniguruma-to-es": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-2.3.0.tgz",
- "integrity": "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==",
- "dev": true,
- "dependencies": {
- "emoji-regex-xs": "^1.0.0",
- "regex": "^5.1.1",
- "regex-recursion": "^5.1.1"
- }
- },
"node_modules/open": {
"version": "8.4.2",
"resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
@@ -15249,31 +15203,6 @@
"@babel/runtime": "^7.8.4"
}
},
- "node_modules/regex": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/regex/-/regex-5.1.1.tgz",
- "integrity": "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==",
- "dev": true,
- "dependencies": {
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-recursion": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-5.1.1.tgz",
- "integrity": "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==",
- "dev": true,
- "dependencies": {
- "regex": "^5.1.1",
- "regex-utilities": "^2.3.0"
- }
- },
- "node_modules/regex-utilities": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz",
- "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==",
- "dev": true
- },
"node_modules/regexpu-core": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz",
@@ -16119,22 +16048,6 @@
"node": ">=4"
}
},
- "node_modules/shiki": {
- "version": "1.29.2",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.29.2.tgz",
- "integrity": "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg==",
- "dev": true,
- "dependencies": {
- "@shikijs/core": "1.29.2",
- "@shikijs/engine-javascript": "1.29.2",
- "@shikijs/engine-oniguruma": "1.29.2",
- "@shikijs/langs": "1.29.2",
- "@shikijs/themes": "1.29.2",
- "@shikijs/types": "1.29.2",
- "@shikijs/vscode-textmate": "^10.0.1",
- "@types/hast": "^3.0.4"
- }
- },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
@@ -16812,46 +16725,50 @@
}
},
"node_modules/typedoc": {
- "version": "0.26.11",
- "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.26.11.tgz",
- "integrity": "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw==",
+ "version": "0.28.16",
+ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.16.tgz",
+ "integrity": "sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
+ "@gerrit0/mini-shiki": "^3.17.0",
"lunr": "^2.3.9",
"markdown-it": "^14.1.0",
"minimatch": "^9.0.5",
- "shiki": "^1.16.2",
- "yaml": "^2.5.1"
+ "yaml": "^2.8.1"
},
"bin": {
"typedoc": "bin/typedoc"
},
"engines": {
- "node": ">= 18"
+ "node": ">= 18",
+ "pnpm": ">= 10"
},
"peerDependencies": {
- "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x"
+ "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"
}
},
"node_modules/typedoc-plugin-markdown": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.2.10.tgz",
- "integrity": "sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ==",
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-4.10.0.tgz",
+ "integrity": "sha512-psrg8Rtnv4HPWCsoxId+MzEN8TVK5jeKCnTbnGAbTBqcDapR9hM41bJT/9eAyKn9C2MDG9Qjh3MkltAYuLDoXg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 18"
},
"peerDependencies": {
- "typedoc": "0.26.x"
+ "typedoc": "0.28.x"
}
},
"node_modules/typedoc-plugin-missing-exports": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-3.1.0.tgz",
- "integrity": "sha512-Sogbaj+qDa21NjB3SlIw4JXSwmcl/WOjwiPNaVEcPhpNG/MiRTtpwV81cT7h1cbu9StpONFPbddYWR0KV/fTWA==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.1.2.tgz",
+ "integrity": "sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
- "typedoc": "0.26.x || 0.27.x"
+ "typedoc": "^0.28.1"
}
},
"node_modules/typedoc/node_modules/brace-expansion": {
@@ -16879,9 +16796,10 @@
}
},
"node_modules/typescript": {
- "version": "5.5.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz",
- "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -17874,15 +17792,19 @@
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
},
"node_modules/yaml": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
- "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
"dev": true,
+ "license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yocto-queue": {
diff --git a/docs/package.json b/docs/package.json
index 438bd7ddd4..e708546b53 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -35,10 +35,10 @@
"@types/node": "22.13.0",
"@types/react": "19.0.10",
"docusaurus-plugin-typedoc": "1.0.5",
- "typedoc": "0.26.11",
- "typedoc-plugin-markdown": "4.2.10",
- "typedoc-plugin-missing-exports": "3.1.0",
- "typescript": "5.5.4"
+ "typedoc": "0.28.16",
+ "typedoc-plugin-markdown": "4.10.0",
+ "typedoc-plugin-missing-exports": "4.1.2",
+ "typescript": "5.9.3"
},
"browserslist": {
"production": [
diff --git a/docs/src/components/HomepageFeatures.tsx b/docs/src/components/HomepageFeatures.tsx
index fd56559761..7254bbcd3b 100644
--- a/docs/src/components/HomepageFeatures.tsx
+++ b/docs/src/components/HomepageFeatures.tsx
@@ -3,7 +3,7 @@ import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import CodeBlock from '@theme/CodeBlock';
-import clsx from 'clsx';
+import { clsx } from 'clsx';
import type { ReactNode } from 'react';
import HomepageCarousel from './HomepageCarousel';
import styles from './HomepageFeatures.module.css';
diff --git a/docs/src/pages/index.tsx b/docs/src/pages/index.tsx
index dd21d4c655..a9259a0e6e 100644
--- a/docs/src/pages/index.tsx
+++ b/docs/src/pages/index.tsx
@@ -2,7 +2,7 @@
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
-import clsx from 'clsx';
+import { clsx } from 'clsx';
import { useEffect } from 'react';
import HomepageFeatures from '../components/HomepageFeatures';
import { loadAds } from '../custom-content';
diff --git a/docs/src/theme/DocItem/Layout/index.tsx b/docs/src/theme/DocItem/Layout/index.tsx
index 075fb94cad..6a26fed707 100644
--- a/docs/src/theme/DocItem/Layout/index.tsx
+++ b/docs/src/theme/DocItem/Layout/index.tsx
@@ -12,7 +12,7 @@ import DocItemTOCDesktop from '@theme/DocItem/TOC/Desktop';
import DocItemTOCMobile from '@theme/DocItem/TOC/Mobile';
import DocVersionBadge from '@theme/DocVersionBadge';
import DocVersionBanner from '@theme/DocVersionBanner';
-import clsx from 'clsx';
+import { clsx } from 'clsx';
import { type ReactNode } from 'react';
import styles from './styles.module.css';
diff --git a/eslint.config.mjs b/eslint.config.mjs
index c5269234e0..7a56c9ba0d 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -32,9 +32,10 @@ export default [
'**/scripts',
'**/.cache',
'**/.docusaurus',
+ '**/.cache',
'**/.jest',
'**/.storybook',
- 'docs/docs/api/assets',
+ 'docs/docs/api',
'functions/vendors',
'storybook/**/src/livecodes*.ts',
],
diff --git a/functions/utils.ts b/functions/utils.ts
index f99b5d9122..474a22a784 100644
--- a/functions/utils.ts
+++ b/functions/utils.ts
@@ -72,7 +72,8 @@ export const getProjectInfo = async (url: URL): Promise => {
if (templateName) {
return {
title: templateName,
- description: templateName + ' Template on LiveCodes',
+ description:
+ templateName + (templateName.includes('Template') ? '' : ' Template') + ' on LiveCodes',
};
}
return {
diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js
index 962e2f25a9..0654d85481 100644
--- a/functions/vendors/templates.js
+++ b/functions/vendors/templates.js
@@ -68,4 +68,4 @@ export const starterTemplates = {
"minizinc": "MiniZinc Starter",
"blockly": "Blockly Starter",
"diagrams": "Diagrams Starter"
-}
\ No newline at end of file
+}
diff --git a/package-lock.json b/package-lock.json
index f1a8ea2b3b..9339498c37 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -46,8 +46,8 @@
"@types/prettier": "2.1.6",
"@types/prismjs": "1.16.3",
"@types/react": "19.0.10",
- "@typescript-eslint/eslint-plugin": "8.24.1",
- "@typescript-eslint/parser": "8.24.1",
+ "@typescript-eslint/eslint-plugin": "8.55.0",
+ "@typescript-eslint/parser": "8.55.0",
"@typescript/vfs": "1.5.3",
"@vue/runtime-core": "3.2.45",
"autoprefixer": "10.4.2",
@@ -61,11 +61,10 @@
"esbuild-plugin-minify-html": "0.1.2",
"esbuild-plugin-replace": "1.4.0",
"eslint": "9.20.1",
- "eslint-config-prettier": "10.0.1",
- "eslint-plugin-import": "2.31.0",
- "eslint-plugin-jest": "28.11.0",
- "eslint-plugin-jsdoc": "50.6.3",
- "eslint-plugin-no-only-tests": "3.3.0",
+ "eslint-config-prettier": "10.1.8",
+ "eslint-plugin-import": "2.32.0",
+ "eslint-plugin-jest": "29.13.0",
+ "eslint-plugin-jsdoc": "62.5.4",
"eslint-plugin-prefer-arrow": "1.2.3",
"eslint-plugin-storybook": "10.3.1",
"gh-pages": "6.1.0",
@@ -86,10 +85,10 @@
"stylelint": "17.3.0",
"stylelint-config-sass-guidelines": "13.0.0",
"ts-jest": "29.1.0",
- "tslib": "2.6.2",
- "typedoc": "0.25.13",
- "typedoc-plugin-missing-exports": "2.2.0",
- "typescript": "5.4.5"
+ "tslib": "2.8.1",
+ "typedoc": "0.28.16",
+ "typedoc-plugin-missing-exports": "4.1.2",
+ "typescript": "5.9.3"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -970,17 +969,30 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
- "version": "0.49.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
- "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
+ "version": "0.84.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz",
+ "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~4.1.0"
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.54.0",
+ "comment-parser": "1.4.5",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.1.1"
},
"engines": {
- "node": ">=16"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
}
},
"node_modules/@esbuild/aix-ppc64": {
@@ -1371,10 +1383,11 @@
}
},
"node_modules/@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
@@ -2029,6 +2042,20 @@
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz",
"integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ=="
},
+ "node_modules/@gerrit0/mini-shiki": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz",
+ "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/engine-oniguruma": "^3.22.0",
+ "@shikijs/langs": "^3.22.0",
+ "@shikijs/themes": "^3.22.0",
+ "@shikijs/types": "^3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
"node_modules/@grpc/grpc-js": {
"version": "1.8.18",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.18.tgz",
@@ -4350,18 +4377,6 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@pkgr/core": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts"
- }
- },
"node_modules/@playwright/test": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz",
@@ -4438,12 +4453,74 @@
"integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
"dev": true
},
+ "node_modules/@shikijs/engine-oniguruma": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz",
+ "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "node_modules/@shikijs/langs": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz",
+ "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.22.0"
+ }
+ },
+ "node_modules/@shikijs/themes": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz",
+ "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/types": "3.22.0"
+ }
+ },
+ "node_modules/@shikijs/types": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz",
+ "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "node_modules/@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@sindresorhus/merge-streams": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
@@ -4755,10 +4832,11 @@
"dev": true
},
"node_modules/@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
- "dev": true
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/glob": {
"version": "5.0.30",
@@ -4779,6 +4857,16 @@
"@types/node": "*"
}
},
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/@types/istanbul-lib-coverage": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
@@ -4929,6 +5017,13 @@
"integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==",
"dev": true
},
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/yargs": {
"version": "15.0.12",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz",
@@ -4945,20 +5040,20 @@
"dev": true
},
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
- "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
- "dev": true,
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/type-utils": "8.24.1",
- "@typescript-eslint/utils": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz",
+ "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/type-utils": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4968,22 +5063,33 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "@typescript-eslint/parser": "^8.55.0",
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
- "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz",
+ "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/typescript-estree": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "debug": "^4.3.4"
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -4994,7 +5100,7 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/project-service": {
@@ -5019,6 +5125,23 @@
"typescript": ">=4.8.4 <6.0.0"
}
},
+ "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.59.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz",
+ "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
"node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
@@ -5034,13 +5157,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
- "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz",
+ "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1"
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5051,9 +5175,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.56.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
- "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz",
+ "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==",
"dev": true,
"license": "MIT",
"engines": {
@@ -5068,15 +5192,17 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
- "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz",
+ "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.24.1",
- "@typescript-eslint/utils": "8.24.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5087,14 +5213,15 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
- "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz",
+ "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -5104,19 +5231,43 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
- "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz",
+ "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
+ "@typescript-eslint/project-service": "8.55.0",
+ "@typescript-eslint/tsconfig-utils": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/@typescript-eslint/project-service": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz",
+ "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.55.0",
+ "@typescript-eslint/types": "^8.55.0",
+ "debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5126,14 +5277,15 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -5143,6 +5295,7 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -5154,10 +5307,11 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -5166,15 +5320,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
- "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz",
+ "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/typescript-estree": "8.24.1"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5185,17 +5340,18 @@
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <5.8.0"
+ "typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
- "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz",
+ "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.24.1",
- "eslint-visitor-keys": "^4.2.0"
+ "@typescript-eslint/types": "8.55.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -5206,10 +5362,11 @@
}
},
"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -5316,6 +5473,14 @@
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
"dev": true
},
+ "node_modules/@webcontainer/env": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz",
+ "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/@yarnpkg/lockfile": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@@ -5348,10 +5513,11 @@
}
},
"node_modules/acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
+ "license": "MIT",
"bin": {
"acorn": "bin/acorn"
},
@@ -5470,12 +5636,6 @@
"node": ">=8"
}
},
- "node_modules/ansi-sequence-parser": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz",
- "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==",
- "dev": true
- },
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -5745,13 +5905,14 @@
}
},
"node_modules/array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
},
"engines": {
"node": ">= 0.4"
@@ -5767,17 +5928,20 @@
"dev": true
},
"node_modules/array-includes": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
- "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "is-string": "^1.0.7"
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -5805,17 +5969,19 @@
}
},
"node_modules/array.prototype.findlastindex": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
- "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -5825,15 +5991,16 @@
}
},
"node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5843,15 +6010,16 @@
}
},
"node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -5861,19 +6029,19 @@
}
},
"node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -5947,6 +6115,16 @@
"integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
"dev": true
},
+ "node_modules/async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -6006,6 +6184,7 @@
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"possible-typed-array-names": "^1.0.0"
},
@@ -6491,16 +6670,47 @@
}
},
"node_modules/call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
+ "set-function-length": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
@@ -6545,9 +6755,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001780",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz",
- "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==",
+ "version": "1.0.30001769",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz",
+ "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==",
"dev": true,
"funding": [
{
@@ -6971,10 +7181,11 @@
"dev": true
},
"node_modules/comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz",
+ "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 12.0.0"
}
@@ -7817,14 +8028,15 @@
}
},
"node_modules/data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -7834,29 +8046,31 @@
}
},
"node_modules/data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/inspect-js"
}
},
"node_modules/data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"is-data-view": "^1.0.1"
},
@@ -8345,6 +8559,21 @@
"mkdirp": "bin/cmd.js"
}
},
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -8427,57 +8656,66 @@
}
},
"node_modules/es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
"hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
+ "is-data-view": "^1.0.2",
"is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
},
"engines": {
"node": ">= 0.4"
@@ -8487,13 +8725,11 @@
}
},
"node_modules/es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.4"
- },
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
@@ -8507,17 +8743,12 @@
"node": ">= 0.4"
}
},
- "node_modules/es-module-lexer": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
- "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
- "dev": true
- },
"node_modules/es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
@@ -8526,37 +8757,44 @@
}
},
"node_modules/es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.2.4",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "hasown": "^2.0.0"
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
"node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
},
"engines": {
"node": ">= 0.4"
@@ -8730,12 +8968,16 @@
}
},
"node_modules/eslint-config-prettier": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
- "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
+ "license": "MIT",
"bin": {
- "eslint-config-prettier": "build/bin/cli.js"
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
},
"peerDependencies": {
"eslint": ">=7.0.0"
@@ -8762,10 +9004,11 @@
}
},
"node_modules/eslint-module-utils": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
- "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"debug": "^3.2.7"
},
@@ -8783,34 +9026,36 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eslint-plugin-import": {
- "version": "2.31.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
- "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.8",
- "array.prototype.findlastindex": "^1.2.5",
- "array.prototype.flat": "^1.3.2",
- "array.prototype.flatmap": "^1.3.2",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
"debug": "^3.2.7",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.0",
+ "eslint-module-utils": "^2.12.1",
"hasown": "^2.0.2",
- "is-core-module": "^2.15.1",
+ "is-core-module": "^2.16.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.8",
"object.groupby": "^1.0.3",
- "object.values": "^1.2.0",
+ "object.values": "^1.2.1",
"semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimend": "^1.0.9",
"tsconfig-paths": "^3.15.0"
},
"engines": {
@@ -8851,20 +9096,22 @@
}
},
"node_modules/eslint-plugin-jest": {
- "version": "28.11.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz",
- "integrity": "sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==",
+ "version": "29.13.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.13.0.tgz",
+ "integrity": "sha512-VoONe0NsaQLb7ijvg4k35rzchqfyCaBsXammNMCkTyLvKLTpzQOVdXiPC54q7Vp/W7shMcqPBLwAc3yRSiGjSQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
},
"engines": {
- "node": "^16.10.0 || ^18.12.0 || >=20.0.0"
+ "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
},
"peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0",
- "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0",
- "jest": "*"
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "jest": "*",
+ "typescript": ">=4.8.4 <6.0.0"
},
"peerDependenciesMeta": {
"@typescript-eslint/eslint-plugin": {
@@ -8872,29 +9119,36 @@
},
"jest": {
"optional": true
+ },
+ "typescript": {
+ "optional": true
}
}
},
"node_modules/eslint-plugin-jsdoc": {
- "version": "50.6.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.3.tgz",
- "integrity": "sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==",
+ "version": "62.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.5.4.tgz",
+ "integrity": "sha512-U+Q5ppErmC17VFQl542eBIaXcuq975BzoIHBXyx7UQx/i4gyHXxPiBkonkuxWyFA98hGLALLUuD+NJcXqSGKxg==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "@es-joy/jsdoccomment": "~0.49.0",
+ "@es-joy/jsdoccomment": "~0.84.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
- "debug": "^4.3.6",
+ "comment-parser": "1.4.5",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.1.0",
- "esquery": "^1.6.0",
- "parse-imports": "^2.1.1",
- "semver": "^7.6.3",
+ "espree": "^11.1.0",
+ "esquery": "^1.7.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^2.0.0",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0",
- "synckit": "^0.9.1"
+ "to-valid-identifier": "^1.0.0"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
@@ -8912,11 +9166,43 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz",
+ "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/espree": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz",
+ "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
"node_modules/eslint-plugin-jsdoc/node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -8934,15 +9220,6 @@
"spdx-license-ids": "^3.0.0"
}
},
- "node_modules/eslint-plugin-no-only-tests": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz",
- "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==",
- "dev": true,
- "engines": {
- "node": ">=5.0.0"
- }
- },
"node_modules/eslint-plugin-prefer-arrow": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz",
@@ -8984,6 +9261,23 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
+ "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.0.0"
+ }
+ },
"node_modules/eslint-plugin-storybook/node_modules/@typescript-eslint/types": {
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
@@ -9515,10 +9809,11 @@
}
},
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
"estraverse": "^5.1.0"
},
@@ -10184,12 +10479,19 @@
"dev": true
},
"node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-callable": "^1.1.3"
+ "is-callable": "^1.2.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/for-in": {
@@ -10397,15 +10699,18 @@
}
},
"node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
@@ -10419,10 +10724,21 @@
"resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true,
+ "license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -10454,16 +10770,22 @@
}
},
"node_modules/get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -10511,6 +10833,20 @@
"node": ">=10"
}
},
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -10524,14 +10860,15 @@
}
},
"node_modules/get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -10794,12 +11131,14 @@
}
},
"node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -10859,12 +11198,13 @@
"dev": true
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -10876,12 +11216,6 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
},
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
"node_modules/handlebars": {
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
@@ -10913,10 +11247,14 @@
}
},
"node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10943,10 +11281,14 @@
}
},
"node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.0"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -10955,10 +11297,11 @@
}
},
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -10971,6 +11314,7 @@
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
@@ -11132,6 +11476,23 @@
"node": ">=12"
}
},
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -11377,14 +11738,15 @@
"dev": true
},
"node_modules/internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -11424,13 +11786,15 @@
}
},
"node_modules/is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
},
"engines": {
"node": ">= 0.4"
@@ -11445,13 +11809,37 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
+ "node_modules/is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-bigints": "^1.0.1"
+ "has-bigints": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -11470,13 +11858,14 @@
}
},
"node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11496,6 +11885,7 @@
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
"integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -11543,11 +11933,14 @@
}
},
"node_modules/is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
"is-typed-array": "^1.1.13"
},
"engines": {
@@ -11558,10 +11951,15 @@
}
},
"node_modules/is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -11625,6 +12023,22 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -11642,6 +12056,26 @@
"node": ">=6"
}
},
+ "node_modules/is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -11691,6 +12125,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-negative-zero": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
@@ -11713,12 +12160,14 @@
}
},
"node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11777,13 +12226,16 @@
"dev": true
},
"node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11792,13 +12244,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7"
+ "call-bound": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -11820,12 +12286,14 @@
}
},
"node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11835,12 +12303,15 @@
}
},
"node_modules/is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.1"
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -11862,12 +12333,13 @@
}
},
"node_modules/is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "which-typed-array": "^1.1.14"
+ "which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -11883,13 +12355,47 @@
"dev": true,
"peer": true
},
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -14267,12 +14773,13 @@
}
},
"node_modules/jsdoc-type-pratt-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
- "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz",
+ "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/jsdom": {
@@ -14403,12 +14910,6 @@
"json5": "lib/cli.js"
}
},
- "node_modules/jsonc-parser": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
- "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
- "dev": true
- },
"node_modules/jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -14571,6 +15072,16 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
+ "node_modules/linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^2.0.0"
+ }
+ },
"node_modules/live-server": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz",
@@ -14939,16 +15450,39 @@
"node": ">=0.10.0"
}
},
- "node_modules/marked": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
- "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "node_modules/markdown-it": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
+ "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
"dev": true,
- "bin": {
- "marked": "bin/marked.js"
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
},
+ "bin": {
+ "markdown-it": "bin/markdown-it.mjs"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 12"
+ "node": ">= 0.4"
}
},
"node_modules/mathml-tag-names": {
@@ -14969,6 +15503,13 @@
"dev": true,
"license": "CC0-1.0"
},
+ "node_modules/mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
@@ -16103,11 +16644,22 @@
"node": ">=0.10.0"
}
},
+ "node_modules/object-deep-merge": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -16134,14 +16686,17 @@
}
},
"node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
},
"engines": {
@@ -16196,12 +16751,14 @@
}
},
"node_modules/object.values": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
- "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
@@ -16310,6 +16867,24 @@
"node": ">=0.10.0"
}
},
+ "node_modules/own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -16384,17 +16959,14 @@
"node": ">=6"
}
},
- "node_modules/parse-imports": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz",
- "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==",
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "es-module-lexer": "^1.5.3",
- "slashes": "^3.0.12"
- },
- "engines": {
- "node": ">= 18"
+ "parse-statements": "1.0.11"
}
},
"node_modules/parse-json": {
@@ -16410,6 +16982,13 @@
"node": ">=4"
}
},
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/parse5": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
@@ -16922,10 +17501,11 @@
}
},
"node_modules/possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4"
}
@@ -17551,6 +18131,16 @@
"node": ">=6"
}
},
+ "node_modules/punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/pure-rand": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
@@ -17915,6 +18505,29 @@
"node": ">=8"
}
},
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -17934,15 +18547,18 @@
}
},
"node_modules/regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -18019,6 +18635,19 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -18160,14 +18789,16 @@
}
},
"node_modules/safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
"isarray": "^2.0.5"
},
"engines": {
@@ -18181,13 +18812,38 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "node_modules/safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-push-apply/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/safe-regex": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
@@ -18198,14 +18854,15 @@
}
},
"node_modules/safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
+ "is-regex": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -18451,6 +19108,7 @@
"resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
"integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -18461,6 +19119,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -18540,28 +19213,74 @@
"node": ">=4"
}
},
- "node_modules/shiki": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz",
- "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==",
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-sequence-parser": "^1.1.0",
- "jsonc-parser": "^3.2.0",
- "vscode-oniguruma": "^1.7.0",
- "vscode-textmate": "^8.0.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -18612,12 +19331,6 @@
"node": ">=8"
}
},
- "node_modules/slashes": {
- "version": "3.0.12",
- "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz",
- "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==",
- "dev": true
- },
"node_modules/slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -19091,10 +19804,24 @@
"node": ">= 0.6"
}
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/storybook": {
- "version": "10.3.1",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.1.tgz",
- "integrity": "sha512-i/CA1dUyVcF6cNL3tgPTQ/G6Evh6r3QdATuiiKObrA3QkEKmt3jrY+WeuQA7FCcmHk/vKabeliNrblaff8aY6Q==",
+ "version": "10.3.6",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.6.tgz",
+ "integrity": "sha512-vbSz7g/1rGMC1uAULqMZjALkIuLu2QABqfhRYhyr/11kzyesi+vAmwyJLukZP1FfecxGOgMwOh6GS0YsGpHAvQ==",
"dev": true,
"license": "MIT",
"peer": true,
@@ -19105,6 +19832,7 @@
"@testing-library/user-event": "^14.6.1",
"@vitest/expect": "3.2.4",
"@vitest/spy": "3.2.4",
+ "@webcontainer/env": "^1.1.1",
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0",
"open": "^10.2.0",
"recast": "^0.23.5",
@@ -19120,11 +19848,15 @@
"url": "https://opencollective.com/storybook"
},
"peerDependencies": {
- "prettier": "^2 || ^3"
+ "prettier": "^2 || ^3",
+ "vite-plus": "^0.1.15"
},
"peerDependenciesMeta": {
"prettier": {
"optional": true
+ },
+ "vite-plus": {
+ "optional": true
}
}
},
@@ -19149,9 +19881,9 @@
}
},
"node_modules/storybook/node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
+ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
"dev": true,
"license": "ISC",
"peer": true,
@@ -19232,15 +19964,19 @@
}
},
"node_modules/string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -19250,15 +19986,20 @@
}
},
"node_modules/string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
},
+ "engines": {
+ "node": ">= 0.4"
+ },
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -19701,22 +20442,6 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
"dev": true
},
- "node_modules/synckit": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
- "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
- "dev": true,
- "dependencies": {
- "@pkgr/core": "^0.1.0",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/unts"
- }
- },
"node_modules/table": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
@@ -19984,6 +20709,23 @@
"node": ">=8.0"
}
},
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
@@ -20217,9 +20959,10 @@
}
},
"node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
},
"node_modules/type-check": {
"version": "0.3.2",
@@ -20243,30 +20986,32 @@
}
},
"node_modules/typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -20276,17 +21021,19 @@
}
},
"node_modules/typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
},
"engines": {
"node": ">= 0.4"
@@ -20296,17 +21043,18 @@
}
},
"node_modules/typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
},
"engines": {
"node": ">= 0.4"
@@ -20326,24 +21074,27 @@
}
},
"node_modules/typedoc": {
- "version": "0.25.13",
- "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz",
- "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==",
+ "version": "0.28.16",
+ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.16.tgz",
+ "integrity": "sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
+ "@gerrit0/mini-shiki": "^3.17.0",
"lunr": "^2.3.9",
- "marked": "^4.3.0",
- "minimatch": "^9.0.3",
- "shiki": "^0.14.7"
+ "markdown-it": "^14.1.0",
+ "minimatch": "^9.0.5",
+ "yaml": "^2.8.1"
},
"bin": {
"typedoc": "bin/typedoc"
},
"engines": {
- "node": ">= 16"
+ "node": ">= 18",
+ "pnpm": ">= 10"
},
"peerDependencies": {
- "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x"
+ "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"
}
},
"node_modules/typedoc-default-themes": {
@@ -20362,28 +21113,31 @@
}
},
"node_modules/typedoc-plugin-missing-exports": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.2.0.tgz",
- "integrity": "sha512-2+XR1IcyQ5UwXZVJe9NE6HrLmNufT9i5OwoIuuj79VxuA3eYq+Y6itS9rnNV1D7UeQnUSH8kISYD73gHE5zw+w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.1.2.tgz",
+ "integrity": "sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==",
"dev": true,
+ "license": "MIT",
"peerDependencies": {
- "typedoc": "0.24.x || 0.25.x"
+ "typedoc": "^0.28.1"
}
},
"node_modules/typedoc/node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/typedoc/node_modules/minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -20394,11 +21148,28 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/typedoc/node_modules/yaml": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
"node_modules/typescript": {
- "version": "5.4.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
- "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -20407,6 +21178,13 @@
"node": ">=14.17"
}
},
+ "node_modules/uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/uglify-js": {
"version": "3.13.6",
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.6.tgz",
@@ -20421,15 +21199,19 @@
}
},
"node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -20718,18 +21500,6 @@
"node": ">= 0.8"
}
},
- "node_modules/vscode-oniguruma": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
- "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
- "dev": true
- },
- "node_modules/vscode-textmate": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
- "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
- "dev": true
- },
"node_modules/w3c-xmlserializer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
@@ -20845,16 +21615,74 @@
}
},
"node_modules/which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/which-collection": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -20868,15 +21696,18 @@
"peer": true
},
"node_modules/which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
},
"engines": {
@@ -21735,16 +22566,24 @@
"requires": {}
},
"@es-joy/jsdoccomment": {
- "version": "0.49.0",
- "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
- "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
+ "version": "0.84.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.84.0.tgz",
+ "integrity": "sha512-0xew1CxOam0gV5OMjh2KjFQZsKL2bByX1+q4j3E73MpYIdyUxcZb/xQct9ccUb+ve5KGUYbCUxyPnYB7RbuP+w==",
"dev": true,
"requires": {
- "comment-parser": "1.4.1",
- "esquery": "^1.6.0",
- "jsdoc-type-pratt-parser": "~4.1.0"
+ "@types/estree": "^1.0.8",
+ "@typescript-eslint/types": "^8.54.0",
+ "comment-parser": "1.4.5",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.1.1"
}
},
+ "@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
+ "dev": true
+ },
"@esbuild/aix-ppc64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
@@ -21916,9 +22755,9 @@
}
},
"@eslint-community/regexpp": {
- "version": "4.12.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
- "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true
},
"@eslint/compat": {
@@ -22446,6 +23285,19 @@
"resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.6.1.tgz",
"integrity": "sha512-9FqhNjKQWpQ3fGnSOCovHOm+yhhiorKEqYLAfd525jWavunDJcx8rOW6i6ozAh+FbwcYMkL7b+3j4UR/30MpoQ=="
},
+ "@gerrit0/mini-shiki": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@gerrit0/mini-shiki/-/mini-shiki-3.22.0.tgz",
+ "integrity": "sha512-jMpciqEVUBKE1QwU64S4saNMzpsSza6diNCk4MWAeCxO2+LFi2FIFmL2S0VDLzEJCxuvCbU783xi8Hp/gkM5CQ==",
+ "dev": true,
+ "requires": {
+ "@shikijs/engine-oniguruma": "^3.22.0",
+ "@shikijs/langs": "^3.22.0",
+ "@shikijs/themes": "^3.22.0",
+ "@shikijs/types": "^3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
"@grpc/grpc-js": {
"version": "1.8.18",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.8.18.tgz",
@@ -24057,12 +24909,6 @@
"dev": true,
"optional": true
},
- "@pkgr/core": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
- "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
- "dev": true
- },
"@playwright/test": {
"version": "1.60.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz",
@@ -24132,12 +24978,62 @@
"integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
"dev": true
},
+ "@shikijs/engine-oniguruma": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz",
+ "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==",
+ "dev": true,
+ "requires": {
+ "@shikijs/types": "3.22.0",
+ "@shikijs/vscode-textmate": "^10.0.2"
+ }
+ },
+ "@shikijs/langs": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz",
+ "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==",
+ "dev": true,
+ "requires": {
+ "@shikijs/types": "3.22.0"
+ }
+ },
+ "@shikijs/themes": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz",
+ "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==",
+ "dev": true,
+ "requires": {
+ "@shikijs/types": "3.22.0"
+ }
+ },
+ "@shikijs/types": {
+ "version": "3.22.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz",
+ "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==",
+ "dev": true,
+ "requires": {
+ "@shikijs/vscode-textmate": "^10.0.2",
+ "@types/hast": "^3.0.4"
+ }
+ },
+ "@shikijs/vscode-textmate": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz",
+ "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
+ "dev": true
+ },
"@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
"integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
"dev": true
},
+ "@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
+ "dev": true
+ },
"@sindresorhus/merge-streams": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz",
@@ -24394,9 +25290,9 @@
"dev": true
},
"@types/estree": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
- "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true
},
"@types/glob": {
@@ -24418,6 +25314,15 @@
"@types/node": "*"
}
},
+ "@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dev": true,
+ "requires": {
+ "@types/unist": "*"
+ }
+ },
"@types/istanbul-lib-coverage": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
@@ -24566,6 +25471,12 @@
"integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==",
"dev": true
},
+ "@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "dev": true
+ },
"@types/yargs": {
"version": "15.0.12",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.12.tgz",
@@ -24582,33 +25493,40 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz",
- "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==",
- "dev": true,
- "requires": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/type-utils": "8.24.1",
- "@typescript-eslint/utils": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz",
+ "integrity": "sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/type-utils": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "ignore": "^7.0.5",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.4.0"
+ },
+ "dependencies": {
+ "ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true
+ }
}
},
"@typescript-eslint/parser": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz",
- "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.55.0.tgz",
+ "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==",
"dev": true,
"requires": {
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/typescript-estree": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "debug": "^4.3.4"
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3"
}
},
"@typescript-eslint/project-service": {
@@ -24622,6 +25540,13 @@
"debug": "^4.4.3"
},
"dependencies": {
+ "@typescript-eslint/tsconfig-utils": {
+ "version": "8.59.3",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz",
+ "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==",
+ "dev": true,
+ "requires": {}
+ },
"@typescript-eslint/types": {
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
@@ -24631,60 +25556,73 @@
}
},
"@typescript-eslint/scope-manager": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz",
- "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.55.0.tgz",
+ "integrity": "sha512-fVu5Omrd3jeqeQLiB9f1YsuK/iHFOwb04bCtY4BSCLgjNbOD33ZdV6KyEqplHr+IlpgT0QTZ/iJ+wT7hvTx49Q==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1"
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0"
}
},
"@typescript-eslint/tsconfig-utils": {
- "version": "8.56.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
- "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.55.0.tgz",
+ "integrity": "sha512-1R9cXqY7RQd7WuqSN47PK9EDpgFUK3VqdmbYrvWJZYDd0cavROGn+74ktWBlmJ13NXUQKlZ/iAEQHI/V0kKe0Q==",
"dev": true,
"requires": {}
},
"@typescript-eslint/type-utils": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz",
- "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.55.0.tgz",
+ "integrity": "sha512-x1iH2unH4qAt6I37I2CGlsNs+B9WGxurP2uyZLRz6UJoZWDBx9cJL1xVN/FiOmHEONEg6RIufdvyT0TEYIgC5g==",
"dev": true,
"requires": {
- "@typescript-eslint/typescript-estree": "8.24.1",
- "@typescript-eslint/utils": "8.24.1",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0",
+ "@typescript-eslint/utils": "8.55.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.4.0"
}
},
"@typescript-eslint/types": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz",
- "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.55.0.tgz",
+ "integrity": "sha512-ujT0Je8GI5BJWi+/mMoR0wxwVEQaxM+pi30xuMiJETlX80OPovb2p9E8ss87gnSVtYXtJoU9U1Cowcr6w2FE0w==",
"dev": true
},
"@typescript-eslint/typescript-estree": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz",
- "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.55.0.tgz",
+ "integrity": "sha512-EwrH67bSWdx/3aRQhCoxDaHM+CrZjotc2UCCpEDVqfCE+7OjKAGWNY2HsCSTEVvWH2clYQK8pdeLp42EVs+xQw==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/visitor-keys": "8.24.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
+ "@typescript-eslint/project-service": "8.55.0",
+ "@typescript-eslint/tsconfig-utils": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/visitor-keys": "8.55.0",
+ "debug": "^4.4.3",
+ "minimatch": "^9.0.5",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.4.0"
},
"dependencies": {
+ "@typescript-eslint/project-service": {
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.55.0.tgz",
+ "integrity": "sha512-zRcVVPFUYWa3kNnjaZGXSu3xkKV1zXy8M4nO/pElzQhFweb7PPtluDLQtKArEOGmjXoRjnUZ29NjOiF0eCDkcQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/tsconfig-utils": "^8.55.0",
+ "@typescript-eslint/types": "^8.55.0",
+ "debug": "^4.4.3"
+ }
+ },
"brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0"
@@ -24700,39 +25638,39 @@
}
},
"semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true
}
}
},
"@typescript-eslint/utils": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz",
- "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.55.0.tgz",
+ "integrity": "sha512-BqZEsnPGdYpgyEIkDC1BadNY8oMwckftxBT+C8W0g1iKPdeqKZBtTfnvcq0nf60u7MkjFO8RBvpRGZBPw4L2ow==",
"dev": true,
"requires": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.24.1",
- "@typescript-eslint/types": "8.24.1",
- "@typescript-eslint/typescript-estree": "8.24.1"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.55.0",
+ "@typescript-eslint/types": "8.55.0",
+ "@typescript-eslint/typescript-estree": "8.55.0"
}
},
"@typescript-eslint/visitor-keys": {
- "version": "8.24.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz",
- "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==",
+ "version": "8.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.55.0.tgz",
+ "integrity": "sha512-AxNRwEie8Nn4eFS1FzDMJWIISMGoXMb037sgCBJ3UR6o0fQTzr2tqN9WT+DkWJPhIdQCfV7T6D387566VtnCJA==",
"dev": true,
"requires": {
- "@typescript-eslint/types": "8.24.1",
- "eslint-visitor-keys": "^4.2.0"
+ "@typescript-eslint/types": "8.55.0",
+ "eslint-visitor-keys": "^4.2.1"
},
"dependencies": {
"eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true
}
}
@@ -24817,6 +25755,13 @@
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
"dev": true
},
+ "@webcontainer/env": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@webcontainer/env/-/env-1.1.1.tgz",
+ "integrity": "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==",
+ "dev": true,
+ "peer": true
+ },
"@yarnpkg/lockfile": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@@ -24846,9 +25791,9 @@
}
},
"acorn": {
- "version": "8.14.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
- "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true
},
"acorn-globals": {
@@ -24934,12 +25879,6 @@
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
},
- "ansi-sequence-parser": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz",
- "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==",
- "dev": true
- },
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -25162,13 +26101,13 @@
"dev": true
},
"array-buffer-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
- "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz",
+ "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.5",
- "is-array-buffer": "^3.0.4"
+ "call-bound": "^1.0.3",
+ "is-array-buffer": "^3.0.5"
}
},
"array-ify": {
@@ -25178,17 +26117,19 @@
"dev": true
},
"array-includes": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
- "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "is-string": "^1.0.7"
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
}
},
"array-uniq": {
@@ -25204,57 +26145,57 @@
"dev": true
},
"array.prototype.findlastindex": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
- "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz",
+ "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.23.9",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-shim-unscopables": "^1.0.2"
+ "es-object-atoms": "^1.1.1",
+ "es-shim-unscopables": "^1.1.0"
}
},
"array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz",
+ "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
}
},
"array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz",
+ "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.5",
+ "es-shim-unscopables": "^1.0.2"
}
},
"arraybuffer.prototype.slice": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
- "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz",
+ "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==",
"dev": true,
"requires": {
"array-buffer-byte-length": "^1.0.1",
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
- "es-abstract": "^1.22.3",
- "es-errors": "^1.2.1",
- "get-intrinsic": "^1.2.3",
- "is-array-buffer": "^3.0.4",
- "is-shared-array-buffer": "^1.0.2"
+ "es-abstract": "^1.23.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "is-array-buffer": "^3.0.4"
}
},
"arrify": {
@@ -25304,6 +26245,12 @@
"integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
"dev": true
},
+ "async-function": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz",
+ "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==",
+ "dev": true
+ },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -25723,16 +26670,35 @@
}
},
"call-bind": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
- "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
+ "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
"requires": {
+ "call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
- "set-function-length": "^1.2.1"
+ "set-function-length": "^1.2.2"
+ }
+ },
+ "call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
+ "call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
}
},
"callsites": {
@@ -25759,9 +26725,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001780",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz",
- "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==",
+ "version": "1.0.30001769",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001769.tgz",
+ "integrity": "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg==",
"dev": true
},
"chai": {
@@ -26082,9 +27048,9 @@
"dev": true
},
"comment-parser": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
- "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.5.tgz",
+ "integrity": "sha512-aRDkn3uyIlCFfk5NUA+VdwMmMsh8JGhc4hapfV4yxymHGQ3BVskMQfoXGpCo5IoBuQ9tS5iiVKhCpTcB4pW4qw==",
"dev": true
},
"commondir": {
@@ -26740,34 +27706,34 @@
}
},
"data-view-buffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
- "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
+ "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
}
},
"data-view-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
- "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz",
+ "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-data-view": "^1.0.1"
+ "is-data-view": "^1.0.2"
}
},
"data-view-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
- "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz",
+ "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
"is-data-view": "^1.0.1"
}
@@ -27113,6 +28079,17 @@
}
}
},
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
"duplexer": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
@@ -27176,67 +28153,72 @@
}
},
"es-abstract": {
- "version": "1.23.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz",
- "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==",
+ "version": "1.24.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz",
+ "integrity": "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==",
"dev": true,
"requires": {
- "array-buffer-byte-length": "^1.0.1",
- "arraybuffer.prototype.slice": "^1.0.3",
+ "array-buffer-byte-length": "^1.0.2",
+ "arraybuffer.prototype.slice": "^1.0.4",
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "data-view-buffer": "^1.0.1",
- "data-view-byte-length": "^1.0.1",
- "data-view-byte-offset": "^1.0.0",
- "es-define-property": "^1.0.0",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "data-view-buffer": "^1.0.2",
+ "data-view-byte-length": "^1.0.2",
+ "data-view-byte-offset": "^1.0.1",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
- "es-set-tostringtag": "^2.0.3",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.4",
- "get-symbol-description": "^1.0.2",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
+ "es-object-atoms": "^1.1.1",
+ "es-set-tostringtag": "^2.1.0",
+ "es-to-primitive": "^1.3.0",
+ "function.prototype.name": "^1.1.8",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
+ "get-symbol-description": "^1.1.0",
+ "globalthis": "^1.0.4",
+ "gopd": "^1.2.0",
"has-property-descriptors": "^1.0.2",
- "has-proto": "^1.0.3",
- "has-symbols": "^1.0.3",
+ "has-proto": "^1.2.0",
+ "has-symbols": "^1.1.0",
"hasown": "^2.0.2",
- "internal-slot": "^1.0.7",
- "is-array-buffer": "^3.0.4",
+ "internal-slot": "^1.1.0",
+ "is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
- "is-data-view": "^1.0.1",
+ "is-data-view": "^1.0.2",
"is-negative-zero": "^2.0.3",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.3",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.13",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
+ "is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
+ "is-shared-array-buffer": "^1.0.4",
+ "is-string": "^1.1.1",
+ "is-typed-array": "^1.1.15",
+ "is-weakref": "^1.1.1",
+ "math-intrinsics": "^1.1.0",
+ "object-inspect": "^1.13.4",
"object-keys": "^1.1.1",
- "object.assign": "^4.1.5",
- "regexp.prototype.flags": "^1.5.2",
- "safe-array-concat": "^1.1.2",
- "safe-regex-test": "^1.0.3",
- "string.prototype.trim": "^1.2.9",
- "string.prototype.trimend": "^1.0.8",
+ "object.assign": "^4.1.7",
+ "own-keys": "^1.0.1",
+ "regexp.prototype.flags": "^1.5.4",
+ "safe-array-concat": "^1.1.3",
+ "safe-push-apply": "^1.0.0",
+ "safe-regex-test": "^1.1.0",
+ "set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
+ "string.prototype.trim": "^1.2.10",
+ "string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
- "typed-array-buffer": "^1.0.2",
- "typed-array-byte-length": "^1.0.1",
- "typed-array-byte-offset": "^1.0.2",
- "typed-array-length": "^1.0.6",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.15"
+ "typed-array-buffer": "^1.0.3",
+ "typed-array-byte-length": "^1.0.3",
+ "typed-array-byte-offset": "^1.0.4",
+ "typed-array-length": "^1.0.7",
+ "unbox-primitive": "^1.1.0",
+ "which-typed-array": "^1.1.19"
}
},
"es-define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
- "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.2.4"
- }
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true
},
"es-errors": {
"version": "1.3.0",
@@ -27244,50 +28226,45 @@
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true
},
- "es-module-lexer": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz",
- "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==",
- "dev": true
- },
"es-object-atoms": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
- "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"requires": {
"es-errors": "^1.3.0"
}
},
"es-set-tostringtag": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
- "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
"requires": {
- "get-intrinsic": "^1.2.4",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
- "hasown": "^2.0.1"
+ "hasown": "^2.0.2"
}
},
"es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz",
+ "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==",
"dev": true,
"requires": {
- "hasown": "^2.0.0"
+ "hasown": "^2.0.2"
}
},
"es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz",
+ "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==",
"dev": true,
"requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "is-callable": "^1.2.7",
+ "is-date-object": "^1.0.5",
+ "is-symbol": "^1.0.4"
}
},
"es6-error": {
@@ -27630,9 +28607,9 @@
}
},
"eslint-config-prettier": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz",
- "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==",
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
"requires": {}
},
@@ -27659,9 +28636,9 @@
}
},
"eslint-module-utils": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
- "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz",
+ "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==",
"dev": true,
"requires": {
"debug": "^3.2.7"
@@ -27679,29 +28656,29 @@
}
},
"eslint-plugin-import": {
- "version": "2.31.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
- "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "version": "2.32.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz",
+ "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"requires": {
"@rtsao/scc": "^1.1.0",
- "array-includes": "^3.1.8",
- "array.prototype.findlastindex": "^1.2.5",
- "array.prototype.flat": "^1.3.2",
- "array.prototype.flatmap": "^1.3.2",
+ "array-includes": "^3.1.9",
+ "array.prototype.findlastindex": "^1.2.6",
+ "array.prototype.flat": "^1.3.3",
+ "array.prototype.flatmap": "^1.3.3",
"debug": "^3.2.7",
"doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.12.0",
+ "eslint-module-utils": "^2.12.1",
"hasown": "^2.0.2",
- "is-core-module": "^2.15.1",
+ "is-core-module": "^2.16.1",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.8",
"object.groupby": "^1.0.3",
- "object.values": "^1.2.0",
+ "object.values": "^1.2.1",
"semver": "^6.3.1",
- "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimend": "^1.0.9",
"tsconfig-paths": "^3.15.0"
},
"dependencies": {
@@ -27732,31 +28709,34 @@
}
},
"eslint-plugin-jest": {
- "version": "28.11.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz",
- "integrity": "sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig==",
+ "version": "29.13.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.13.0.tgz",
+ "integrity": "sha512-VoONe0NsaQLb7ijvg4k35rzchqfyCaBsXammNMCkTyLvKLTpzQOVdXiPC54q7Vp/W7shMcqPBLwAc3yRSiGjSQ==",
"dev": true,
"requires": {
- "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/utils": "^8.0.0"
}
},
"eslint-plugin-jsdoc": {
- "version": "50.6.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.3.tgz",
- "integrity": "sha512-NxbJyt1M5zffPcYZ8Nb53/8nnbIScmiLAMdoe0/FAszwb7lcSiX3iYBTsuF7RV84dZZJC8r3NghomrUXsmWvxQ==",
+ "version": "62.5.4",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.5.4.tgz",
+ "integrity": "sha512-U+Q5ppErmC17VFQl542eBIaXcuq975BzoIHBXyx7UQx/i4gyHXxPiBkonkuxWyFA98hGLALLUuD+NJcXqSGKxg==",
"dev": true,
"requires": {
- "@es-joy/jsdoccomment": "~0.49.0",
+ "@es-joy/jsdoccomment": "~0.84.0",
+ "@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
- "comment-parser": "1.4.1",
- "debug": "^4.3.6",
+ "comment-parser": "1.4.5",
+ "debug": "^4.4.3",
"escape-string-regexp": "^4.0.0",
- "espree": "^10.1.0",
- "esquery": "^1.6.0",
- "parse-imports": "^2.1.1",
- "semver": "^7.6.3",
+ "espree": "^11.1.0",
+ "esquery": "^1.7.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^2.0.0",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.7.3",
"spdx-expression-parse": "^4.0.0",
- "synckit": "^0.9.1"
+ "to-valid-identifier": "^1.0.0"
},
"dependencies": {
"escape-string-regexp": {
@@ -27765,10 +28745,27 @@
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true
},
+ "eslint-visitor-keys": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz",
+ "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==",
+ "dev": true
+ },
+ "espree": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.1.0.tgz",
+ "integrity": "sha512-WFWYhO1fV4iYkqOOvq8FbqIhr2pYfoDY0kCotMkDeNtGpiGGkZ1iov2u8ydjtgM8yF8rzK7oaTbw2NAzbAbehw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.0"
+ }
+ },
"semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true
},
"spdx-expression-parse": {
@@ -27783,12 +28780,6 @@
}
}
},
- "eslint-plugin-no-only-tests": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz",
- "integrity": "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==",
- "dev": true
- },
"eslint-plugin-prefer-arrow": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz",
@@ -27815,6 +28806,13 @@
"@typescript-eslint/visitor-keys": "8.56.1"
}
},
+ "@typescript-eslint/tsconfig-utils": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
+ "integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
+ "dev": true,
+ "requires": {}
+ },
"@typescript-eslint/types": {
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
@@ -27940,9 +28938,9 @@
"dev": true
},
"esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"requires": {
"estraverse": "^5.1.0"
@@ -28485,12 +29483,12 @@
"dev": true
},
"for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
+ "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
"requires": {
- "is-callable": "^1.1.3"
+ "is-callable": "^1.2.7"
}
},
"for-in": {
@@ -28633,15 +29631,17 @@
"dev": true
},
"function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz",
+ "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "define-properties": "^1.2.1",
+ "functions-have-names": "^1.2.3",
+ "hasown": "^2.0.2",
+ "is-callable": "^1.2.7"
}
},
"functions-have-names": {
@@ -28650,6 +29650,12 @@
"integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
"dev": true
},
+ "generator-function": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz",
+ "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==",
+ "dev": true
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -28668,16 +29674,21 @@
"dev": true
},
"get-intrinsic": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
- "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
}
},
"get-package-type": {
@@ -28709,6 +29720,16 @@
}
}
},
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
"get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -28716,14 +29737,14 @@
"dev": true
},
"get-symbol-description": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
- "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
+ "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.5",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4"
+ "get-intrinsic": "^1.2.6"
}
},
"get-value": {
@@ -28919,12 +29940,13 @@
"dev": true
},
"globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
"dev": true,
"requires": {
- "define-properties": "^1.1.3"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
}
},
"globby": {
@@ -28962,13 +29984,10 @@
"dev": true
},
"gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.3"
- }
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true
},
"graceful-fs": {
"version": "4.2.11",
@@ -28976,12 +29995,6 @@
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"dev": true
},
- "graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
"handlebars": {
"version": "4.7.7",
"resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
@@ -29002,9 +30015,9 @@
"dev": true
},
"has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz",
+ "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==",
"dev": true
},
"has-flag": {
@@ -29023,15 +30036,18 @@
}
},
"has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
- "dev": true
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz",
+ "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==",
+ "dev": true,
+ "requires": {
+ "dunder-proto": "^1.0.0"
+ }
},
"has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true
},
"has-tostringtag": {
@@ -29160,6 +30176,12 @@
"whatwg-encoding": "^2.0.0"
}
},
+ "html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true
+ },
"html-escaper": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -29337,14 +30359,14 @@
"dev": true
},
"internal-slot": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
- "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
+ "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==",
"dev": true,
"requires": {
"es-errors": "^1.3.0",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
+ "hasown": "^2.0.2",
+ "side-channel": "^1.1.0"
}
},
"interpret": {
@@ -29374,13 +30396,14 @@
}
},
"is-array-buffer": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
- "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
+ "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1"
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
}
},
"is-arrayish": {
@@ -29389,13 +30412,26 @@
"integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
"dev": true
},
+ "is-async-function": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz",
+ "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==",
+ "dev": true,
+ "requires": {
+ "async-function": "^1.0.0",
+ "call-bound": "^1.0.3",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ }
+ },
"is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz",
+ "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==",
"dev": true,
"requires": {
- "has-bigints": "^1.0.1"
+ "has-bigints": "^1.0.2"
}
},
"is-binary-path": {
@@ -29408,13 +30444,13 @@
}
},
"is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz",
+ "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
}
},
"is-buffer": {
@@ -29459,19 +30495,25 @@
}
},
"is-data-view": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
- "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz",
+ "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==",
"dev": true,
"requires": {
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
"is-typed-array": "^1.1.13"
}
},
"is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
- "dev": true
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz",
+ "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "has-tostringtag": "^1.0.2"
+ }
},
"is-descriptor": {
"version": "0.1.6",
@@ -29510,6 +30552,15 @@
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"dev": true
},
+ "is-finalizationregistry": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz",
+ "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.3"
+ }
+ },
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -29521,6 +30572,19 @@
"integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
"dev": true
},
+ "is-generator-function": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
+ "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.4",
+ "generator-function": "^2.0.0",
+ "get-proto": "^1.0.1",
+ "has-tostringtag": "^1.0.2",
+ "safe-regex-test": "^1.1.0"
+ }
+ },
"is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -29549,6 +30613,12 @@
}
}
},
+ "is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true
+ },
"is-negative-zero": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
@@ -29562,12 +30632,13 @@
"dev": true
},
"is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz",
+ "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==",
"dev": true,
"requires": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
}
},
"is-obj": {
@@ -29604,22 +30675,30 @@
"dev": true
},
"is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
+ "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.2",
+ "gopd": "^1.2.0",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
}
},
+ "is-set": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true
+ },
"is-shared-array-buffer": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
- "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz",
+ "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7"
+ "call-bound": "^1.0.3"
}
},
"is-stream": {
@@ -29629,21 +30708,24 @@
"dev": true
},
"is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
+ "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==",
"dev": true,
"requires": {
- "has-tostringtag": "^1.0.0"
+ "call-bound": "^1.0.3",
+ "has-tostringtag": "^1.0.2"
}
},
"is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz",
+ "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==",
"dev": true,
"requires": {
- "has-symbols": "^1.0.1"
+ "call-bound": "^1.0.2",
+ "has-symbols": "^1.1.0",
+ "safe-regex-test": "^1.1.0"
}
},
"is-text-path": {
@@ -29656,12 +30738,12 @@
}
},
"is-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
- "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
+ "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dev": true,
"requires": {
- "which-typed-array": "^1.1.14"
+ "which-typed-array": "^1.1.16"
}
},
"is-typedarray": {
@@ -29671,13 +30753,29 @@
"dev": true,
"peer": true
},
+ "is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true
+ },
"is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz",
+ "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.3"
+ }
+ },
+ "is-weakset": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz",
+ "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2"
+ "call-bound": "^1.0.3",
+ "get-intrinsic": "^1.2.6"
}
},
"is-windows": {
@@ -31450,9 +32548,9 @@
}
},
"jsdoc-type-pratt-parser": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz",
- "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.1.1.tgz",
+ "integrity": "sha512-/2uqY7x6bsrpi3i9LVU6J89352C0rpMk0as8trXxCtvd4kPk1ke/Eyif6wqfSLvoNJqcDG9Vk4UsXgygzCt2xA==",
"dev": true
},
"jsdom": {
@@ -31559,12 +32657,6 @@
"minimist": "^1.2.0"
}
},
- "jsonc-parser": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz",
- "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==",
- "dev": true
- },
"jsonfile": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
@@ -31693,6 +32785,15 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
+ "linkify-it": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz",
+ "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==",
+ "dev": true,
+ "requires": {
+ "uc.micro": "^2.0.0"
+ }
+ },
"live-server": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/live-server/-/live-server-1.2.1.tgz",
@@ -32011,10 +33112,32 @@
"object-visit": "^1.0.0"
}
},
- "marked": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
- "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+ "markdown-it": {
+ "version": "14.1.1",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz",
+ "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1",
+ "entities": "^4.4.0",
+ "linkify-it": "^5.0.0",
+ "mdurl": "^2.0.0",
+ "punycode.js": "^2.3.1",
+ "uc.micro": "^2.1.0"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ }
+ }
+ },
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true
},
"mathml-tag-names": {
@@ -32029,6 +33152,12 @@
"integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
+ "mdurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
+ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==",
+ "dev": true
+ },
"memorystream": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
@@ -32895,10 +34024,16 @@
}
}
},
+ "object-deep-merge": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.0.tgz",
+ "integrity": "sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==",
+ "dev": true
+ },
"object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true
},
"object-keys": {
@@ -32917,14 +34052,16 @@
}
},
"object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz",
+ "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.5",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
+ "es-object-atoms": "^1.0.0",
+ "has-symbols": "^1.1.0",
"object-keys": "^1.1.1"
}
},
@@ -32961,12 +34098,13 @@
}
},
"object.values": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
- "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz",
+ "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.3",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
}
@@ -33044,6 +34182,17 @@
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
+ "own-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz",
+ "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.6",
+ "object-keys": "^1.1.1",
+ "safe-push-apply": "^1.0.0"
+ }
+ },
"p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -33100,14 +34249,13 @@
"callsites": "^3.0.0"
}
},
- "parse-imports": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz",
- "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==",
+ "parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
"dev": true,
"requires": {
- "es-module-lexer": "^1.5.3",
- "slashes": "^3.0.12"
+ "parse-statements": "1.0.11"
}
},
"parse-json": {
@@ -33120,6 +34268,12 @@
"json-parse-better-errors": "^1.0.1"
}
},
+ "parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
+ "dev": true
+ },
"parse5": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
@@ -33480,9 +34634,9 @@
"dev": true
},
"possible-typed-array-names": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
- "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
+ "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
"dev": true
},
"postcss": {
@@ -33878,6 +35032,12 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
+ "punycode.js": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz",
+ "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==",
+ "dev": true
+ },
"pure-rand": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
@@ -34153,6 +35313,22 @@
"strip-indent": "^3.0.0"
}
},
+ "reflect.getprototypeof": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
+ "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.8",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.9",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.7",
+ "get-proto": "^1.0.1",
+ "which-builtin-type": "^1.2.1"
+ }
+ },
"regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
@@ -34169,15 +35345,17 @@
}
},
"regexp.prototype.flags": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz",
- "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==",
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
+ "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==",
"dev": true,
"requires": {
- "call-bind": "^1.0.6",
+ "call-bind": "^1.0.8",
"define-properties": "^1.2.1",
"es-errors": "^1.3.0",
- "set-function-name": "^2.0.1"
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "set-function-name": "^2.0.2"
}
},
"release-zalgo": {
@@ -34232,6 +35410,12 @@
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true
},
+ "reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true
+ },
"resolve": {
"version": "1.22.8",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
@@ -34322,14 +35506,15 @@
}
},
"safe-array-concat": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
- "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz",
+ "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
- "get-intrinsic": "^1.2.4",
- "has-symbols": "^1.0.3",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "get-intrinsic": "^1.2.6",
+ "has-symbols": "^1.1.0",
"isarray": "^2.0.5"
},
"dependencies": {
@@ -34346,6 +35531,24 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
+ "safe-push-apply": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz",
+ "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "isarray": "^2.0.5"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ }
+ }
+ },
"safe-regex": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
@@ -34356,14 +35559,14 @@
}
},
"safe-regex-test": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
- "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz",
+ "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.6",
+ "call-bound": "^1.0.2",
"es-errors": "^1.3.0",
- "is-regex": "^1.1.4"
+ "is-regex": "^1.2.1"
}
},
"safer-buffer": {
@@ -34554,6 +35757,17 @@
"has-property-descriptors": "^1.0.2"
}
},
+ "set-proto": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz",
+ "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==",
+ "dev": true,
+ "requires": {
+ "dunder-proto": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0"
+ }
+ },
"set-value": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -34614,28 +35828,52 @@
"rechoir": "^0.6.2"
}
},
- "shiki": {
- "version": "0.14.7",
- "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.7.tgz",
- "integrity": "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==",
+ "side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
"requires": {
- "ansi-sequence-parser": "^1.1.0",
- "jsonc-parser": "^3.2.0",
- "vscode-oniguruma": "^1.7.0",
- "vscode-textmate": "^8.0.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
}
},
- "side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
}
},
"signal-exit": {
@@ -34673,12 +35911,6 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
- "slashes": {
- "version": "3.0.12",
- "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz",
- "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==",
- "dev": true
- },
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -35067,10 +36299,20 @@
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
"dev": true
},
+ "stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "requires": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ }
+ },
"storybook": {
- "version": "10.3.1",
- "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.1.tgz",
- "integrity": "sha512-i/CA1dUyVcF6cNL3tgPTQ/G6Evh6r3QdATuiiKObrA3QkEKmt3jrY+WeuQA7FCcmHk/vKabeliNrblaff8aY6Q==",
+ "version": "10.3.6",
+ "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.3.6.tgz",
+ "integrity": "sha512-vbSz7g/1rGMC1uAULqMZjALkIuLu2QABqfhRYhyr/11kzyesi+vAmwyJLukZP1FfecxGOgMwOh6GS0YsGpHAvQ==",
"dev": true,
"peer": true,
"requires": {
@@ -35080,6 +36322,7 @@
"@testing-library/user-event": "^14.6.1",
"@vitest/expect": "3.2.4",
"@vitest/spy": "3.2.4",
+ "@webcontainer/env": "^1.1.1",
"esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0",
"open": "^10.2.0",
"recast": "^0.23.5",
@@ -35102,9 +36345,9 @@
}
},
"semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
+ "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==",
"dev": true,
"peer": true
}
@@ -35168,24 +36411,28 @@
}
},
"string.prototype.trim": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
- "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "version": "1.2.10",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz",
+ "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
+ "define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.0",
- "es-object-atoms": "^1.0.0"
+ "es-abstract": "^1.23.5",
+ "es-object-atoms": "^1.0.0",
+ "has-property-descriptors": "^1.0.2"
}
},
"string.prototype.trimend": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
- "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz",
+ "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.2",
"define-properties": "^1.2.1",
"es-object-atoms": "^1.0.0"
}
@@ -35483,16 +36730,6 @@
"integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
"dev": true
},
- "synckit": {
- "version": "0.9.2",
- "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
- "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
- "dev": true,
- "requires": {
- "@pkgr/core": "^0.1.0",
- "tslib": "^2.6.2"
- }
- },
"table": {
"version": "6.9.0",
"resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
@@ -35694,6 +36931,16 @@
"is-number": "^7.0.0"
}
},
+ "to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ }
+ },
"touch": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
@@ -35839,9 +37086,9 @@
}
},
"tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
"type-check": {
"version": "0.3.2",
@@ -35859,55 +37106,56 @@
"dev": true
},
"typed-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
- "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bound": "^1.0.3",
"es-errors": "^1.3.0",
- "is-typed-array": "^1.1.13"
+ "is-typed-array": "^1.1.14"
}
},
"typed-array-byte-length": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
- "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz",
+ "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.14"
}
},
"typed-array-byte-offset": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
- "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz",
+ "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==",
"dev": true,
"requires": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
"for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-proto": "^1.0.3",
- "is-typed-array": "^1.1.13"
+ "gopd": "^1.2.0",
+ "has-proto": "^1.2.0",
+ "is-typed-array": "^1.1.15",
+ "reflect.getprototypeof": "^1.0.9"
}
},
"typed-array-length": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
- "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
+ "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
"dev": true,
"requires": {
"call-bind": "^1.0.7",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
- "has-proto": "^1.0.3",
"is-typed-array": "^1.1.13",
- "possible-typed-array-names": "^1.0.0"
+ "possible-typed-array-names": "^1.0.0",
+ "reflect.getprototypeof": "^1.0.6"
}
},
"typedarray-to-buffer": {
@@ -35921,34 +37169,41 @@
}
},
"typedoc": {
- "version": "0.25.13",
- "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.13.tgz",
- "integrity": "sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==",
+ "version": "0.28.16",
+ "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.28.16.tgz",
+ "integrity": "sha512-x4xW77QC3i5DUFMBp0qjukOTnr/sSg+oEs86nB3LjDslvAmwe/PUGDWbe3GrIqt59oTqoXK5GRK9tAa0sYMiog==",
"dev": true,
"requires": {
+ "@gerrit0/mini-shiki": "^3.17.0",
"lunr": "^2.3.9",
- "marked": "^4.3.0",
- "minimatch": "^9.0.3",
- "shiki": "^0.14.7"
+ "markdown-it": "^14.1.0",
+ "minimatch": "^9.0.5",
+ "yaml": "^2.8.1"
},
"dependencies": {
"brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0"
}
},
"minimatch": {
- "version": "9.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
- "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"requires": {
"brace-expansion": "^2.0.1"
}
+ },
+ "yaml": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "dev": true
}
}
},
@@ -35965,16 +37220,22 @@
}
},
"typedoc-plugin-missing-exports": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-2.2.0.tgz",
- "integrity": "sha512-2+XR1IcyQ5UwXZVJe9NE6HrLmNufT9i5OwoIuuj79VxuA3eYq+Y6itS9rnNV1D7UeQnUSH8kISYD73gHE5zw+w==",
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/typedoc-plugin-missing-exports/-/typedoc-plugin-missing-exports-4.1.2.tgz",
+ "integrity": "sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg==",
"dev": true,
"requires": {}
},
"typescript": {
- "version": "5.4.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz",
- "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "dev": true
+ },
+ "uc.micro": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz",
+ "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==",
"dev": true
},
"uglify-js": {
@@ -35985,15 +37246,15 @@
"optional": true
},
"unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz",
+ "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
+ "call-bound": "^1.0.3",
"has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
+ "has-symbols": "^1.1.0",
+ "which-boxed-primitive": "^1.1.1"
}
},
"undefsafe": {
@@ -36212,18 +37473,6 @@
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
"dev": true
},
- "vscode-oniguruma": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
- "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
- "dev": true
- },
- "vscode-textmate": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
- "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
- "dev": true
- },
"w3c-xmlserializer": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
@@ -36314,16 +37563,57 @@
}
},
"which-boxed-primitive": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz",
+ "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.1.0",
+ "is-boolean-object": "^1.2.1",
+ "is-number-object": "^1.1.1",
+ "is-string": "^1.1.1",
+ "is-symbol": "^1.1.1"
+ }
+ },
+ "which-builtin-type": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz",
+ "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.1.0",
+ "is-finalizationregistry": "^1.1.0",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.2.1",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.1.0",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.16"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ }
+ }
+ },
+ "which-collection": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
"dev": true,
"requires": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
}
},
"which-module": {
@@ -36334,15 +37624,17 @@
"peer": true
},
"which-typed-array": {
- "version": "1.1.15",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
- "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "version": "1.1.20",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
+ "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"dev": true,
"requires": {
"available-typed-arrays": "^1.0.7",
- "call-bind": "^1.0.7",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
+ "for-each": "^0.3.5",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
}
},
diff --git a/package.json b/package.json
index 1c5b1bdd59..aca7b844b2 100644
--- a/package.json
+++ b/package.json
@@ -112,8 +112,8 @@
"@types/prettier": "2.1.6",
"@types/prismjs": "1.16.3",
"@types/react": "19.0.10",
- "@typescript-eslint/eslint-plugin": "8.24.1",
- "@typescript-eslint/parser": "8.24.1",
+ "@typescript-eslint/eslint-plugin": "8.55.0",
+ "@typescript-eslint/parser": "8.55.0",
"@typescript/vfs": "1.5.3",
"@vue/runtime-core": "3.2.45",
"autoprefixer": "10.4.2",
@@ -127,11 +127,10 @@
"esbuild-plugin-minify-html": "0.1.2",
"esbuild-plugin-replace": "1.4.0",
"eslint": "9.20.1",
- "eslint-config-prettier": "10.0.1",
- "eslint-plugin-import": "2.31.0",
- "eslint-plugin-jest": "28.11.0",
- "eslint-plugin-jsdoc": "50.6.3",
- "eslint-plugin-no-only-tests": "3.3.0",
+ "eslint-config-prettier": "10.1.8",
+ "eslint-plugin-import": "2.32.0",
+ "eslint-plugin-jest": "29.13.0",
+ "eslint-plugin-jsdoc": "62.5.4",
"eslint-plugin-prefer-arrow": "1.2.3",
"eslint-plugin-storybook": "10.3.1",
"gh-pages": "6.1.0",
@@ -152,10 +151,10 @@
"stylelint": "17.3.0",
"stylelint-config-sass-guidelines": "13.0.0",
"ts-jest": "29.1.0",
- "tslib": "2.6.2",
- "typedoc": "0.25.13",
- "typedoc-plugin-missing-exports": "2.2.0",
- "typescript": "5.4.5"
+ "tslib": "2.8.1",
+ "typedoc": "0.28.16",
+ "typedoc-plugin-missing-exports": "4.1.2",
+ "typescript": "5.9.3"
},
"prettier": {
"semi": true,
diff --git a/server/php/broadcast/index.php b/server/php/broadcast/index.php
index e67cb91265..56138ac7cc 100644
--- a/server/php/broadcast/index.php
+++ b/server/php/broadcast/index.php
@@ -88,6 +88,11 @@
$reducedData[$editor]['compiled'] = '';
}
}
+if (isset($reducedData['files']) && is_array($reducedData['files'])) {
+ foreach ($reducedData['files'] as &$f) {
+ $f['compiled'] = '';
+ }
+}
$storedResult = strlen($result) < 300000 ? $result : '';
$dataJson = json_encode($reducedData, JSON_INVALID_UTF8_SUBSTITUTE);
diff --git a/server/src/broadcast/code.html b/server/src/broadcast/code.html
index 54acf9b9f0..5464c5a425 100644
--- a/server/src/broadcast/code.html
+++ b/server/src/broadcast/code.html
@@ -74,7 +74,10 @@ LiveCodes Broadcast
readonly: true,
});
if (config.activeEditor) {
- const { lineNumber = 1, column = 1 } = config[config.activeEditor]?.position || {};
+ const editor = config.files?.length
+ ? config.files.find((f) => f.filename === config.activeEditor)
+ : config[config.activeEditor];
+ const { lineNumber = 1, column = 1 } = editor?.position || {};
await playground.show(config.activeEditor, {
line: lineNumber,
column,
diff --git a/server/src/broadcast/index.ts b/server/src/broadcast/index.ts
index c2a30c59d2..ae6d590281 100644
--- a/server/src/broadcast/index.ts
+++ b/server/src/broadcast/index.ts
@@ -7,6 +7,12 @@ import path from 'node:path';
import * as socketio from 'socket.io';
import { dirname, generateId } from '../utils.ts';
+interface Channel {
+ channelToken: string;
+ result: string;
+ data: Record;
+ lastAccessed: number;
+}
export const broadcast = ({
hostname,
port,
@@ -22,7 +28,7 @@ export const broadcast = ({
const httpserver = http.createServer(app);
const io = new socketio.Server(httpserver);
- const channels = {};
+ const channels: Record = {};
const broadcastDir = path.resolve(dirname, 'broadcast');
const broadcastUrl = `https://${hostname}:${port}`;
@@ -89,6 +95,7 @@ export const broadcast = ({
if (reducedData.markup) reducedData.markup.compiled = '';
if (reducedData.style) reducedData.style.compiled = '';
if (reducedData.script) reducedData.script.compiled = '';
+ reducedData.files?.forEach?.((f: any) => (f.compiled = ''));
channels[channel] = {
channelToken,
diff --git a/src/livecodes/UI/code-to-image.ts b/src/livecodes/UI/code-to-image.ts
index 971c414047..a0e12afe86 100644
--- a/src/livecodes/UI/code-to-image.ts
+++ b/src/livecodes/UI/code-to-image.ts
@@ -4,13 +4,13 @@ import { codeToImageScreen } from '../html';
import type {
CodeEditor,
CodejarTheme,
- Config,
EditorId,
EditorOptions,
EventsManager,
FormatFn,
Modal,
Notifications,
+ SDKConfig,
} from '../models';
import {
colorToRgba,
@@ -75,7 +75,7 @@ export const createCodeToImageUI = async ({
deps: {
createEditor: (options: PreviewEditorOptions) => Promise;
getFormatFn: () => Promise;
- getShareUrl: (config: Partial, shortUrl?: boolean) => Promise;
+ getShareUrl: (config: Partial, shortUrl?: boolean) => Promise;
getSavedPreset: () => Partial | undefined;
savePreset: (preset: Partial) => void;
};
@@ -307,7 +307,7 @@ export const createCodeToImageUI = async ({
};
updateWatermark(currentUrl);
- const getCodeConfig = (): Partial => ({
+ const getCodeConfig = (): Partial => ({
title: windowControls.querySelector('#code-to-img-title')!.textContent || '',
activeEditor: editorId,
[editorId]: {
@@ -315,7 +315,7 @@ export const createCodeToImageUI = async ({
content: editor.getValue(),
},
});
- let cachedConfig: Partial | undefined;
+ let cachedConfig: Partial | undefined;
let formData: Preset;
diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts
index 8d7816e64f..f9cb0abf52 100644
--- a/src/livecodes/UI/command-menu-actions.ts
+++ b/src/livecodes/UI/command-menu-actions.ts
@@ -324,14 +324,28 @@ export const getCommandMenuActions = ({
'minizinc',
'blockly',
'diagrams',
- ).map((template) => ({
- id: 'Starter template: ' + template,
- title: window.deps.translateString('commandMenu.template', 'Template') + ': ' + template,
- content: getContent('Template: ' + template),
- handler: async () => {
- await loadStarterTemplate(template);
- },
- })),
+ 'multifile-blank',
+ 'multifile-basic',
+ 'multifile-javascript',
+ 'multifile-typescript',
+ 'multifile-react',
+ 'multifile-vue',
+ 'multifile-preact',
+ 'multifile-svelte',
+ 'multifile-solid',
+ 'multifile-lit',
+ 'multifile-jest',
+ ).map((template) => {
+ const label = template.startsWith('multifile-') ? template.replace('-', ' ') : template;
+ return {
+ id: 'Starter template: ' + template,
+ title: window.deps.translateString('commandMenu.template', 'Template') + ': ' + label,
+ content: getContent('Template: ' + label),
+ handler: async () => {
+ await loadStarterTemplate(template);
+ },
+ };
+ }),
},
{
id: 'Run',
diff --git a/src/livecodes/UI/create-language-menus.ts b/src/livecodes/UI/create-language-menus.ts
index 0b64986cfd..dc638a9565 100644
--- a/src/livecodes/UI/create-language-menus.ts
+++ b/src/livecodes/UI/create-language-menus.ts
@@ -8,6 +8,14 @@ import type {
Processor,
Template,
} from '../models';
+import { handleSlash, removeFormatting } from '../utils';
+import {
+ getEditorScrollerEnd,
+ getEditorScrollerStart,
+ getEditorSelector,
+ getEditorTab,
+ getEditorTabScroller,
+} from './selectors';
export const createLanguageMenus = (
config: Config,
@@ -19,8 +27,7 @@ export const createLanguageMenus = (
registerMenuButton: (menu: HTMLElement, button: HTMLElement) => void,
) => {
const editorIds: EditorId[] = ['markup', 'style', 'script'];
- const rootList = document.createElement('ul');
- document.querySelector('#select-editor')?.appendChild(rootList);
+ const rootList = getEditorTabScroller()!;
let editorsNumber = editorIds.length;
@@ -30,6 +37,7 @@ export const createLanguageMenus = (
editorSelector.id = editorId + '-selector';
editorSelector.classList.add('editor-title', 'noselect');
editorSelector.dataset.editor = editorId;
+ editorSelector.dataset.singleFile = 'true';
editorSelector.innerHTML = `
language.editor === editorId)
- .filter((language) => languageIsEnabled(language.name, config));
+ const editorLanguages = [...window.deps.languages].filter(
+ (language) => language.editor === editorId && languageIsEnabled(language.name, config),
+ );
if (editorLanguages.length === 0) {
editorSelector.classList.add('hidden');
@@ -159,6 +167,230 @@ export const createLanguageMenus = (
editorSelector.classList.add('half-width');
});
}
+
+ handleEditorTabScroll();
+};
+
+export const createMultiFileEditorTab = ({
+ title,
+ showEditor,
+ addFile,
+ renameFile,
+ deleteFile,
+ isMainFile,
+ isNewFile = false,
+ isHidden = false,
+ isLocked = false,
+}: {
+ title: string;
+ showEditor: (filename: string) => void;
+ addFile?: (filename: string) => Promise;
+ renameFile: (filename: string, newName: string) => boolean;
+ deleteFile: (filename: string) => void;
+ isMainFile: boolean;
+ isNewFile: boolean;
+ isHidden?: boolean;
+ isLocked?: boolean;
+}) => {
+ let currentFileName = title;
+ if (getEditorTab(currentFileName)) return;
+ const editorSelector = document.createElement('a');
+ editorSelector.href = '#';
+ editorSelector.classList.add('editor-title', 'noselect');
+ editorSelector.dataset.editor = currentFileName;
+ editorSelector.dataset.multiFile = 'true';
+ editorSelector.addEventListener('click', () => showEditor(currentFileName));
+
+ const label = document.createElement('span');
+ setLabelText(currentFileName);
+ label.title = currentFileName;
+ label.classList.add('truncate-text');
+ label.addEventListener('paste', removeFormatting, false);
+ editorSelector.appendChild(label);
+
+ function getLabelText() {
+ return label.innerText.trim().replaceAll('\n', '');
+ }
+
+ function setLabelText(text: string) {
+ const cleanText = text.trim().replaceAll('\n', '');
+ if (cleanText === '') {
+ label.innerText = text.replaceAll('\n', '');
+ return;
+ }
+ label.innerHTML = '';
+ const path = cleanText.split('/');
+ const fileName = path.pop() || '';
+ const folder = path.length > 0 ? path.join('/') + '/' : '';
+ const folderSpan = document.createElement('span');
+ folderSpan.innerText = folder;
+ label.appendChild(folderSpan);
+ const fileNameSpan = document.createElement('span');
+ fileNameSpan.innerText = fileName;
+ label.appendChild(fileNameSpan);
+ }
+
+ if (!isMainFile && !isLocked) {
+ const deleteButton = document.createElement('button');
+ deleteButton.classList.add('delete-file-button');
+ deleteButton.innerHTML = deleteIcon;
+ deleteButton.addEventListener('click', () => {
+ if (
+ confirm(
+ window.deps.translateString('core.confirm.deleteFile', 'Delete file: {{filename}}?', {
+ filename: currentFileName,
+ }),
+ )
+ ) {
+ deleteFile(currentFileName);
+ }
+ });
+ editorSelector.appendChild(deleteButton);
+ }
+
+ const selectAll = (element: HTMLElement) => {
+ const range = document.createRange();
+ range.selectNodeContents(element);
+ const selection = window.getSelection();
+ selection?.removeAllRanges();
+ selection?.addRange(range);
+ };
+
+ const accept = async () => {
+ label.contentEditable = 'false';
+ eventAttached = false;
+ if (isLocked) return;
+ setLabelText(getLabelText());
+ const success =
+ isNewFile && typeof addFile === 'function'
+ ? await addFile(getLabelText())
+ : renameFile(currentFileName, getLabelText());
+ if (!success) {
+ onDblClick();
+ return;
+ }
+ currentFileName = handleSlash(getLabelText());
+ label.title = currentFileName;
+ setLabelText(currentFileName);
+ label.style.maxWidth = '';
+ showEditor(currentFileName);
+ if (isNewFile) {
+ // a new tab is created. remove this one
+ editorSelector.remove();
+ }
+ isNewFile = false;
+ };
+
+ const onKeyDown = (e: KeyboardEvent) => {
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ accept();
+ }
+ if (e.key === 'Tab') {
+ accept();
+ }
+ if (e.key === 'Escape') {
+ label.contentEditable = 'false';
+ if (isNewFile) {
+ editorSelector.remove();
+ } else {
+ setLabelText(currentFileName);
+ }
+ }
+ };
+
+ const onBlur = () => {
+ if (label.contentEditable === 'true') {
+ accept();
+ }
+ };
+
+ let eventAttached = false;
+ const onDblClick = () => {
+ if (isLocked || !getEditorSelector()?.contains(label)) return;
+ label.contentEditable = 'true';
+ label.style.maxWidth = 'unset';
+ requestAnimationFrame(() => {
+ label.focus();
+ selectAll(label);
+ if (!eventAttached) {
+ label.addEventListener('blur', onBlur);
+ eventAttached = true;
+ }
+ });
+ };
+
+ const onF2 = (ev: KeyboardEventInit) => {
+ if (ev.key === 'F2') {
+ onDblClick();
+ }
+ };
+
+ editorSelector.addEventListener('dblclick', onDblClick);
+ editorSelector.addEventListener('keydown', onF2);
+ label.addEventListener('keydown', onKeyDown);
+
+ const scrollTo = document.querySelector('#multi-file-scroll-to');
+ getEditorTabScroller()?.insertBefore(editorSelector, scrollTo);
+
+ if (isNewFile) {
+ scrollTo?.scrollIntoView({ behavior: 'smooth', inline: 'end', block: 'end' });
+ onDblClick();
+ }
+ if (isHidden) {
+ editorSelector.style.display = 'none';
+ }
+};
+
+const handleEditorTabScroll = () => {
+ const scroller = getEditorTabScroller();
+ const startBtn = getEditorScrollerStart() as HTMLElement;
+ const endBtn = getEditorScrollerEnd() as HTMLElement;
+ if (!scroller || !startBtn || !endBtn) return;
+ const isRTL = () => document.documentElement.dir === 'rtl';
+
+ // TODO: use CSS @container scroll-state instead when it has better browser support
+ const updateScrollButtons = () => {
+ if (!scroller || !startBtn || !endBtn) return;
+ const canScrollLeft = scroller.scrollLeft > 0;
+ const canScrollRight = scroller.scrollLeft < scroller.scrollWidth - scroller.clientWidth;
+ startBtn.classList.toggle('hidden', !canScrollLeft && !isRTL());
+ endBtn.classList.toggle('hidden', !canScrollRight && !isRTL());
+ };
+
+ startBtn.addEventListener('click', () => {
+ scroller.scrollBy({
+ left: isRTL() ? scroller.clientWidth : -scroller.clientWidth,
+ behavior: 'smooth',
+ });
+ updateScrollButtons();
+ });
+ endBtn.addEventListener('click', () => {
+ scroller.scrollBy({
+ left: isRTL() ? -scroller.clientWidth : scroller.clientWidth,
+ behavior: 'smooth',
+ });
+ updateScrollButtons();
+ });
+
+ scroller.addEventListener('scroll', updateScrollButtons);
+ window.addEventListener('resize', updateScrollButtons);
+ updateScrollButtons();
+};
+
+export const createAddFileButton = ({ onclick: handleAddFileClick }: { onclick: () => void }) => {
+ if (document.querySelector('#add-file-button')) return;
+ const addFileButton = document.createElement('button');
+ addFileButton.id = 'add-file-button';
+ addFileButton.classList.add('app-menu-button', 'menu');
+ addFileButton.innerHTML =
+ '';
+ addFileButton.addEventListener('click', handleAddFileClick);
+ getEditorSelector()?.appendChild(addFileButton);
+
+ const scrollTo = document.createElement('div');
+ scrollTo.id = 'multi-file-scroll-to';
+ getEditorTabScroller()?.appendChild(scrollTo);
};
export const createProcessorItem = (processor: { name: string; title: string }) => {
@@ -189,3 +421,4 @@ const getLanguageInfo = async (language: Language | Processor, baseUrl: string)
};
const infoIcon = '';
+const deleteIcon = '';
diff --git a/src/livecodes/UI/import.ts b/src/livecodes/UI/import.ts
index 59e1dafd69..0775331199 100644
--- a/src/livecodes/UI/import.ts
+++ b/src/livecodes/UI/import.ts
@@ -1,8 +1,7 @@
import { defaultConfig } from '../config/default-config';
import { importScreen } from '../html';
-import { importFromFiles } from '../import/files';
+import type { importFromFiles as importFromFilesFn } from '../import/files';
import { importCode } from '../import/import';
-import type { populateConfig as populateConfigFn } from '../import/utils';
import type {
Config,
ContentConfig,
@@ -63,7 +62,7 @@ export const createImportUI = ({
eventsManager,
getUser,
loadConfig,
- populateConfig,
+ importFromFiles,
projectStorage,
showScreen,
}: {
@@ -73,7 +72,7 @@ export const createImportUI = ({
eventsManager: EventsManager;
getUser: (() => Promise) | undefined;
loadConfig: (newConfig: Partial, url?: string) => Promise;
- populateConfig: typeof populateConfigFn;
+ importFromFiles: typeof importFromFilesFn;
projectStorage: ProjectStorage | undefined;
showScreen: (screen: Screen['screen'], options?: any) => Promise;
}) => {
@@ -95,7 +94,7 @@ export const createImportUI = ({
{
...defaultConfig,
...imported,
- },
+ } as Partial,
location.origin + location.pathname + '?x=' + encodeURIComponent(url),
);
modal.close();
@@ -111,10 +110,14 @@ export const createImportUI = ({
const codeImportInput = getCodeImportInput(importContainer);
eventsManager.addEventListener(codeImportInput, 'change', () => {
- if (!codeImportInput.files?.length) return;
+ const files = codeImportInput.files;
+ if (!files?.length) return;
notifications.info(window.deps.translateString('generic.loading', 'Loading...'));
- importFromFiles(codeImportInput.files, populateConfig, eventsManager)
- .then(loadConfig)
+ importFromFiles({ files })
+ .then((fileConfig) => {
+ if (Object.keys(fileConfig).length === 0) return;
+ return loadConfig(fileConfig as Partial);
+ })
.then(modal.close)
.catch((message) => {
notifications.error(message);
diff --git a/src/livecodes/UI/selectors.ts b/src/livecodes/UI/selectors.ts
index 85949ee8e8..1bf983dc00 100644
--- a/src/livecodes/UI/selectors.ts
+++ b/src/livecodes/UI/selectors.ts
@@ -120,6 +120,9 @@ export const getEditorTitles = /* @__PURE__ */ () =>
export const getEditorDivs = /* @__PURE__ */ () =>
document.querySelectorAll('#editors > .editor');
+export const getMultiFileEditorDivs = /* @__PURE__ */ () =>
+ document.querySelectorAll('#editors > .editor[data-multi-file]');
+
export const getToolspaneElement = /* @__PURE__ */ () =>
document.querySelector('#output #tools-pane') as HTMLElement;
@@ -180,6 +183,20 @@ export const getModalUnsavedLastModified = /* @__PURE__ */ () =>
export const getModalDisableRecoverCheckbox = /* @__PURE__ */ () =>
document.querySelector('#modal #disable-recover-checkbox') as HTMLInputElement;
+export const getEditorSelector = /* @__PURE__ */ () => document.querySelector('#select-editor');
+
+export const getEditorTabScroller = /* @__PURE__ */ () =>
+ document.querySelector('#select-editor > div.editors-scroller');
+
+export const getEditorScrollerStart = /* @__PURE__ */ () =>
+ document.querySelector('#select-editor .editor-scroll-start');
+
+export const getEditorScrollerEnd = /* @__PURE__ */ () =>
+ document.querySelector('#select-editor .editor-scroll-end');
+
+export const getEditorTab = /* @__PURE__ */ (editorId: string) =>
+ document.querySelector(`#select-editor .editor-title[data-editor="${editorId}"]`);
+
export const getLanguageMenuLinks = /* @__PURE__ */ () =>
document.querySelectorAll('#select-editor .language-item a');
@@ -491,6 +508,9 @@ export const getStarterTemplatesTab = /* @__PURE__ */ (templatesContainer: HTMLE
export const getStarterTemplatesList = /* @__PURE__ */ (templatesContainer: HTMLElement) =>
templatesContainer.querySelector('#starter-templates-list');
+export const getMultifileTemplatesList = /* @__PURE__ */ (templatesContainer: HTMLElement) =>
+ templatesContainer.querySelector('#multifile-templates-list');
+
export const getUserTemplatesScreen = /* @__PURE__ */ (templatesContainer: HTMLElement) =>
templatesContainer.querySelector('#templates-user .modal-screen') as HTMLElement;
diff --git a/src/livecodes/UI/templates.ts b/src/livecodes/UI/templates.ts
index cc1db289ab..5f45dd4632 100644
--- a/src/livecodes/UI/templates.ts
+++ b/src/livecodes/UI/templates.ts
@@ -37,6 +37,7 @@ export const createStarterTemplateLink = (
baseUrl: string,
) => {
const li = document.createElement('li');
+ li.classList.add('starter-template');
li.dataset.id = template.id;
const link = document.createElement('a');
link.href = '?template=' + template.name;
@@ -97,14 +98,14 @@ export const addTemplateToIndex = ({
});
};
-export const setupTemplatesSearch = (container: HTMLElement) => {
+const setupTemplatesSearch = (container: HTMLElement) => {
const input = getTemplatesSearchInput(container);
if (!input) return;
const filterTemplates = (query: string) => {
searchIndex?.then(async (index) => {
const mainItems = container.querySelectorAll(
- '#templates-starter li',
+ 'li.starter-template',
) as NodeListOf;
const userItems = container.querySelectorAll('#templates-user li') as NodeListOf;
const items = Array.from(mainItems).concat(Array.from(userItems));
diff --git a/src/livecodes/_modules.ts b/src/livecodes/_modules.ts
index 7b329cd6e8..ed5fd0848c 100644
--- a/src/livecodes/_modules.ts
+++ b/src/livecodes/_modules.ts
@@ -8,8 +8,6 @@
* @module
*/
-export * as UI from './UI';
-export * as modal from './UI/modal';
export * as cache from './cache';
export * as compiler from './compiler';
export * as config from './config';
@@ -30,5 +28,7 @@ export * as sync from './sync';
export * as templates from './templates';
export * as toolspane from './toolspane';
export * as types from './types';
+export * as UI from './UI';
+export * as modal from './UI/modal';
export * as utils from './utils';
export * as vendors from './vendors';
diff --git a/src/livecodes/cache/cache.ts b/src/livecodes/cache/cache.ts
index e138d74dad..698f9f1333 100644
--- a/src/livecodes/cache/cache.ts
+++ b/src/livecodes/cache/cache.ts
@@ -1,4 +1,5 @@
import { defaultConfig, getContentConfig } from '../config';
+import { getMainFile, getSource } from '../config/utils';
import type { Cache, Code, EditorId, Language } from '../models';
const defaultContentConfig = getContentConfig(defaultConfig);
@@ -8,6 +9,8 @@ const initialCache: Cache = {
style: { ...defaultContentConfig.style, compiled: '', modified: '' },
script: { ...defaultContentConfig.script, compiled: '', modified: '' },
tests: { language: 'javascript', ...defaultContentConfig.tests, compiled: '' },
+ files: [],
+ mainFile: undefined,
result: '',
styleOnlyUpdate: false,
};
@@ -36,31 +39,51 @@ export const setCache = (newCache = initialCache) => {
compiled: '',
...newCache.tests,
},
+ files: newCache.files.map((f) => {
+ const cacheFile = cache.files.find((ff) => ff.filename === f.filename);
+ return {
+ modified: cacheFile?.compiled === f.compiled ? f.modified : '',
+ ...f,
+ };
+ }),
result: newCache.result || '',
};
};
export const updateCache = (editorId: EditorId, language: Language, modified: string) => {
- if (cache[editorId].language === language) {
- cache[editorId].modified = modified;
+ const src: any = getSource(editorId, cache);
+ if (src?.language === language) {
+ src.modified = modified;
}
};
-export const getCachedCode = (): Code => ({
- markup: {
- language: cache.markup.language,
- content: cache.markup.content || '',
- compiled: cache.markup.modified || cache.markup.compiled || '',
- },
- style: {
- language: cache.style.language,
- content: cache.style.content || '',
- compiled: cache.style.modified || cache.style.compiled || '',
- },
- script: {
- language: cache.script.language,
- content: cache.script.content || '',
- compiled: cache.script.modified || cache.script.compiled || '',
- },
- result: cache.result || '',
-});
+export const getCachedCode = (): Code =>
+ cache.files.length > 0
+ ? {
+ files: cache.files.map((f) => ({
+ filename: f.filename,
+ language: f.language,
+ content: f.content || '',
+ compiled: f.modified || f.compiled || '',
+ })),
+ mainFile: getMainFile(cache) || 'index.html',
+ result: cache.result || '',
+ }
+ : {
+ markup: {
+ language: cache.markup.language,
+ content: cache.markup.content || '',
+ compiled: cache.markup.modified || cache.markup.compiled || '',
+ },
+ style: {
+ language: cache.style.language,
+ content: cache.style.content || '',
+ compiled: cache.style.modified || cache.style.compiled || '',
+ },
+ script: {
+ language: cache.script.language,
+ content: cache.script.content || '',
+ compiled: cache.script.modified || cache.script.compiled || '',
+ },
+ result: cache.result || '',
+ };
diff --git a/src/livecodes/cache/utils.ts b/src/livecodes/cache/utils.ts
index 075996ac17..28cee48986 100644
--- a/src/livecodes/cache/utils.ts
+++ b/src/livecodes/cache/utils.ts
@@ -1,9 +1,9 @@
-import type { Cache, ContentConfig, EditorCache } from '../models';
+import type { Cache, ContentConfig } from '../models';
-const removeExtra = (editor: T, keys: Array) => {
- const contentEditor = { ...editor };
- keys.forEach((key) => delete contentEditor[key]);
- return contentEditor;
+const removeExtra = (obj: T, keys: Array) => {
+ const newObj = { ...obj };
+ keys.forEach((key) => delete newObj[key]);
+ return newObj;
};
export const cacheIsValid = (cache: Cache, config: ContentConfig) => {
const excludedKeys: Array = [
@@ -12,13 +12,14 @@ export const cacheIsValid = (cache: Cache, config: ContentConfig) => {
'description',
'tests',
];
- const extraCache: Array = ['compiled', 'modified'];
+ const extraCache: Array<'compiled' | 'modified'> = ['compiled', 'modified'];
const contentCache = {
...removeExtra(cache, ['result', 'styleOnlyUpdate', ...excludedKeys]),
markup: removeExtra(cache.markup, extraCache),
style: removeExtra(cache.style, extraCache),
script: removeExtra(cache.script, extraCache),
+ files: cache.files.map((f) => removeExtra(f, extraCache)),
};
const contentConfig = removeExtra(config, excludedKeys);
diff --git a/src/livecodes/compiler/__tests__/import-map.spec.ts b/src/livecodes/compiler/__tests__/import-map.spec.ts
index 5b1209ada8..c5634dc795 100644
--- a/src/livecodes/compiler/__tests__/import-map.spec.ts
+++ b/src/livecodes/compiler/__tests__/import-map.spec.ts
@@ -1,9 +1,11 @@
import type { Config } from '../../models';
import {
createImportMap,
+ getStyleImports,
hasStyleImports,
replaceImports,
replaceStyleImports,
+ resolvePath,
} from '../import-map';
describe('Import map', () => {
@@ -180,4 +182,137 @@ body {
const processedCode = replaceStyleImports(code);
expect(processedCode).toEqual(expectedCode);
});
+
+ test('get style imports', () => {
+ const code = `
+@import "github-markdown-css-1";
+@import "jsdelivr:github-markdown-css-2";
+@import "https://cdn.jsdelivr.net/npm/github-markdown-css-3";
+@import 'https://cdn.jsdelivr.net/npm/github-markdown-css-4';
+@import url("https://cdn.jsdelivr.net/npm/github-markdown-css-5");
+@import url('https://cdn.jsdelivr.net/npm/github-markdown-css-6');
+@import url(https://cdn.jsdelivr.net/npm/github-markdown-css-7);
+@import url(https://cdn.jsdelivr.net/npm/github-markdown-css-8) print;
+@import "github-markdown-css-9" print;
+@import "github-markdown-css-10" screen and (orientation:landscape);
+@import "github-markdown-css-11" layer(layer-name);
+@import "github-markdown-css-12" layer(layer-name) supports(supports-condition);
+@import "github-markdown-css-13" layer(layer-name) supports(supports-condition) list-of-media-queries;
+@import "github-markdown-css-14" layer(layer-name) list-of-media-queries;
+@import "github-markdown-css-15" supports(supports-condition);
+@import "github-markdown-css-16" supports(supports-condition) list-of-media-queries;
+@import "github-markdown-css-17" list-of-media-queries;
+@import "./styles.css";
+
+body {
+ color: blue;
+} `;
+
+ const expectedImports = [
+ 'github-markdown-css-1',
+ 'jsdelivr:github-markdown-css-2',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-3',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-4',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-5',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-6',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-7',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css-8',
+ 'github-markdown-css-9',
+ 'github-markdown-css-10',
+ 'github-markdown-css-11',
+ 'github-markdown-css-12',
+ 'github-markdown-css-13',
+ 'github-markdown-css-14',
+ 'github-markdown-css-15',
+ 'github-markdown-css-16',
+ 'github-markdown-css-17',
+ './styles.css',
+ ];
+
+ const imports = getStyleImports(code);
+ expect(imports).toEqual(expectedImports);
+ });
+
+ test('get style imports (deduped)', () => {
+ const code = `
+@import "github-markdown-css";
+@import "jsdelivr:github-markdown-css";
+@import "https://cdn.jsdelivr.net/npm/github-markdown-css";
+@import 'https://cdn.jsdelivr.net/npm/github-markdown-css';
+@import url("https://cdn.jsdelivr.net/npm/github-markdown-css");
+@import url('https://cdn.jsdelivr.net/npm/github-markdown-css');
+@import url(https://cdn.jsdelivr.net/npm/github-markdown-css);
+@import url(https://cdn.jsdelivr.net/npm/github-markdown-css) print;
+@import "github-markdown-css" print;
+@import "github-markdown-css" screen and (orientation:landscape);
+@import "github-markdown-css" layer(layer-name);
+@import "github-markdown-css" layer(layer-name) supports(supports-condition);
+@import "github-markdown-css" layer(layer-name) supports(supports-condition) list-of-media-queries;
+@import "github-markdown-css" layer(layer-name) list-of-media-queries;
+@import "github-markdown-css" supports(supports-condition);
+@import "github-markdown-css" supports(supports-condition) list-of-media-queries;
+@import "github-markdown-css" list-of-media-queries;
+@import "./styles.css";
+
+body {
+ color: blue;
+} `;
+
+ const expectedImports = [
+ 'github-markdown-css',
+ 'jsdelivr:github-markdown-css',
+ 'https://cdn.jsdelivr.net/npm/github-markdown-css',
+ './styles.css',
+ ];
+
+ const imports = getStyleImports(code);
+ expect(imports).toEqual(expectedImports);
+ });
+
+ test('resolve path', () => {
+ expect(resolvePath('https://someurl/path', './script.js')).toEqual('https://someurl/path');
+ expect(resolvePath('https://someurl/path', 'script.js')).toEqual('https://someurl/path');
+ expect(resolvePath('https://someurl/path', './deep/script.js')).toEqual('https://someurl/path');
+ expect(resolvePath('https://someurl/path', 'deep/script.js')).toEqual('https://someurl/path');
+ expect(resolvePath('https://someurl/path')).toEqual('https://someurl/path');
+
+ const dataUrl =
+ 'data:text/javascript;charset=UTF-8;base64,Y29uc29sZS5sb2coIkhlbGxvLCBXb3JsZCEiKTs=';
+ expect(resolvePath(dataUrl, './script.js')).toEqual(dataUrl);
+ expect(resolvePath(dataUrl, 'script.js')).toEqual(dataUrl);
+ expect(resolvePath(dataUrl, './deep/script.js')).toEqual(dataUrl);
+ expect(resolvePath(dataUrl, 'deep/script.js')).toEqual(dataUrl);
+ expect(resolvePath(dataUrl)).toEqual(dataUrl);
+
+ expect(resolvePath('my-lib', './script.js')).toEqual('my-lib');
+ expect(resolvePath('my-lib', 'script.js')).toEqual('my-lib');
+ expect(resolvePath('my-lib', './deep/script.js')).toEqual('my-lib');
+ expect(resolvePath('my-lib', 'deep/script.js')).toEqual('my-lib');
+ expect(resolvePath('my-lib')).toEqual('my-lib');
+
+ expect(resolvePath('/utils.js', './script.js')).toEqual('./utils.js');
+ expect(resolvePath('/utils.js', 'script.js')).toEqual('./utils.js');
+ expect(resolvePath('/utils.js', './deep/script.js')).toEqual('./utils.js');
+ expect(resolvePath('/utils.js', 'deep/script.js')).toEqual('./utils.js');
+ expect(resolvePath('/utils.js')).toEqual('./utils.js');
+
+ expect(resolvePath('./utils.js', './script.js')).toEqual('./utils.js');
+ expect(resolvePath('./utils.js', 'script.js')).toEqual('./utils.js');
+ expect(resolvePath('./utils.js', './deep/script.js')).toEqual('./deep/utils.js');
+ expect(resolvePath('./utils.js', 'deep/script.js')).toEqual('./deep/utils.js');
+ expect(resolvePath('./utils.js')).toEqual('./utils.js');
+
+ expect(resolvePath('../utils.js', './script.js')).toEqual('./utils.js');
+ expect(resolvePath('../utils.js', 'script.js')).toEqual('./utils.js');
+ expect(resolvePath('../utils.js', './deep/script.js')).toEqual('./utils.js');
+ expect(resolvePath('../utils.js', 'deep/script.js')).toEqual('./utils.js');
+ expect(resolvePath('../utils.js')).toEqual('./utils.js');
+
+ expect(resolvePath('../path/utils.js', './script.js')).toEqual('./path/utils.js');
+ expect(resolvePath('../path/utils.js', 'script.js')).toEqual('./path/utils.js');
+ expect(resolvePath('../path/utils.js', './deep/script.js')).toEqual('./path/utils.js');
+ expect(resolvePath('../path/utils.js', 'deep/script.js')).toEqual('./path/utils.js');
+ expect(resolvePath('../path/utils.js', 'very/deep/script.js')).toEqual('./very/path/utils.js');
+ expect(resolvePath('../path/utils.js')).toEqual('./path/utils.js');
+ });
});
diff --git a/src/livecodes/compiler/compile-blocks.ts b/src/livecodes/compiler/compile-blocks.ts
index 085af05734..11e21e366c 100644
--- a/src/livecodes/compiler/compile-blocks.ts
+++ b/src/livecodes/compiler/compile-blocks.ts
@@ -1,4 +1,5 @@
import {
+ getFileExtension,
getLanguageByAlias,
getLanguageEditorId,
processorIsActivated,
@@ -6,7 +7,6 @@ import {
} from '../languages/utils';
import type { CompileInfo, Config } from '../models';
import { modulesService } from '../services/modules';
-import { getFileExtension } from '../utils/utils';
import { compileInCompiler } from './compile-in-compiler';
import { hasStyleImports } from './import-map';
import type { LanguageOrProcessor } from './models';
diff --git a/src/livecodes/compiler/compile-in-compiler.ts b/src/livecodes/compiler/compile-in-compiler.ts
index d7169c726c..dc9159f722 100644
--- a/src/livecodes/compiler/compile-in-compiler.ts
+++ b/src/livecodes/compiler/compile-in-compiler.ts
@@ -6,7 +6,7 @@ export const compileInCompiler = async (
content: string,
language: LanguageOrProcessor | undefined,
config: Config,
- options: CompileOptions = {},
+ options: CompileOptions = { filename: 'script' },
worker: Worker = self as unknown as Worker,
): Promise =>
new Promise((resolve) => {
diff --git a/src/livecodes/compiler/compile.worker.ts b/src/livecodes/compiler/compile.worker.ts
index b611303604..eed1bc19b5 100644
--- a/src/livecodes/compiler/compile.worker.ts
+++ b/src/livecodes/compiler/compile.worker.ts
@@ -1,6 +1,12 @@
import type TS from 'typescript';
import { getCompilerOptions } from '../editor/ts-compiler-options';
-import { getLanguageSpecs, languages, processors } from '../languages';
+import {
+ getFileExtension,
+ getLanguageByAlias,
+ getLanguageSpecs,
+ languages,
+ processors,
+} from '../languages';
import type {
CompileOptions,
CompileResult,
@@ -34,10 +40,11 @@ const worker: Worker & {
(self as any).deps = { languages, processors };
const loadLanguageCompiler = async (
- language: LanguageOrProcessor,
+ language: LanguageOrProcessor | undefined,
config: Config,
baseUrl: string | undefined,
) => {
+ if (!language) return;
if (!baseUrl) {
throw new Error('baseUrl is not set');
}
@@ -100,6 +107,8 @@ const compile = async (
config: Config,
options: CompileOptions,
) => {
+ language ??= getLanguageByAlias(language || getFileExtension(options.filename)) || 'html';
+
const compiler = compilers[language]?.fn;
if (!baseUrl || typeof compiler !== 'function') {
throw new Error('Failed to load compiler for: ' + language);
@@ -124,8 +133,13 @@ const loadTypeScript = async () => {
await loadLanguageCompiler('typescript', {} as Config, baseUrl);
};
-// see https://twitter.com/hatem_hosny_/status/1790644616175235323
-let resolveFn: ((value: EditorLibrary[]) => void) | undefined;
+const loadATA = doOnce(async () => {
+ await loadTypeScript();
+ if (!worker.typescriptATA) {
+ importScripts(typescriptAtaUrl);
+ }
+});
+
let ata: any;
const getTypesFromAta = async (code: string) =>
@@ -134,47 +148,35 @@ const getTypesFromAta = async (code: string) =>
resolve([]);
return;
}
-
- // load dependencies
- await loadTypeScript();
- if (!worker.typescriptATA) {
- importScripts(typescriptAtaUrl);
- }
+ await loadATA();
const setupTypeAcquisition = worker.typescriptATA.setupTypeAcquisition;
- // setup
const ataTypes: EditorLibrary[] = [];
- resolveFn = resolve;
- ata =
- ata ||
- setupTypeAcquisition({
- projectName: 'Playground',
- typescript: worker.ts,
- logger: {
- log: () => undefined,
- error: () => undefined,
- groupCollapsed: () => undefined,
- groupEnd: () => undefined,
+ ata ??= setupTypeAcquisition({
+ projectName: 'Playground',
+ typescript: worker.ts,
+ logger: {
+ log: () => undefined,
+ error: () => undefined,
+ groupCollapsed: () => undefined,
+ groupEnd: () => undefined,
+ },
+ delegate: {
+ receivedFile: (code: string, path: string) => {
+ ataTypes.push({ content: code, filename: path });
+ },
+ progress: (_downloaded: number, _total: number) => {
+ // console.log({ _downloaded, _total });
+ },
+ started: () => {
+ // console.log('ATA start');
},
- delegate: {
- receivedFile: (code: string, path: string) => {
- ataTypes.push({ content: code, filename: path });
- },
- progress: (_downloaded: number, _total: number) => {
- // console.log({ _downloaded, _total })
- },
- started: () => {
- // console.log('ATA start');
- },
- finished: (_files: Map) => {
- if (typeof resolveFn === 'function') {
- resolveFn(ataTypes);
- }
- },
+ finished: (_files: Map) => {
+ resolve(ataTypes);
},
- });
+ },
+ });
- // run ATA
ata(code);
});
@@ -277,15 +279,15 @@ const initCodemirrorTS = doOnce(async () => {
importScripts(comlinkBaseUrl + 'umd/comlink.js');
importScripts(typescriptVfsUrl);
importScripts(codeMirrorBaseUrl + 'codemirror-ts.worker.js');
+ const language = codemirrorWorker.language || 'tsx';
const { createWorker } = worker.CodemirrorTsWorker;
const { createDefaultMapFromCDN, createSystem, createVirtualTypeScriptEnvironment } =
worker.typescriptVFS;
- tsvfsMap = await createDefaultMapFromCDN(
- { target: worker.ts?.ScriptTarget.ES2022 },
- worker.ts?.version,
- false,
- worker.ts,
- );
+ const compilerOptions = {
+ ...getCompilerOptions(),
+ ...((getLanguageSpecs(language)?.editorSupport?.compilerOptions || {}) as TS.CompilerOptions),
+ };
+ tsvfsMap = await createDefaultMapFromCDN(compilerOptions, worker.ts?.version, false, worker.ts);
const system = createSystem(tsvfsMap);
const createTypeScriptEnvironment = (lang: Language) => {
const compilerOpts = {
@@ -294,7 +296,6 @@ const initCodemirrorTS = doOnce(async () => {
};
return createVirtualTypeScriptEnvironment(system, [], worker.ts, compilerOpts);
};
- const language = codemirrorWorker.language || 'tsx';
let env = createTypeScriptEnvironment(language);
codemirrorWorker = createWorker(() => env);
codemirrorWorker.language = language;
diff --git a/src/livecodes/compiler/create-compiler.ts b/src/livecodes/compiler/create-compiler.ts
index 57778ea587..004fc6e7a5 100644
--- a/src/livecodes/compiler/create-compiler.ts
+++ b/src/livecodes/compiler/create-compiler.ts
@@ -12,6 +12,7 @@ import type {
CompilerFunction,
Compilers,
Config,
+ EditorLibrary,
Language,
} from '../models';
import { getAppCDN, sandboxService } from '../services';
@@ -32,10 +33,12 @@ export const createCompiler = async ({
config,
baseUrl,
eventsManager,
+ getTypes,
}: {
config: Config;
baseUrl: string;
eventsManager: any;
+ getTypes: (code: string) => Promise;
}): Promise => {
let compilers: Compilers;
let compilerSandbox: Window;
@@ -71,6 +74,8 @@ export const createCompiler = async ({
scriptUrl: baseUrl + '{{hash:compiler-utils.js}}',
};
compilerSandbox.postMessage(configMessage, compilerOrigin);
+
+ sendTypesToCompiler();
});
const createLanguageCompiler =
@@ -88,7 +93,7 @@ export const createCompiler = async ({
message.payload.language === language &&
message.payload.content === content
) {
- window.removeEventListener('message', handler);
+ eventsManager.removeEventListener(window, 'message', handler);
if (message.type === 'compiled') {
resolve(message.payload.compiled);
@@ -97,7 +102,7 @@ export const createCompiler = async ({
}
}
};
- window.addEventListener('message', handler);
+ eventsManager.addEventListener(window, 'message', handler);
const compileMessage: CompilerMessage = {
type: 'compile',
@@ -167,7 +172,8 @@ export const createCompiler = async ({
);
const cache: {
- [key in Language]?: {
+ [key: string]: {
+ language: Language;
content: string;
compiled: string;
info: string;
@@ -188,17 +194,20 @@ export const createCompiler = async ({
const enabledProcessors = getActivatedProcessors(language, config);
const languageSettings = stringify(getCustomSettings(language, config));
+ const filename = options.filename;
if (
!options?.forceCompile &&
- cache[language]?.content === content &&
- cache[language]?.processors === enabledProcessors &&
- cache[language]?.languageSettings === languageSettings &&
- cache[language]?.compiled
+ language !== 'vue' && // Vue SFCs can defineProps from types in other files
+ cache[filename]?.language === language &&
+ cache[filename]?.content === content &&
+ cache[filename]?.processors === enabledProcessors &&
+ cache[filename]?.languageSettings === languageSettings &&
+ cache[filename]?.compiled
) {
return {
- code: cache[language]?.compiled || '',
- info: JSON.parse(cache[language]?.info || '{}'),
+ code: cache[filename]?.compiled || '',
+ info: JSON.parse(cache[filename]?.info || '{}'),
} as CompileResult;
}
@@ -209,7 +218,7 @@ export const createCompiler = async ({
const compiler = compilers[language]?.fn;
if (typeof compiler !== 'function') {
return new Promise((res) => {
- if (language !== 'html' && language !== 'css' && language !== 'javascript') {
+ if (language && language !== 'html' && language !== 'css' && language !== 'javascript') {
// eslint-disable-next-line no-console
console.error('Failed to load compiler for: ' + language);
}
@@ -227,14 +236,14 @@ export const createCompiler = async ({
...processed.info,
};
- cache[language] = {
+ cache[filename] = {
+ language,
content,
compiled: processed.code,
info: JSON.stringify(info),
processors: enabledProcessors,
languageSettings: stringify(getCustomSettings(language, config)),
};
-
return { code: processed.code, info };
};
@@ -310,10 +319,10 @@ export const createCompiler = async ({
) {
return;
}
- window.removeEventListener('message', handler);
+ eventsManager.removeEventListener(window, 'message', handler);
resolve(message.payload.data);
};
- window.addEventListener('message', handler);
+ eventsManager.addEventListener(window, 'message', handler);
const compileMessage: CompilerMessage = {
type: 'ts-features',
@@ -322,6 +331,28 @@ export const createCompiler = async ({
compilerSandbox.postMessage(compileMessage, compilerOrigin);
});
+ const sendTypesToCompiler = () => {
+ const handler = async (event: CompilerMessageEvent) => {
+ const message = event.data;
+ if (
+ event.origin !== compilerOrigin ||
+ event.source !== compilerSandbox ||
+ message.from !== 'compiler' ||
+ message.type !== 'ts-features' ||
+ message.payload.feature !== 'getTypes'
+ ) {
+ return;
+ }
+ const { id, feature, data } = message.payload;
+ const compileMessage: CompilerMessage = {
+ type: 'ts-features',
+ payload: { id, feature, data: await getTypes(data) },
+ };
+ compilerSandbox.postMessage(compileMessage, compilerOrigin);
+ };
+ eventsManager.addEventListener(window, 'message', handler);
+ };
+
await initialize();
return {
diff --git a/src/livecodes/compiler/get-compiler.ts b/src/livecodes/compiler/get-compiler.ts
index f1846d2129..c2382d658f 100644
--- a/src/livecodes/compiler/get-compiler.ts
+++ b/src/livecodes/compiler/get-compiler.ts
@@ -1,4 +1,4 @@
-import type { Config, EventsManager, Language } from '../models';
+import type { Config, EditorLibrary, EventsManager, Language } from '../models';
import { createCompiler } from './create-compiler';
import type { Compiler, LanguageOrProcessor } from './models';
import { getCompileResult } from './utils';
@@ -7,6 +7,7 @@ export const getCompiler = (options: {
config: Config;
baseUrl: string;
eventsManager: EventsManager;
+ getTypes: (code: string) => Promise;
}): Promise => {
const mode = options.config.mode;
if (mode === 'codeblock' || mode === 'editor') {
diff --git a/src/livecodes/compiler/import-map.ts b/src/livecodes/compiler/import-map.ts
index a915cd0040..285cb2f961 100644
--- a/src/livecodes/compiler/import-map.ts
+++ b/src/livecodes/compiler/import-map.ts
@@ -1,8 +1,7 @@
-import type { CompileInfo, Config, Language } from '../models';
+import type { Config, Language } from '../models';
import { modulesService } from '../services/modules';
import {
escapeCode,
- getFileExtension,
getValidUrl,
removeComments,
removeCommentsAndStrings,
@@ -11,25 +10,29 @@ import {
} from '../utils/utils';
import { compileInCompiler } from './compile-in-compiler';
-// https://regexr.com/8a2j7
+// https://regexr.com/8hs1i
export const importsPattern =
- /(import\s+?(?:(?:(?:[\w*\s{},\$]*)\s+from\s+?)|))((?:".*?")|(?:'.*?'))([\s]*?(?:;|$|))/g;
+ /((?:im|ex)port\s+?(?:(?:(?:[\w*\s{},\$]*)\s+from\s+?)|))((?:".*?")|(?:'.*?'))([\s]*?(?:;|$|))/g;
// https://regexr.com/8a2ja
export const dynamicImportsPattern = /(import\s*?\(\s*?((?:".*?")|(?:'.*?'))\s*?\))/g;
export const getImports = (code: string, removeSpecifier = false) =>
- [
- ...[...removeComments(code).matchAll(new RegExp(importsPattern))],
- ...[...removeComments(code).matchAll(new RegExp(dynamicImportsPattern))],
- ]
- .map((arr) => arr[2].replace(/"/g, '').replace(/'/g, ''))
- .map((mod) => {
- if (!removeSpecifier || !isBare(mod) || !mod.includes(':')) {
- return mod;
- }
- return mod.split(':')[1];
- });
+ Array.from(
+ new Set(
+ [
+ ...[...removeComments(code).matchAll(new RegExp(importsPattern))],
+ ...[...removeComments(code).matchAll(new RegExp(dynamicImportsPattern))],
+ ]
+ .map((arr) => arr[2].replace(/"/g, '').replace(/'/g, ''))
+ .map((mod) => {
+ if (!removeSpecifier || !isBare(mod) || !mod.includes(':')) {
+ return mod;
+ }
+ return mod.split(':')[1];
+ }),
+ ),
+ );
const needsBundler = /* @__PURE__ */ (mod: string) =>
!mod.startsWith('https://deno.bundlejs.com/') &&
@@ -61,6 +64,9 @@ const isStylesheet = /* @__PURE__ */ (mod: string) =>
mod.endsWith('.styl')) &&
!mod.startsWith('./style');
+const isRelative = /* @__PURE__ */ (mod: string) =>
+ mod.startsWith('./') || mod.startsWith('../') || mod.startsWith('/');
+
export const findImportMapKey = /* @__PURE__ */ (mod: string, importmap: Record) =>
Object.keys(importmap).find((key) => key === mod || mod.startsWith(key + '/'));
@@ -71,7 +77,11 @@ export const createImportMap = (
) =>
getImports(code)
.map((libName) => {
- if ((!needsBundler(libName) && !isBare(libName)) || isStylesheet(libName)) {
+ if (
+ isRelative(libName) ||
+ (!needsBundler(libName) && !isBare(libName)) ||
+ isStylesheet(libName)
+ ) {
return {};
} else {
const imports = { ...config.imports, ...config.customSettings?.imports };
@@ -116,12 +126,18 @@ export const replaceImports = (
{ importMap, external }: { importMap?: Record; external?: string } = {},
) => {
importMap = importMap || createImportMap(code, config, { external });
- return code.replace(new RegExp(importsPattern), (statement) => {
- if (!importMap) {
- return statement;
- }
+
+ // sort keys (replace `lib/internal` before `lib`)
+ const mapkeys = Object.keys(importMap);
+ mapkeys.sort((a, b) => b.localeCompare(a));
+ const mapCopy = { ...importMap };
+ importMap = mapkeys.reduce((acc, key) => ({ ...acc, [key]: mapCopy[key] }), {});
+
+ const replaceFn = (pattern: RegExp) => (statement: string) => {
+ if (!importMap) return statement;
+
const libName = statement
- .replace(new RegExp(importsPattern), '$2')
+ .replace(new RegExp(pattern), '$2')
.replace(/"/g, '')
.replace(/'/g, '');
@@ -130,7 +146,11 @@ export const replaceImports = (
return statement;
}
return statement.replace(key, importMap[key]);
- });
+ };
+
+ return code
+ .replace(new RegExp(importsPattern), replaceFn(importsPattern))
+ .replace(new RegExp(dynamicImportsPattern), replaceFn(dynamicImportsPattern));
};
export const isScriptImport = (mod: string) =>
@@ -162,6 +182,7 @@ export const replaceSFCImports = async (
config,
isSfc,
getLanguageByAlias,
+ getFileExtension,
compileSFC,
external,
}: {
@@ -169,14 +190,17 @@ export const replaceSFCImports = async (
filename: string;
isSfc: (mod: string) => boolean;
getLanguageByAlias: (alias: string) => Language | undefined;
+ getFileExtension: (filename: string) => string;
compileSFC: (code: string, options: { filename: string; config: Config }) => Promise;
external?: string;
},
) => {
+ const isMultiFile = config.files.length > 0;
+ const exclude = (mod: string) => isMultiFile && (mod.startsWith('.') || mod.startsWith('/'));
const isExtensionless = (mod: string) =>
mod.startsWith('.') && !mod.split('/')[mod.split('/').length - 1].includes('.');
const sfcImports = getImports(code).filter(
- (mod) => isSfc(mod) || isExtensionless(mod) || mod.startsWith('.'),
+ (mod) => !exclude(mod) && (isSfc(mod) || isExtensionless(mod) || mod.startsWith('.')),
);
const projectImportMap = {
...config.imports,
@@ -213,11 +237,19 @@ export const replaceSFCImports = async (
(
await compileInCompiler(
content,
- getLanguageByAlias(getFileExtension(url)) || 'javascript',
+ getLanguageByAlias(getFileExtension(url.split('/').pop() || '')) || 'javascript',
config,
)
).code,
- { filename: url, config, isSfc, getLanguageByAlias, compileSFC, external },
+ {
+ filename: url,
+ config,
+ isSfc,
+ getLanguageByAlias,
+ getFileExtension,
+ compileSFC,
+ external,
+ },
);
if (!compiled) return;
const dataUrl = toDataUrl(compiled);
@@ -236,12 +268,40 @@ export const removeImports = (code: string, mods: string[]) =>
return mods.includes(libName) ? '' : statement;
});
+export const resolvePath = (path: string, currentPath = './index.html') => {
+ if (!path.startsWith('.') && !path.startsWith('/')) return path;
+ const baseUrl = 'https://localhost';
+ const basePath = new URL(currentPath, baseUrl).href;
+ try {
+ const url = new URL(path, basePath).href;
+ return url.replace(baseUrl, '.');
+ } catch {
+ return null;
+ }
+};
+
+// https://regexr.com/8hrlf
export const styleimportsPattern =
- /(?:@import\s+?)((?:".*?")|(?:'.*?')|(?:url\('.*?'\))|(?:url\(".*?"\)))(.*)?;/g;
+ /(?:@import\s+?)((?:".*?")|(?:'.*?')|(?:url\('?.*?'?\))|(?:url\(".*?"\)))(.*)?;/g;
export const hasStyleImports = (code: string) => new RegExp(styleimportsPattern).test(code);
-export const replaceStyleImports = (code: string, exceptions?: string[] | RegExp[]) =>
+export const getStyleImports = (code: string) =>
+ Array.from(
+ new Set(
+ [...removeComments(code).matchAll(new RegExp(styleimportsPattern))].map((arr) =>
+ arr[1].replace(/url\(/g, '').replace(/\)/g, '').replace(/"/g, '').replace(/'/g, ''),
+ ),
+ ),
+ );
+
+export const replaceStyleImports = (
+ code: string,
+ {
+ exceptions,
+ stylesImportMap,
+ }: { exceptions?: string[] | RegExp[]; stylesImportMap?: Record } = {},
+) =>
code.replace(new RegExp(styleimportsPattern), (statement, match, media) => {
if (
exceptions?.some(
@@ -257,13 +317,20 @@ export const replaceStyleImports = (code: string, exceptions?: string[] | RegExp
.replace(/'/g, '')
.replace(/url\(/g, '')
.replace(/\)/g, '');
- const modified = '@import "' + modulesService.getUrl(url) + '";';
+
+ if (!url) return statement;
+ const isRelativeUrl = isRelative(url);
+ const modified = `@import "${
+ stylesImportMap?.[url] || (isRelativeUrl ? url : modulesService.getUrl(url))
+ }";`;
const mediaQuery = media?.trim();
- return !isBare(url)
- ? statement
- : mediaQuery
- ? `@media ${mediaQuery} {\n${modified}\n}`
- : modified;
+ return isRelativeUrl
+ ? modified
+ : !isBare(url)
+ ? statement
+ : mediaQuery
+ ? `@media ${mediaQuery} {\n${modified}\n}`
+ : modified;
});
// based on https://github.com/sveltejs/svelte-repl/blob/master/src/workers/bundler/plugins/commonjs.js
@@ -311,7 +378,7 @@ export const cjs2esm = (code: string) => {
export const createCSSModulesImportMap = (
compiledScript: string,
compiledStyle: string,
- cssTokens: CompileInfo['cssModules'] = {},
+ cssTokens: Record = {},
extension: Language = 'css',
) => {
const scriptImports = getImports(compiledScript);
diff --git a/src/livecodes/compiler/models.ts b/src/livecodes/compiler/models.ts
index 44d58cb06d..3360cb0b97 100644
--- a/src/livecodes/compiler/models.ts
+++ b/src/livecodes/compiler/models.ts
@@ -19,7 +19,8 @@ export type TypescriptFeatures =
| 'ata'
| 'initCodeMirrorTS'
| 'changeCodeMirrorLanguage'
- | 'addTypes';
+ | 'addTypes'
+ | 'getTypes';
export interface CompilerMessageEvent extends MessageEvent {
data: CompilerMessage;
}
diff --git a/src/livecodes/config/__tests__/build-config.spec.ts b/src/livecodes/config/__tests__/build-config.spec.ts
index db6f2ea8c9..0e238c6775 100644
--- a/src/livecodes/config/__tests__/build-config.spec.ts
+++ b/src/livecodes/config/__tests__/build-config.spec.ts
@@ -505,12 +505,37 @@ describe('loadParamConfig', () => {
expect(output.customSettings).toEqual({ template: { prerender: false } });
});
- test('?markup.hideTitle=true&script.title=App.jsx', () => {
+ test('?markup.hidden=true&script.title=App.jsx', () => {
const output: Partial = loadParamConfig(defaultConfig, {
- 'markup.hideTitle': true,
+ 'markup.hidden': true,
'script.title': 'App.jsx',
});
- expect(output.markup?.hideTitle).toEqual(true);
+ expect(output.markup?.hidden).toEqual(true);
expect(output.script?.title).toEqual('App.jsx');
});
+
+ test('?files', () => {
+ const output: Partial = loadParamConfig(defaultConfig, {
+ files: true,
+ });
+ expect(output.files).toEqual([{ filename: 'index.html', language: 'html', content: '' }]);
+ });
+
+ test('?files=index.html,style.css,script.js', () => {
+ const output: Partial = loadParamConfig(defaultConfig, {
+ files: 'index.html,style.css,script.js',
+ });
+ expect(output.files).toEqual([
+ { filename: 'index.html', language: 'html', content: '' },
+ { filename: 'style.css', language: 'css', content: '' },
+ { filename: 'script.js', language: 'javascript', content: '' },
+ ]);
+ });
+
+ test('?fileLanguages=jsx:solid,tsx:solid.tsx', () => {
+ const output: Partial = loadParamConfig(defaultConfig, {
+ fileLanguages: 'jsx:solid,tsx:solid.tsx',
+ });
+ expect(output.fileLanguages).toEqual({ jsx: 'solid', tsx: 'solid.tsx' });
+ });
});
diff --git a/src/livecodes/config/build-config.ts b/src/livecodes/config/build-config.ts
index 77eb0fa0b6..8604e636ae 100644
--- a/src/livecodes/config/build-config.ts
+++ b/src/livecodes/config/build-config.ts
@@ -1,17 +1,19 @@
-import { getLanguageByAlias, getLanguageEditorId } from '../languages';
+import { getFileLanguage, getLanguageByAlias, getLanguageEditorId } from '../languages';
import type {
Config,
EditorId,
Language,
Processor,
+ SDKConfig,
Tool,
ToolsPaneStatus,
UrlQueryParams,
} from '../models';
import { addProp, cloneObject, decodeHTML, removeDuplicates, stringToValidJson } from '../utils';
import { decompress } from '../utils/compression';
+import { upgradeAndValidate } from './config';
import { defaultConfig } from './default-config';
-import { upgradeAndValidate } from './index';
+import { getMainFile, isEditorId } from './utils';
/**
* Builds and validates a configuration object by merging default config with user config and URL params
@@ -26,7 +28,7 @@ import { upgradeAndValidate } from './index';
* 4. Sets active editor
* 5. Fixes language names in final config
*/
-export const buildConfig = (appConfig: Partial): Config => {
+export const buildConfig = (appConfig: Partial): Config => {
if (!appConfig) return { ...defaultConfig };
const userConfig = upgradeAndValidate(appConfig);
@@ -47,11 +49,14 @@ export const buildConfig = (appConfig: Partial): Config => {
...config,
...paramsConfig,
};
- const activeEditor = config.activeEditor || 'markup';
+
+ const activeEditor = config.activeEditor || config.files[0]?.filename || 'markup';
+ const mainFile = getMainFile(config);
config = fixLanguageNames({
...config,
activeEditor,
+ mainFile,
});
return config;
};
@@ -155,6 +160,7 @@ export const loadParamConfig = (config: Config, params: UrlQueryParams): Partial
// ?console
// ?tests=full
// ?lite
+ // ?files
// initialize paramsConfig with defaultConfig keys and params values
const paramsConfig = ([...Object.keys(defaultConfig)] as Array)
@@ -168,12 +174,45 @@ export const loadParamConfig = (config: Config, params: UrlQueryParams): Partial
);
// populate params config from query string params
+ // ?fileLanguages=jsx:solid,tsx:solid.tsx
+ if (paramsConfig.fileLanguages) {
+ paramsConfig.fileLanguages = (paramsConfig.fileLanguages as string)
+ .trim()
+ .split(',')
+ .reduce((acc, l) => {
+ const [extension, alias] = l.trim().split(':');
+ const language = getLanguageByAlias(alias);
+ if (!language) return acc;
+ return {
+ ...acc,
+ [extension]: getLanguageByAlias(language),
+ };
+ }, {});
+ }
+
+ // ?files
+ // ?files=index.html,style.css,script.js
+ if (paramsConfig.files) {
+ if (typeof paramsConfig.files === 'string') {
+ paramsConfig.files = (paramsConfig.files as string)
+ .trim()
+ .split(',')
+ .map((f) => ({
+ filename: f.trim(),
+ content: '',
+ language: getFileLanguage(f.trim(), paramsConfig) || 'javascript',
+ }));
+ } else {
+ paramsConfig.files = [{ filename: 'index.html', language: 'html', content: '' }];
+ }
+ }
+
// ?html=hi&scss&ts
(Object.keys(params) as Array).forEach((key) => {
const language = getLanguageByAlias(key);
if (!language) return;
const editorId = getLanguageEditorId(language);
- if (editorId && !paramsConfig[editorId]) {
+ if (editorId && isEditorId(editorId) && !paramsConfig[editorId]) {
const value = params[key];
const content = typeof value === 'string' ? decodeHTML(value) : '';
paramsConfig[editorId] = { language, content };
@@ -186,7 +225,7 @@ export const loadParamConfig = (config: Config, params: UrlQueryParams): Partial
// ?lang=js
const lang: any = getLanguageByAlias(params.language || params.lang);
const editorId = getLanguageEditorId(lang);
- if (editorId) {
+ if (editorId && isEditorId(editorId)) {
if (paramsConfig[editorId]?.language === lang) {
paramsConfig.activeEditor = editorId;
} else if (!paramsConfig[editorId]?.content && config[editorId]?.language === lang) {
@@ -217,7 +256,7 @@ export const loadParamConfig = (config: Config, params: UrlQueryParams): Partial
? paramsActive
: paramsActive in editorIds // ?active=1
? editorIds[paramsActive]
- : paramsConfig.activeEditor;
+ : paramsActiveEditor || paramsActive || paramsConfig.activeEditor;
// ?languages=html,md,css,ts
if (typeof params.languages === 'string') {
@@ -367,7 +406,7 @@ export const loadParamConfig = (config: Config, params: UrlQueryParams): Partial
}
}
- // ?markup.hideTitle=true&script.title=App.jsx
+ // ?markup.hidden=true&script.title=App.jsx
// ?customSettings.template.prerender=false
Object.keys(params).forEach((k) => {
if (
diff --git a/src/livecodes/config/config.ts b/src/livecodes/config/config.ts
index e148f674a7..5b2080382a 100644
--- a/src/livecodes/config/config.ts
+++ b/src/livecodes/config/config.ts
@@ -4,6 +4,9 @@ import type {
ContentConfig,
EditorConfig,
FormatterConfig,
+ MultiFileConfig,
+ SDKConfig,
+ SingleFileConfig,
UserConfig,
} from '../models';
import { cloneObject } from '../utils';
@@ -30,6 +33,10 @@ export const getContentConfig = (config: Config | ContentConfig): ContentConfig
markup: config.markup,
style: config.style,
script: config.script,
+ files: config.files,
+ mainFile: config.mainFile,
+ fileLanguages: config.fileLanguages,
+ lockFiles: config.lockFiles,
stylesheets: config.stylesheets,
scripts: config.scripts,
cssPreset: config.cssPreset,
@@ -97,5 +104,30 @@ export const getFormatterConfig = (config: Config | UserConfig): FormatterConfig
trailingComma: config.trailingComma,
});
-export const upgradeAndValidate = (config: Partial) =>
+export const getSingleFileConfig = (
+ config: Config | ContentConfig | SDKConfig,
+): SingleFileConfig => {
+ const { files, mainFile, fileLanguages, lockFiles, ...SingleFileConfig } = config;
+ return cloneObject(SingleFileConfig);
+};
+
+export const getMultiFileConfig = (config: Config | ContentConfig | SDKConfig): MultiFileConfig => {
+ const {
+ markup,
+ style,
+ script,
+ stylesheets,
+ scripts,
+ cssPreset,
+ htmlAttrs,
+ head,
+ ...multiFileConfig
+ } = config;
+ return cloneObject(multiFileConfig);
+};
+
+export const getSDKConfig = (config: Config | ContentConfig | SDKConfig): SDKConfig =>
+ config.files.length ? getMultiFileConfig(config) : getSingleFileConfig(config);
+
+export const upgradeAndValidate = (config: Partial) =>
validateConfig(upgradeConfig(config as any));
diff --git a/src/livecodes/config/default-config.ts b/src/livecodes/config/default-config.ts
index a72c2c66ad..3874fb7c4e 100644
--- a/src/livecodes/config/default-config.ts
+++ b/src/livecodes/config/default-config.ts
@@ -40,6 +40,10 @@ export const defaultConfig: Config = {
stylesheets: [],
scripts: [],
cssPreset: '',
+ files: [],
+ mainFile: undefined,
+ fileLanguages: {},
+ lockFiles: false,
imports: {},
types: {},
tests: {
diff --git a/src/livecodes/config/upgrade-config.ts b/src/livecodes/config/upgrade-config.ts
index 822196d883..2664a4fd11 100644
--- a/src/livecodes/config/upgrade-config.ts
+++ b/src/livecodes/config/upgrade-config.ts
@@ -7,6 +7,21 @@ interface genericConfig extends Config {
}
const upgradeSteps = [
+ {
+ to: '48',
+ upgrade: (oldConfig: genericConfig, version: string): genericConfig => {
+ const config: genericConfig = clone(oldConfig);
+ ['markup', 'style', 'script'].forEach((prop) => {
+ if (config[prop] && 'hideTitle' in config[prop] && !('hidden' in config[prop])) {
+ config[prop] = renameProperty(config[prop], 'hideTitle', 'hidden');
+ }
+ });
+ return {
+ ...config,
+ version,
+ };
+ },
+ },
{
to: '18',
upgrade: (oldConfig: genericConfig, version: string): genericConfig => {
diff --git a/src/livecodes/config/utils.ts b/src/livecodes/config/utils.ts
new file mode 100644
index 0000000000..f90b540b22
--- /dev/null
+++ b/src/livecodes/config/utils.ts
@@ -0,0 +1,46 @@
+import {
+ getFileLanguage,
+ getLanguageEditorId,
+ languageIsEnabled,
+ supportsMultiFile,
+} from '../languages/utils';
+import type { Cache, Config, EditorId } from '../models';
+import { handleSlash } from '../utils/utils';
+
+export const isEditorId = (editorId: string): editorId is 'markup' | 'style' | 'script' =>
+ editorId === 'markup' || editorId === 'style' || editorId === 'script';
+
+export const getSource = (
+ editorId: EditorId,
+ config: T,
+): T['markup'] | T['files'][0] | undefined =>
+ isEditorId(editorId) ? config[editorId] : config.files.find((f) => f.filename === editorId);
+
+export const getMainFile = (config: { mainFile?: string; files?: Config['files'] }) =>
+ !config.files?.length
+ ? undefined
+ : config.mainFile && config.files.find((f) => f.filename === config.mainFile)
+ ? config.mainFile
+ : config.files.find((f) => f.filename === 'index.html')
+ ? 'index.html'
+ : config.files.find((f) => getLanguageEditorId(f.language) === 'markup')?.filename ||
+ 'index.html';
+
+export const getValidFileName = (
+ filename: string,
+ config: Partial,
+): string | { error: 'invalid name' | 'invalid type' } => {
+ const name = handleSlash(filename.trim() || '');
+ if (name === '') return { error: 'invalid name' };
+ if (['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].includes(name[0])) {
+ return { error: 'invalid name' };
+ }
+ if ([':', '*', '?', '"', '<', '>', '|'].some((c) => name.includes(c))) {
+ return { error: 'invalid name' };
+ }
+ const language = getFileLanguage(name, config);
+ if (!language || !supportsMultiFile(language) || !languageIsEnabled(language, config as Config)) {
+ return { error: 'invalid type' };
+ }
+ return name;
+};
diff --git a/src/livecodes/config/validate-config.ts b/src/livecodes/config/validate-config.ts
index 44032cb65e..d1ee06e8d6 100644
--- a/src/livecodes/config/validate-config.ts
+++ b/src/livecodes/config/validate-config.ts
@@ -1,7 +1,17 @@
-import { getLanguageByAlias, getLanguageEditorId } from '../languages';
-import type { Config, Editor, EditorId, Language, Tool, ToolsPaneStatus } from '../models';
-import { removeDuplicates } from '../utils';
+import { getFileLanguage, getLanguageByAlias, getLanguageEditorId } from '../languages';
+import type {
+ Config,
+ Editor,
+ EditorId,
+ Language,
+ MultiFileConfig,
+ SourceFile,
+ Tool,
+ ToolsPaneStatus,
+} from '../models';
+import { handleSlash, objectFilter, removeDuplicates } from '../utils';
import { defaultConfig } from './default-config';
+import { getValidFileName, isEditorId } from './utils';
export const validateConfig = (config: Partial): Partial => {
type types = 'array' | 'boolean' | 'object' | 'number' | 'string' | 'undefined';
@@ -45,7 +55,7 @@ export const validateConfig = (config: Partial): Partial => {
const isFoldedLines = (x: any) => is(x, 'object') && (is(x.from, 'number') || is(x.to, 'number'));
- const fixSfcLanguage = (lang: Language, editorId: EditorId) =>
+ const fixSfcLanguage = (lang: Language | undefined, editorId: EditorId) =>
editorId !== 'markup'
? lang
: lang === 'svelte'
@@ -54,17 +64,22 @@ export const validateConfig = (config: Partial): Partial => {
? 'vue-app'
: lang;
+ const getEditorDefaultLanguage = (editorId: EditorId) =>
+ (isEditorId(editorId) ? defaultConfig[editorId].language : getFileLanguage(editorId, config)) ||
+ 'html';
+
const validateEditorProps = (x: Editor, editorId: EditorId): Editor => ({
- language: fixSfcLanguage(
- getLanguageEditorId(fixSfcLanguage(x.language, editorId)) === editorId
- ? getLanguageByAlias(x.language) || defaultConfig[editorId].language
- : defaultConfig[editorId].language,
- editorId,
- ),
+ language:
+ fixSfcLanguage(
+ getLanguageEditorId(fixSfcLanguage(x.language, editorId)) === editorId
+ ? getLanguageByAlias(x.language) || getEditorDefaultLanguage(editorId)
+ : getEditorDefaultLanguage(editorId),
+ editorId,
+ ) || getEditorDefaultLanguage(editorId),
...(is(x.title, 'string') ? { title: x.title } : {}),
...(is(x.content, 'string') ? { content: x.content } : {}),
...(is(x.contentUrl, 'string') ? { contentUrl: x.contentUrl } : {}),
- ...(is(x.hideTitle, 'boolean') ? { hideTitle: x.hideTitle } : {}),
+ ...(is(x.hidden, 'boolean') ? { hidden: x.hidden } : {}),
...(is(x.hiddenContent, 'string') ? { hiddenContent: x.hiddenContent } : {}),
...(is(x.hiddenContentUrl, 'string') ? { hiddenContentUrl: x.hiddenContentUrl } : {}),
...(is(x.foldedLines, 'array', 'object') && x.foldedLines?.every(isFoldedLines)
@@ -75,6 +90,40 @@ export const validateConfig = (config: Partial): Partial => {
...(is(x.position, 'object') ? { position: x.position } : {}),
});
+ const validateFileProps = (
+ x: Partial,
+ config: Partial,
+ ): SourceFile | undefined =>
+ x.filename && is(x.filename, 'string') && handleSlash(x.filename).includes('.')
+ ? {
+ filename: (() => {
+ const name = getValidFileName(x.filename, config);
+ return typeof name === 'string' ? name : '';
+ })(),
+ content: is(x.content, 'string') ? x.content ?? '' : '',
+ language:
+ getLanguageByAlias(x.language) ||
+ getFileLanguage(x.filename, { ...config, fileLanguages: validFileLanguages }) ||
+ 'text',
+ ...(is(x.hidden, 'boolean') ? { hidden: x.hidden } : {}),
+ ...(is(x.position, 'object') ? { position: x.position } : {}),
+ ...(is(x.foldedLines, 'array', 'object') && x.foldedLines?.every(isFoldedLines)
+ ? { foldedLines: x.foldedLines }
+ : {}),
+ }
+ : undefined;
+
+ const validatefileLanguages = (fileLanguages: Record = {}) =>
+ objectFilter(
+ fileLanguages,
+ (v, k) => getLanguageByAlias(k) != null && getLanguageByAlias(v) != null,
+ ) as Partial>;
+
+ const validFileLanguages = validatefileLanguages(config.fileLanguages);
+
+ const validateActiveEditor = (config: Partial) =>
+ includes([...editorIds, ...(config.files || []).map((f) => f.filename)], config.activeEditor);
+
const validateTestsProps = (x: Partial): Partial => ({
...(x && is(x.language, 'string') ? { language: x.language } : {}),
...(x && is(x.content, 'string') ? { content: x.content } : {}),
@@ -137,7 +186,7 @@ export const validateConfig = (config: Partial): Partial => {
...(is(config.showSpacing, 'boolean') ? { showSpacing: config.showSpacing } : {}),
...(is(config.readonly, 'boolean') ? { readonly: config.readonly } : {}),
...(is(config.allowLangChange, 'boolean') ? { allowLangChange: config.allowLangChange } : {}),
- ...(includes(editorIds, config.activeEditor) ? { activeEditor: config.activeEditor } : {}),
+ ...(validateActiveEditor(config) ? { activeEditor: config.activeEditor } : {}),
...(is(config.languages, 'array', 'string')
? { languages: removeDuplicates(config.languages) }
: {}),
@@ -150,6 +199,17 @@ export const validateConfig = (config: Partial): Partial => {
...(is(config.script, 'object')
? { script: validateEditorProps(config.script as Editor, 'script') }
: {}),
+ ...(is((config as MultiFileConfig).files, 'array', 'object')
+ ? {
+ files:
+ (config.files
+ ?.map((f) => validateFileProps(f, config))
+ .filter((f) => Boolean(f?.filename)) as Config['files']) || [],
+ }
+ : {}),
+ ...(is(config.mainFile, 'string') ? { mainFile: config.mainFile } : {}),
+ ...(is(config.fileLanguages, 'object') ? { fileLanguages: validFileLanguages } : {}),
+ ...(is(config.lockFiles, 'boolean') ? { lockFiles: config.lockFiles } : {}),
...(is(config.tools, 'object')
? { tools: validateToolsProps(config.tools as Config['tools']) }
: {}),
diff --git a/src/livecodes/core.ts b/src/livecodes/core.ts
index 889ceea76a..17141a333b 100644
--- a/src/livecodes/core.ts
+++ b/src/livecodes/core.ts
@@ -23,7 +23,12 @@ import type {
BroadcastResponseError,
} from './UI/broadcast';
import { getCommandMenuActions } from './UI/command-menu-actions';
-import { createLanguageMenus, createProcessorItem } from './UI/create-language-menus';
+import {
+ createAddFileButton,
+ createLanguageMenus,
+ createMultiFileEditorTab,
+ createProcessorItem,
+} from './UI/create-language-menus';
import { createModal } from './UI/modal';
import * as UI from './UI/selectors';
import { themeColors } from './UI/theme-colors';
@@ -36,12 +41,17 @@ import {
getContentConfig,
getEditorConfig,
getFormatterConfig,
+ getMultiFileConfig,
getParams,
+ getSDKConfig,
+ getSingleFileConfig,
getUserConfig,
setConfig,
upgradeAndValidate,
} from './config';
+import { getMainFile, getSource, getValidFileName, isEditorId } from './config/utils';
import { createCustomEditors, createEditor, getFontFamily } from './editor';
+import { createFakeEditor } from './editor/fake-editor';
import { createEventsManager, createPub } from './events';
import { customEvents } from './events/custom-events';
import { exportJSON } from './export/export-json';
@@ -72,8 +82,8 @@ import { appLanguages } from './i18n/app-languages';
import { isGithub } from './import/check-src';
import { importCompressedCode } from './import/code';
import { importFromFiles } from './import/files';
-import { populateConfig } from './import/utils';
import {
+ getFileLanguage,
getLanguageByAlias,
getLanguageCompiler,
getLanguageEditorId,
@@ -87,6 +97,7 @@ import {
processorIsEnabled,
processors,
} from './languages';
+import { hasTailwindImport } from './languages/tailwindcss/utils';
import type {
API,
APICommands,
@@ -106,17 +117,21 @@ import type {
EditorConfig,
EditorId,
EditorLanguages,
+ EditorLibrary,
EditorOptions,
Editors,
EventsManager,
+ ExportedConfig,
GithubScope,
Language,
Modal,
Notifications,
Processor,
+ SDKConfig,
SDKEvent,
Screen,
ShareData,
+ SourceFile,
Template,
TestResult,
Theme,
@@ -128,6 +143,7 @@ import type {
} from './models';
import { createNotifications } from './notifications';
import { cleanResultFromDev, createResultPage } from './result';
+import { createMultiFileResultPage } from './result/multi-file-result-page';
import { createAuthService, getAppCDN, sandboxService, shareService } from './services';
import type { GitHubFile } from './services/github';
import { permanentUrlService } from './services/permanent-url';
@@ -143,6 +159,7 @@ import { createToolsPane } from './toolspane';
import { createTypeLoader, getDefaultTypes } from './types';
import {
capitalize,
+ cloneObject,
colorToHex,
colorToHsla,
compareObjects,
@@ -151,14 +168,17 @@ import {
debounce,
getValidUrl,
isMac,
+ loadScript,
loadStylesheet,
predefinedValues,
+ removeFormatting,
safeName,
stringToValidJson,
stringify,
toDataUrl,
} from './utils';
import {
+ draggableUrl,
fontDMSansUrl,
fontInterUrl,
fontJetbrainsMonoUrl,
@@ -206,7 +226,7 @@ let typeLoader: ReturnType;
const screens: Screen[] = [];
const params = getParams(); // query string params
const iframeScrollPosition = { x: 0, y: 0 };
-const editorIds: EditorId[] = ['markup', 'style', 'script'];
+const editorIds = ['markup', 'style', 'script'];
let baseUrl: string;
let isEmbed: boolean;
@@ -239,17 +259,17 @@ let resultPopup: Window | null = null;
const sdkWatchers = {
load: createPub(),
ready: createPub(),
- code: createPub<{ code: Code; config: Config }>(),
- run: createPub<{ code: Code; config: Config }>(),
+ code: createPub<{ code: Code; config: SDKConfig }>(),
+ run: createPub<{ code: Code; config: SDKConfig }>(),
tests: createPub<{ results: TestResult[]; error?: string }>(),
console: createPub<{ method: string; args: any[] }>(),
destroy: createPub(),
} as const satisfies Record>>;
+let fileSortable: any;
-const getEditorLanguage = (editorId: EditorId = 'markup') => editorLanguages?.[editorId];
+const getEditorLanguage = (editorId = 'markup') => editorLanguages?.[editorId];
const getEditorLanguages = () => Object.values(editorLanguages || {});
-const getActiveEditor = () => editors[getConfig().activeEditor || 'markup'];
-const setActiveEditor = async (config: Config) => showEditor(config.activeEditor);
+const getActiveEditor = (): CodeEditor | undefined => editors[getConfig().activeEditor || 'markup'];
const loadStyles = () =>
isHeadless
@@ -307,19 +327,24 @@ const createIframe = (container: HTMLElement, result = '', service = sandboxServ
// result = '';
// }
+ const config = getConfig();
+ const isMultiFile = config.files.length > 0;
const scriptLang = getEditorLanguage('script') || 'javascript';
- const compilers = getAllCompilers(languages, getConfig(), baseUrl);
- const editorsText = `
- ${getConfig().markup.hiddenContent || ''}
- ${getConfig().markup.content}
- ${getConfig().style.hiddenContent || ''}
- ${getConfig().style.content}
- ${getConfig().script.hiddenContent || ''}
- ${getConfig().script.content}
+ const compilers = getAllCompilers(languages, config, baseUrl);
+ const editorsText = isMultiFile
+ ? config.files.map((f) => f.content).join('\n')
+ : `
+ ${config.markup.hiddenContent || ''}
+ ${config.markup.content}
+ ${config.style.hiddenContent || ''}
+ ${config.style.content}
+ ${config.script.hiddenContent || ''}
+ ${config.script.content}
`;
const iframeIsPlaced = iframe.parentElement === container;
const styleOnlyUpdate = iframeIsPlaced && getCache().styleOnlyUpdate;
const liveReload =
+ !isMultiFile &&
iframeIsPlaced &&
compilers[scriptLang]?.liveReload &&
resultLanguages.includes(scriptLang) &&
@@ -359,10 +384,22 @@ const createIframe = (container: HTMLElement, result = '', service = sandboxServ
});
iframe.remove(); // avoid changing browser history
- const { markup, style, script } = getConfig();
- const query = `?markup=${markup.language}&style=${style.language}&script=${
- script.language
- }&isEmbed=${isEmbed}&isLoggedIn=${Boolean(authService?.isLoggedIn())}&appCDN=${getAppCDN()}`;
+ const { markup, style, script } = config;
+ const usedLanguages = [
+ ...new Set(
+ Object.keys(editorLanguages || {})
+ .filter((editorId) =>
+ isMultiFile ? !['markup', 'style', 'script'].includes(editorId) : true,
+ )
+ .map((editorId) => editorLanguages![editorId]),
+ ),
+ ];
+ const query =
+ (isMultiFile
+ ? '?'
+ : `?markup=${markup.language}&style=${style.language}&script=${script.language}&`) +
+ `languages=${usedLanguages.join(',')}&isMultiFile=${isMultiFile}&isEmbed=${isEmbed}&` +
+ `isLoggedIn=${Boolean(authService?.isLoggedIn())}&appCDN=${getAppCDN()}`;
const scrollPosition =
params.scrollPosition === false ||
(iframeScrollPosition.x === 0 && iframeScrollPosition.y === 0)
@@ -381,7 +418,8 @@ const loadModuleTypes = async (
loadAll = false,
force = false,
) => {
- if (typeof editors?.script?.addTypes !== 'function') return;
+ const addTypes = editors?.[config.files?.[0]?.filename || 'script']?.addTypes;
+ if (typeof addTypes !== 'function') return;
const scriptLanguage = config.script.language;
if (['typescript', 'javascript'].includes(mapLanguage(scriptLanguage)) || force) {
if (compiler.isFake) {
@@ -396,13 +434,17 @@ const loadModuleTypes = async (
...config.customSettings.types,
};
const reactImport = hasJsx(scriptLanguage) ? `import React from 'react';\n` : '';
- const libs = await typeLoader.load(
- reactImport + getConfig().script.content + '\n' + getConfig().markup.content,
- configTypes,
- loadAll,
- force,
- );
- libs.forEach((lib) => editors.script.addTypes?.(lib, force));
+ const content = !config.files.length
+ ? config.script.content + '\n' + config.markup.content
+ : config.files.reduce(
+ (acc, file) =>
+ ['script', 'markup'].includes(getLanguageEditorId(file.language) || '')
+ ? acc + file.content + '\n'
+ : acc,
+ '',
+ );
+ const libs = await typeLoader.load(reactImport + content, configTypes, loadAll, force);
+ libs.forEach((lib: EditorLibrary) => addTypes(lib, force));
}
};
@@ -419,13 +461,16 @@ const highlightSelectedLanguage = (editorId: EditorId, language: Language) => {
});
};
-const setEditorTitle = (editorId: EditorId, title: string) => {
- const editorTitle = document.querySelector(`#${editorId}-selector span`) as HTMLElement;
- const editorTitleContainer = document.querySelector(`#${editorId}-selector`) as HTMLElement;
+export const setEditorTitle = (editorId: EditorId, title: string) => {
+ if (!isEditorId(editorId)) return;
+ const editorTitleContainer = document.querySelector(
+ `.editor-title[data-editor="${editorId}"]`,
+ ) as HTMLElement;
+ const editorTitle = editorTitleContainer.querySelector('span') as HTMLElement;
const language = getLanguageByAlias(title);
if (!editorTitle || !language) return;
const config = getConfig();
- if (config[editorId].hideTitle) {
+ if (config[editorId].hidden) {
editorTitleContainer.style.display = 'none';
return;
}
@@ -455,7 +500,10 @@ const createCopyButtons = () => {
copyButton.innerHTML = copyImgHtml;
copyButton.classList.add('copy-button', 'tool-buttons');
copyButton.title = window.deps.translateString('core.copy.title', 'Copy');
- document.getElementById(editorId)?.appendChild(copyButton);
+ (
+ document.getElementById(editorId) ||
+ document.querySelector(`div[data-editor-id="${editorId}"]`)
+ )?.appendChild(copyButton);
eventsManager.addEventListener(copyButton, 'click', () => {
if (copyToClipboard(editors?.[editorId]?.getValue())) {
copyButton.innerHTML = `
`;
@@ -471,11 +519,174 @@ const createCopyButtons = () => {
});
};
+const checkFileName = (filename: string, config: Config, currentName?: string) => {
+ const name = getValidFileName(filename, config);
+ if (typeof name === 'string') {
+ if (name !== currentName && config.files?.some((f) => f.filename === name)) {
+ alert(window.deps.translateString('core.file.exists', 'File already exists!'));
+ return null;
+ }
+ return name;
+ }
+ if (name.error === 'invalid name') {
+ alert(window.deps.translateString('core.file.invalidName', 'Invalid file name!'));
+ return null;
+ }
+ if (name.error === 'invalid type') {
+ alert(window.deps.translateString('core.file.invalidType', 'Invalid file type!'));
+ return null;
+ }
+ return null;
+};
+
+const addFile = async (
+ filename: string,
+ editorOptions: Omit,
+) => {
+ const config = getConfig();
+ const validName = checkFileName(filename, config);
+ if (!validName) return false;
+ const fileLanguage = getFileLanguage(validName, config) || 'javascript';
+ const container = createEditorUI(validName);
+ const editor = await createEditor({
+ ...editorOptions,
+ container,
+ editorId: validName,
+ language: fileLanguage,
+ value: '',
+ });
+ setConfig({
+ ...config,
+ activeEditor: validName,
+ files: [
+ ...config.files,
+ {
+ filename: validName,
+ language: fileLanguage,
+ content: '',
+ },
+ ],
+ });
+ editorLanguages![validName] = fileLanguage;
+ editors[validName] = editor;
+ editorIds.push(validName);
+ handleChangeContent(editor);
+ if (config.autoupdate) {
+ run();
+ }
+ setSavedStatus();
+ dispatchChangeEvent();
+ return true;
+};
+
+const renameFile = (filename: string, newName: string) => {
+ const config = getConfig();
+ const validName = checkFileName(newName, config, filename);
+ if (!validName) return false;
+ if (filename === validName) return true;
+ const language = getFileLanguage(validName, config)!;
+ setConfig({
+ ...config,
+ activeEditor: validName,
+ files: config.files.map((f) => ({
+ ...f,
+ language: f.filename === filename ? language : f.language,
+ filename: f.filename === filename ? validName : f.filename,
+ })),
+ });
+ UI.getEditorDivs().forEach((editorDiv) => {
+ if (editorDiv.dataset.editorId === filename) {
+ editorDiv.dataset.editorId = validName;
+ }
+ });
+ UI.getEditorTitles().forEach((editorTitle) => {
+ if (editorTitle.dataset.editor === filename) {
+ editorTitle.dataset.editor = validName;
+ }
+ });
+ if (editorLanguages && editorLanguages[filename]) {
+ editorLanguages[validName] = editorLanguages[filename];
+ delete editorLanguages[filename];
+ }
+ if (editors[filename]) {
+ editors[validName] = editors[filename];
+ delete editors[filename];
+ }
+ const id = editorIds.findIndex((editorId) => editorId === filename);
+ if (id > -1) {
+ editorIds[id] = validName;
+ }
+ changeLanguage(language, undefined, false, validName);
+ return true;
+};
+
+const deleteFile = (filename: string) => {
+ const config = getConfig();
+ setConfig({
+ ...config,
+ files: config.files.filter((f) => f.filename !== filename),
+ });
+ if (editorLanguages && editorLanguages[filename]) {
+ delete editorLanguages[filename];
+ }
+ if (editors[filename]) {
+ editors[filename].destroy();
+ delete editors[filename];
+ }
+ const id = editorIds.findIndex((editorId) => editorId === filename);
+ if (id > -1) {
+ const editorIdToShow = id === 0 ? 1 : id - 1;
+ showEditor(editorIds[editorIdToShow]);
+ editorIds.splice(id, 1);
+ }
+ UI.getEditorDivs().forEach((editorDiv) => {
+ if (editorDiv.dataset.editorId === filename) {
+ editorDiv.remove();
+ }
+ });
+ UI.getEditorTab(filename)?.remove();
+ if (config.autoupdate) {
+ run();
+ }
+ setSavedStatus();
+ dispatchChangeEvent();
+};
+
+const createEditorUI = (title: string, isHidden = false) => {
+ const editorsElement = UI.getEditorsElement();
+ editorsElement.querySelector(`.editor[data-editor-id="${title}"]`)?.remove();
+ const container = document.createElement('div');
+ container.dataset.editorId = title;
+ container.dataset.multiFile = 'true';
+ container.classList.add('editor');
+ editorsElement.insertBefore(container, UI.getEditorToolbar());
+ const config = getConfig();
+ createMultiFileEditorTab({
+ title,
+ showEditor,
+ renameFile,
+ deleteFile,
+ isMainFile: title === getMainFile(config),
+ isNewFile: false,
+ isHidden,
+ isLocked: config.lockFiles || config.readonly,
+ });
+ return container;
+};
+
const createEditors = async (config: Config) => {
let isReload = false;
if (editors) {
isReload = true;
- Object.values(editors).forEach((editor: CodeEditor) => editor.destroy());
+ Object.keys(editors).forEach((editorId: EditorId) => {
+ if (editorId in editors) {
+ editors[editorId].destroy();
+ delete editors[editorId];
+ }
+ if (editorLanguages && editorId in editorLanguages) delete editorLanguages[editorId];
+ const id = editorIds.indexOf(editorId);
+ if (id > -1) editorIds.splice(id, 1);
+ });
resetEditorModeStatus();
}
@@ -488,7 +699,9 @@ const createEditors = async (config: Config) => {
? 'style'
: config.script.content
? 'script'
- : 'markup');
+ : config.files?.length
+ ? config.files[0].filename
+ : 'markup');
const baseOptions = {
baseUrl,
@@ -536,26 +749,73 @@ const createEditors = async (config: Config) => {
value: languageIsEnabled(config.script.language, config) ? config.script.content || '' : '',
};
- const markupEditor = await createEditor(markupOptions);
- const styleEditor = await createEditor(styleOptions);
- const scriptEditor = await createEditor(scriptOptions);
+ if (config.files?.length) {
+ if (!config.lockFiles && !config.readonly) {
+ createAddFileButton({
+ onclick: () =>
+ createMultiFileEditorTab({
+ title: ' ',
+ showEditor,
+ addFile: async (filename: string) => addFile(filename, baseOptions),
+ renameFile,
+ deleteFile,
+ isMainFile: false,
+ isNewFile: true,
+ isLocked: false,
+ }),
+ });
+ }
- currentEditorConfig = { ...getEditorConfig(config), ...getFormatterConfig(config) };
+ editorLanguages = { markup: 'html', style: 'css', script: 'javascript' };
+ editors = {
+ markup: createFakeEditor(markupOptions),
+ style: createFakeEditor(styleOptions),
+ script: createFakeEditor(scriptOptions),
+ };
- setEditorTitle('markup', markupOptions.language);
- setEditorTitle('style', styleOptions.language);
- setEditorTitle('script', scriptOptions.language);
+ changingContent = true;
+ editorIds.length = 0;
+ for (const file of config.files) {
+ const editorId = file.filename as EditorId;
+ const container = createEditorUI(file.filename, file.hidden);
+ const editorOptions = {
+ ...baseOptions,
+ container,
+ editorId,
+ language: file.language || getFileLanguage(file.filename, config) || 'text',
+ value: file.content || '',
+ };
+ const editor = await createEditor(editorOptions);
+ editorLanguages[editorId] = file.language!;
+ editors[editorId] = editor;
+ editorIds.push(editorId);
+ }
+ changingContent = false;
+ } else {
+ const markupEditor = await createEditor(markupOptions);
+ const styleEditor = await createEditor(styleOptions);
+ const scriptEditor = await createEditor(scriptOptions);
+
+ setEditorTitle('markup', markupOptions.language);
+ setEditorTitle('style', styleOptions.language);
+ setEditorTitle('script', scriptOptions.language);
+
+ editorLanguages = {
+ markup: markupOptions.language,
+ style: styleOptions.language,
+ script: scriptOptions.language,
+ };
- editorLanguages = {
- markup: markupOptions.language,
- style: styleOptions.language,
- script: scriptOptions.language,
- };
+ editors = {
+ markup: markupEditor,
+ style: styleEditor,
+ script: scriptEditor,
+ };
+ }
- editors = {
- markup: markupEditor,
- style: styleEditor,
- script: scriptEditor,
+ currentEditorConfig = {
+ ...getEditorConfig(config),
+ ...getFormatterConfig(config),
};
(Object.keys(editors) as EditorId[]).forEach((editorId) => {
@@ -572,6 +832,8 @@ const createEditors = async (config: Config) => {
if (isReload) {
loadModuleTypes(editors, config, /* loadAll = */ true);
}
+
+ handleChangeContent();
};
const reloadEditors = async (config: Config) => {
@@ -579,23 +841,30 @@ const reloadEditors = async (config: Config) => {
await toolsPane?.console?.reloadEditor(config);
await toolsPane?.compiled?.reloadEditor(config);
updateCompiledCode();
- handleChangeContent();
+ showEditor(config.activeEditor);
};
const updateEditors = async (editors: Editors, config: Config) => {
const editorIds = Object.keys(editors) as Array;
for (const editorId of editorIds) {
- const language = getLanguageByAlias(config[editorId].language);
+ if (typeof editorId !== 'string') {
+ continue;
+ }
+ const source = getSource(editorId, config);
+ if (!source) {
+ continue;
+ }
+ const language = getLanguageByAlias(source.language);
if (language) {
- await changeLanguage(language, config[editorId].content, true);
+ const filename = 'filename' in source ? source.filename : undefined;
+ await changeLanguage(language, source.content || '', true, filename);
}
const editor = editors[editorId];
if (config.foldRegions) {
await editor.foldRegions?.();
}
- const foldedLines = config[editorId].foldedLines;
- if (foldedLines?.length) {
- await editor.foldLines?.(foldedLines);
+ if (source.foldedLines?.length) {
+ await editor.foldLines?.(source.foldedLines);
}
}
};
@@ -702,27 +971,36 @@ const showMode = (mode?: Config['mode'], view?: Config['view']) => {
window.dispatchEvent(new Event(customEvents.resizeEditor));
};
-const showEditor = (editorId: EditorId = 'markup', isUpdate = false) => {
+const showEditor = (editorId: EditorId | (string & {}) = 'markup', isUpdate = false) => {
const config = getConfig();
- const allHidden = editorIds.every((editor) => config[editor].hideTitle);
- if (config[editorId].hideTitle && !allHidden) return;
- const titles = UI.getEditorTitles();
- const editorIsVisible = () =>
- Array.from(titles)
- .map((title) => title.dataset.editor)
- .includes(editorId);
+ if (!editors[editorId] || getSource(editorId, config)?.hidden) return;
+ const titles = [...UI.getEditorTitles()];
+ const editorIsVisible = () => titles.map((title) => title.dataset.editor).includes(editorId);
if (!editorIsVisible()) {
// select first visible editor instead
- editorId = (titles[0].dataset.editor as EditorId) || 'markup';
- }
- titles.forEach((selector) => selector.classList.remove('active'));
- const activeTitle = document.getElementById(editorId + '-selector');
- activeTitle?.classList.add('active');
- const editorDivs = UI.getEditorDivs();
- editorDivs.forEach((editor) => (editor.style.display = 'none'));
- const activeEditor = document.getElementById(editorId) as HTMLElement;
- activeEditor.style.display = 'block';
- activeEditor.style.visibility = 'visible';
+ editorId = (titles[0]?.dataset.editor as EditorId) || 'markup';
+ }
+ titles.forEach((title) => {
+ if (title.dataset.editor === editorId) {
+ title.classList.add('active');
+ title.scrollIntoView({
+ behavior: 'smooth',
+ block: 'end',
+ inline: 'nearest',
+ });
+ } else {
+ title.classList.remove('active');
+ }
+ });
+ UI.getEditorDivs().forEach((editorDiv) => {
+ if (editorDiv.dataset.editorId === editorId || editorDiv.id === editorId) {
+ editorDiv.style.display = 'block';
+ editorDiv.style.visibility = 'visible';
+ } else {
+ editorDiv.style.display = 'none';
+ editorDiv.style.visibility = 'hidden';
+ }
+ });
if (!isEmbed && !isUpdate) {
editors[editorId]?.focus();
}
@@ -736,11 +1014,11 @@ const showEditor = (editorId: EditorId = 'markup', isUpdate = false) => {
if (initialized || config.view !== 'result') {
split?.show('code');
}
- configureEditorTools(getActiveEditor().getLanguage());
+ configureEditorTools(getActiveEditor()?.getLanguage());
showEditorModeStatus(editorId);
};
-const showEditorModeStatus = (editorId: EditorId) => {
+const showEditorModeStatus = (editorId: EditorId | (string & {})) => {
const editorStatusNodes = document.querySelectorAll(
'#editor-status > span[data-status]',
);
@@ -789,7 +1067,8 @@ const addConsoleInputCodeCompletion = () => {
}
};
-const configureEditorTools = (language: Language) => {
+const configureEditorTools = (language: Language | undefined) => {
+ if (!language) return false;
if (getConfig().readonly || language === 'blockly' || language === 'richtext') {
UI.getEditorToolbar().classList.add('hidden');
return false;
@@ -805,6 +1084,60 @@ const configureEditorTools = (language: Language) => {
return true;
};
+const configureMultiFile = (config: Config) => {
+ const editorTabsContainer = UI.getEditorTabScroller()!;
+ const singleFileTabs = [
+ ...editorTabsContainer.querySelectorAll('[data-single-file]'),
+ ];
+ const multiFileTabs = [...editorTabsContainer.querySelectorAll('[data-multi-file]')];
+ const isMultiFile = config.files.length > 0;
+
+ singleFileTabs.forEach((tab) => {
+ tab.classList.toggle('hidden', isMultiFile);
+ });
+ multiFileTabs.forEach((tab) => {
+ tab.classList.toggle('hidden', !isMultiFile);
+ });
+ document.documentElement.classList.toggle('multi-file', isMultiFile);
+
+ // allow re-ordering file tabs by drag and drop
+ fileSortable?.destroy();
+ if (isMultiFile && !config.lockFiles && !config.readonly) {
+ loadScript(draggableUrl, 'Draggable').then((Draggable: any) => {
+ fileSortable = new Draggable.Sortable(editorTabsContainer, {
+ draggable: '[data-multi-file]',
+ distance: 5, // The distance the pointer have moved before drag starts. This is useful for clickable draggable elements.
+ });
+ fileSortable.on('sortable:stop', (ev: any) => {
+ // wait till DOM changes
+ requestAnimationFrame(() => {
+ const config = getConfig();
+ const tabs = [...editorTabsContainer.querySelectorAll('[data-multi-file]')];
+ const files: Config['files'] = cloneObject(config.files);
+ files.sort((a, b) => {
+ const aIndex = tabs.findIndex((t) => t.dataset.editor === a.filename);
+ const bIndex = tabs.findIndex((t) => t.dataset.editor === b.filename);
+ return aIndex - bIndex;
+ });
+ editorIds.sort((a, b) => {
+ const aIndex = tabs.findIndex((t) => t.dataset.editor === a);
+ const bIndex = tabs.findIndex((t) => t.dataset.editor === b);
+ return aIndex - bIndex;
+ });
+ const activeEditor: string =
+ ev.data?.dragEvent?.originalSource?.dataset?.editor || files[0]?.filename;
+ setConfig({
+ ...config,
+ activeEditor,
+ files,
+ });
+ showEditor(activeEditor);
+ });
+ });
+ });
+ }
+};
+
const addPhpToken = (code: string) =>
code.includes(' {
});
};
-const changeLanguage = async (language: Language, value?: string, isUpdate = false) => {
- const editorId = getLanguageEditorId(language);
+const changeLanguage = async (
+ language: Language,
+ value?: string,
+ isUpdate = false,
+ filename?: string,
+) => {
+ const editorId = filename || getLanguageEditorId(language);
if (!editorId || !language || !languageIsEnabled(language, getConfig())) return;
if (getLanguageSpecs(language)?.largeDownload) {
notifications.info(
@@ -850,13 +1188,17 @@ const changeLanguage = async (language: Language, value?: string, isUpdate = fal
),
);
}
- const editor = editors[editorId];
- editor.setLanguage(language, value ?? (getConfig()[editorId].content || ''));
if (editorLanguages) {
editorLanguages[editorId] = language;
}
- setEditorTitle(editorId, language);
- showEditor(editorId, isUpdate);
+ const editor = editors[editorId];
+ if (filename) {
+ editor.setEditorId(filename, language);
+ } else {
+ editor.setLanguage(language, value ?? (getSource(editorId, getConfig())?.content || ''));
+ setEditorTitle(editorId as EditorId, language);
+ showEditor(editorId, isUpdate);
+ }
phpHelper({ editor: editors.script });
if (!isEmbed && !isUpdate) {
setTimeout(() => editor.focus());
@@ -869,7 +1211,7 @@ const changeLanguage = async (language: Language, value?: string, isUpdate = fal
activeEditor: editorId,
});
if (getConfig().autoupdate) {
- await run();
+ run();
}
}
await setSavedStatus();
@@ -888,36 +1230,88 @@ const registerRun = (editorId: EditorId, editors: Editors) => {
};
const updateCompiledCode = () => {
+ const config = getConfig();
+ const cache = getCache();
const getCompiledLanguage = (editorId: EditorId) => {
const defaultLang: { [key in EditorId]: Language } = {
markup: 'html',
style: 'css',
script: 'javascript',
};
- const lang = getLanguageCompiler(getConfig()[editorId].language)?.compiledCodeLanguage;
+ const srcLang = getSource(editorId, cache)?.language;
+ const lang =
+ getLanguageCompiler(srcLang)?.compiledCodeLanguage ||
+ defaultLang[editorId] ||
+ defaultLang[getLanguageSpecs(srcLang)?.editor || ''] ||
+ getFileLanguage(editorId, config) ||
+ 'html';
return {
- language: lang || defaultLang[editorId],
- label: lang === 'json' ? 'JSON' : getLanguageByAlias(lang) || lang || defaultLang[editorId],
+ language: lang,
+ label: lang === 'json' ? 'JSON' : getLanguageByAlias(lang) || lang,
};
};
- const compiledLanguages: { [key in EditorId]: { language: Language; label: string } } = {
+ const compiledLanguages: {
+ [key in EditorId]: { language: Language; label: string };
+ } = {
markup: getCompiledLanguage('markup'),
style: getCompiledLanguage('style'),
script: getCompiledLanguage('script'),
+ ...cache.files.reduce(
+ (acc, f) => ({ ...acc, [f.filename]: getCompiledLanguage(f.filename) }),
+ {},
+ ),
};
- if (toolsPane && toolsPane.compiled) {
- const cache = getCache();
- Object.keys(cache).forEach((editorId) => {
- if (editorId !== getConfig().activeEditor) return;
- let compiledCode = cache[editorId].modified || cache[editorId].compiled || '';
- if (editorId === 'script' && getConfig().script.language.startsWith('php')) {
- compiledCode = phpHelper({ code: compiledCode });
- }
- toolsPane?.compiled?.update(
- compiledLanguages[editorId].language,
- compiledCode,
- compiledLanguages[editorId].label,
- );
+ if (!toolsPane || !toolsPane.compiled) return;
+ const editorId = config.activeEditor;
+ const active = compiledLanguages[editorId || ''];
+ if (!editorId || !active) return;
+ const src = getSource(editorId, cache);
+ if (!src) return;
+ let compiledCode = src.modified || src.compiled || '';
+ if (editorId === 'script' && config.script.language.startsWith('php')) {
+ compiledCode = phpHelper({ code: compiledCode });
+ }
+ toolsPane?.compiled?.update(
+ compiledLanguages[editorId].language,
+ compiledCode,
+ compiledLanguages[editorId].label,
+ );
+};
+
+const autoEnableProcessors = () => {
+ const config = getConfig();
+ if (!config.files.length) return;
+
+ const shouldEnableTailwind =
+ config.processors.includes('tailwindcss') ||
+ config.files
+ .filter((f) => getLanguageEditorId(f.language) === 'style')
+ .some((f) => hasTailwindImport(f.content));
+
+ const shouldEnableCSSModules =
+ config.processors.includes('cssmodules') ||
+ config.files
+ .filter((f) => getLanguageEditorId(f.language) === 'style')
+ .some((f) => {
+ const [scriptName, ext] = f.filename.split('.module.');
+ if (getLanguageByAlias(ext) !== 'css') return false;
+ return config.files
+ .filter((f) => getLanguageEditorId(f.language) === 'script')
+ .find((f) => f.filename.split('.').slice(0, -1).join('.') === scriptName);
+ });
+
+ const processors: Processor[] = [...config.processors];
+ if (shouldEnableTailwind && !processors.includes('tailwindcss')) {
+ processors.push('tailwindcss');
+ }
+ if (shouldEnableCSSModules && !processors.includes('cssmodules')) {
+ processors.push('cssmodules');
+ }
+
+ if (processors.length !== config.processors.length) {
+ setConfig({
+ ...config,
+ processors,
});
}
};
@@ -926,13 +1320,23 @@ const getResultPage = async ({
sourceEditor = undefined as EditorId | undefined,
forExport = false,
template = resultTemplate,
- singleFile = true,
+ singleFileResult = true,
runTests = false,
}) => {
updateConfig();
const config = getConfig();
const contentConfig = getContentConfig(config);
+ if (config.files.length > 0) {
+ return getMultiFileResultPage({
+ sourceEditor,
+ forExport,
+ template,
+ singleFileResult,
+ runTests,
+ });
+ }
+
const getContent = (editor: Partial | undefined) => {
const editorContent = editor?.content ?? '';
const hiddenContent = editor?.hiddenContent ?? '';
@@ -980,11 +1384,13 @@ const getResultPage = async ({
config.script.language !== getCache().script.language);
const markupCompileResult = await compiler.compile(markupContent, markupLanguage, config, {
+ filename: 'markup',
forceCompile: forceCompileSFC,
});
let compiledMarkup = markupCompileResult.code;
const scriptCompileResult = await compiler.compile(scriptContent, scriptLanguage, config, {
+ filename: 'script',
forceCompile: forceCompileStyles || forceCompileSFC,
blockly:
scriptLanguage === 'blockly'
@@ -999,20 +1405,14 @@ const getResultPage = async ({
});
const compiledScript = scriptCompileResult.code;
- let compileInfo: CompileInfo = {
- ...markupCompileResult.info,
- ...scriptCompileResult.info,
- importedContent:
- (markupCompileResult.info.importedContent || '') +
- (scriptCompileResult.info.importedContent || ''),
- imports: {
- ...scriptCompileResult.info.imports,
- ...markupCompileResult.info.imports,
- },
- };
+ let compileInfo: CompileInfo = mergeCompileInfo(
+ markupCompileResult.info,
+ scriptCompileResult.info,
+ );
const [styleCompileResult, testsCompileResult] = await Promise.all([
compiler.compile(styleContent, styleLanguage, config, {
+ filename: 'style',
html: `${compiledMarkup}
`,
forceCompile: forceCompileStyles,
@@ -1020,15 +1420,14 @@ const getResultPage = async ({
runTests
? testsNotChanged
? Promise.resolve(getCache().tests?.compiled || '')
- : compiler.compile(testsContent, testsLanguage, config, {})
+ : compiler.compile(testsContent, testsLanguage, config, {
+ filename: 'tests',
+ })
: Promise.resolve(getCompileResult(getCache().tests?.compiled || '')),
]);
const [compiledStyle, compiledTests] = [styleCompileResult, testsCompileResult].map((result) => {
const { code, info } = getCompileResult(result);
- compileInfo = {
- ...compileInfo,
- ...info,
- };
+ compileInfo = mergeCompileInfo(compileInfo, info);
return code;
});
@@ -1060,11 +1459,13 @@ const getResultPage = async ({
...contentConfig.tests,
compiled: compiledTests,
},
+ files: [],
+ mainFile: undefined,
};
compiledCode.script.modified = compiledCode.script.compiled;
if (scriptType != null && scriptType !== 'module') {
- singleFile = true;
+ singleFileResult = true;
}
const result = await createResultPage({
@@ -1073,7 +1474,7 @@ const getResultPage = async ({
forExport,
template,
baseUrl,
- singleFile,
+ singleFileResult,
runTests,
compileInfo,
});
@@ -1088,7 +1489,7 @@ const getResultPage = async ({
logError(scriptLanguage, scriptCompileResult.info?.errors);
logError(testsLanguage, getCompileResult(testsCompileResult).info?.errors);
- if (singleFile) {
+ if (singleFileResult) {
setCache({
...getCache(),
...compiledCode,
@@ -1107,12 +1508,165 @@ const getResultPage = async ({
return result;
};
+const getMultiFileResultPage = async ({
+ sourceEditor = undefined as EditorId | undefined,
+ forExport = false,
+ template = resultTemplate,
+ singleFileResult = true,
+ runTests = false,
+}) => {
+ autoEnableProcessors();
+ const config = getConfig();
+ const cache = getCache();
+
+ const forceCompileStyles = [...config.processors, ...cache.processors].some((name) =>
+ processors.find((p) => name === p.name && p.needsHTML),
+ );
+
+ const testsNotChanged =
+ (!config.tests?.content && !cache.tests?.content) ||
+ (config.tests?.language === cache.tests?.language &&
+ config.tests?.content === cache.tests?.content &&
+ cache.tests?.compiled);
+
+ if (testsNotChanged && !config.tests?.content) {
+ toolsPane?.tests?.showResults({ results: [] });
+ }
+
+ const compiledFiles: Array = [];
+ let compileInfo: CompileInfo = {};
+ const errors: Array<{
+ language: Language;
+ filename: string;
+ errors: string[];
+ }> = [];
+
+ for (const file of config.files) {
+ const { filename, language, content } = file;
+ if (getLanguageEditorId(language) === 'style') continue;
+ const compileResult = await compiler.compile(content, language, config, {
+ filename,
+ compileInfo,
+ });
+ compiledFiles.push({ ...file, compiled: compileResult.code });
+ compileInfo = mergeCompileInfo(compileInfo, compileResult.info);
+ if (compileInfo.errors?.length) {
+ errors.push({ language, filename, errors: compileInfo.errors || [] });
+ }
+ }
+
+ const mainFile = compiledFiles.find((f) => f.filename === getMainFile(config));
+ const compiledContent =
+ compiledFiles
+ .map((file) =>
+ getLanguageEditorId(file.language) === 'markup'
+ ? file.compiled
+ : ``,
+ )
+ .join('\n') + ``;
+
+ for (const file of config.files) {
+ const { filename, language, content } = file;
+ if (getLanguageEditorId(language) !== 'style') continue;
+ const compileResult = await compiler.compile(content, language, config, {
+ filename,
+ compileInfo: {
+ ...compileInfo,
+ modifiedHTML: mainFile?.compiled || '',
+ },
+ forceCompile: forceCompileStyles,
+ html: compiledContent,
+ });
+ if (mainFile && compileResult.info.modifiedHTML) {
+ mainFile.compiled = compileResult.info.modifiedHTML;
+ }
+ compiledFiles.push({ ...file, compiled: compileResult.code });
+ compileInfo = mergeCompileInfo(compileInfo, compileResult.info);
+ if (compileInfo.errors?.length) {
+ errors.push({ language, filename, errors: compileInfo.errors || [] });
+ }
+ }
+
+ const testsCompileResult = await (runTests
+ ? testsNotChanged
+ ? Promise.resolve(getCache().tests?.compiled || '')
+ : compiler.compile(
+ config.tests?.content || '',
+ config.tests?.language || 'javascript',
+ config,
+ { filename: 'tests' },
+ )
+ : Promise.resolve(getCompileResult(getCache().tests?.compiled || '')));
+ const { code: compiledTests, info: testsCompileInfo } = getCompileResult(testsCompileResult);
+ if (testsCompileInfo?.errors?.length) {
+ errors.push({
+ language: config.tests?.language || 'javascript',
+ filename: 'tests',
+ errors: testsCompileInfo.errors || [],
+ });
+ }
+
+ const result = await createMultiFileResultPage({
+ compiledFiles,
+ compiledTests,
+ config,
+ forExport,
+ template,
+ baseUrl,
+ singleFileResult,
+ runTests,
+ compileInfo,
+ });
+
+ const styleOnlyUpdate = sourceEditor === 'style' && !compileInfo.cssModules;
+
+ const logError = (language: Language, errors: string[] = []) => {
+ errors.forEach((err) => toolsPane?.console?.error(`[${getLanguageTitle(language)}] ${err}`));
+ };
+ errors.forEach(({ language, errors }) => logError(language, errors));
+
+ if (singleFileResult) {
+ setCache({
+ ...getCache(),
+ files: compiledFiles,
+ mainFile: config.mainFile,
+ result: cleanResultFromDev(result),
+ styleOnlyUpdate,
+ });
+
+ if (broadcastInfo.isBroadcasting) {
+ broadcast();
+ }
+ if (resultPopup && !resultPopup.closed) {
+ resultPopup?.postMessage({ result }, location.origin);
+ }
+ }
+
+ return result;
+};
+
+const mergeCompileInfo = (compileInfo: CompileInfo, newCompileInfo: CompileInfo) => ({
+ ...compileInfo,
+ ...newCompileInfo,
+ cssModules: {
+ ...compileInfo.cssModules,
+ ...newCompileInfo.cssModules,
+ },
+ importedContent: (compileInfo.importedContent || '') + (newCompileInfo.importedContent || ''),
+ imports: {
+ ...compileInfo.imports,
+ ...newCompileInfo.imports,
+ },
+});
+
const reloadCompiler = async (config: Config, force = false) => {
if (!compiler.isFake && !force) return;
compiler = (window as any).compiler = await getCompiler({
config,
baseUrl,
eventsManager,
+ getTypes: async (code: string) =>
+ typeLoader.load(code, { ...config.types, ...config.customSettings.types }, true),
});
setCache();
await getResultPage({});
@@ -1159,6 +1713,8 @@ const flushResult = () => {
content: '',
compiled: '',
},
+ files: [],
+ mainFile: undefined,
});
updateCompiledCode();
@@ -1253,18 +1809,26 @@ const run = async (editorId?: EditorId, runTests?: boolean) => {
if (editorId !== 'style') {
toolsPane?.console?.clear(/* silent= */ true);
}
+
const config = getConfig();
const shouldRunTests = (runTests ?? config.autotest) && Boolean(config.tests?.content?.trim());
- const result = await getResultPage({ sourceEditor: editorId, runTests: shouldRunTests });
+ const result = await getResultPage({
+ sourceEditor: editorId,
+ runTests: shouldRunTests,
+ });
await createIframe(UI.getResultElement(), result);
updateCompiledCode();
+
+ let runEvent: CustomEvent<{ code: Code; config: SDKConfig } | void>;
if (sdkWatchers.run.hasSubscribers()) {
- const runEvent = new CustomEvent(customEvents.run, {
- detail: { code: getCachedCode(), config },
+ runEvent = new CustomEvent(customEvents.run, {
+ detail: { code: getCachedCode(), config: getSDKConfig(config) },
});
- document.dispatchEvent(runEvent);
- parent.dispatchEvent(runEvent);
+ } else {
+ runEvent = new CustomEvent(customEvents.run);
}
+ document.dispatchEvent(runEvent);
+ parent.dispatchEvent(runEvent);
};
const runTests = () => run(/* editorId= */ undefined, /* runTests= */ true);
@@ -1289,11 +1853,11 @@ const format = async (allEditors = true) => {
);
} else {
const activeEditor = getActiveEditor();
- await activeEditor.format();
+ await activeEditor?.format();
if (getConfig().foldRegions) {
- await activeEditor.foldRegions?.();
+ await activeEditor?.foldRegions?.();
}
- activeEditor.focus();
+ activeEditor?.focus();
}
updateConfig();
};
@@ -1340,31 +1904,34 @@ const share = async (
permanentUrl = false,
): Promise => {
const config = getConfig();
- const content = contentOnly
- ? {
- ...getContentConfig(config),
- markup: {
- ...config.markup,
- title: undefined,
- hideTitle: undefined,
- },
- style: {
- ...config.style,
- title: undefined,
- hideTitle: undefined,
- },
- script: {
- ...config.script,
- title: undefined,
- hideTitle: undefined,
- },
- tools: {
- ...config.tools,
- enabled: defaultConfig.tools.enabled,
- status: config.tools.status === 'none' ? defaultConfig.tools.status : config.tools.status,
- },
- }
- : config;
+ const content = getSDKConfig(
+ contentOnly
+ ? {
+ ...getContentConfig(config),
+ markup: {
+ ...config.markup,
+ title: undefined,
+ hidden: undefined,
+ },
+ style: {
+ ...config.style,
+ title: undefined,
+ hidden: undefined,
+ },
+ script: {
+ ...config.script,
+ title: undefined,
+ hidden: undefined,
+ },
+ tools: {
+ ...config.tools,
+ enabled: defaultConfig.tools.enabled,
+ status:
+ config.tools.status === 'none' ? defaultConfig.tools.status : config.tools.status,
+ },
+ }
+ : config,
+ );
const currentUrl = (location.origin + location.pathname).split('/').slice(0, -1).join('/') + '/';
const appUrl = permanentUrl ? permanentUrlService.getAppUrl() : currentUrl;
@@ -1394,24 +1961,38 @@ const share = async (
};
const updateConfig = () => {
+ const newConfig = getConfig();
editorIds.forEach((editorId) => {
- setConfig({
- ...getConfig(),
- [editorId]: {
- ...getConfig()[editorId],
- language: getEditorLanguage(editorId),
+ if (
+ (editorId === 'markup' || editorId === 'style' || editorId === 'script') &&
+ editors[editorId]
+ ) {
+ newConfig[editorId] = {
+ ...newConfig[editorId],
+ language: getEditorLanguage(editorId) as Language,
content: editors[editorId].getValue(),
- },
- });
+ };
+ }
});
+ newConfig.files = newConfig.files.map((file) =>
+ editors[file.filename]
+ ? {
+ ...file,
+ language: getFileLanguage(file.filename, newConfig) as Language,
+ content: editors[file.filename].getValue(),
+ }
+ : file,
+ );
+ setConfig(newConfig);
};
const loadConfig = async (
- newConfig: Partial,
+ newConfig: Partial,
url?: string,
flush = true,
) => {
changingContent = true;
+ const currentConfig = getConfig();
const validConfig = upgradeAndValidate(newConfig);
const content = getContentConfig({
...defaultConfig,
@@ -1445,7 +2026,7 @@ const loadConfig = async (
iframeScrollPosition.x = 0;
iframeScrollPosition.y = 0;
- await applyConfig(config, /* reload= */ true);
+ await applyConfig(config, /* reload= */ true, currentConfig);
changingContent = false;
};
@@ -1453,6 +2034,10 @@ const loadConfig = async (
const applyConfig = async (newConfig: Partial, reload = false, oldConfig?: Config) => {
const currentConfig = oldConfig || getConfig();
const combinedConfig: Config = { ...currentConfig, ...newConfig };
+ for (const file of oldConfig?.files || []) {
+ deleteFile(file.filename);
+ }
+ configureMultiFile(combinedConfig);
if (newConfig.mode || newConfig.view) {
window.deps?.showMode?.(combinedConfig.mode, combinedConfig.view);
}
@@ -1461,7 +2046,6 @@ const applyConfig = async (newConfig: Partial, reload = false, oldConfig
}
phpHelper({ editor: editors.script });
setLoading(true);
- await setActiveEditor(combinedConfig);
if (!isEmbed) {
loadSettings(combinedConfig);
@@ -1482,9 +2066,6 @@ const applyConfig = async (newConfig: Partial, reload = false, oldConfig
setConfig(combinedConfig);
- if (!isEmbed) {
- setTimeout(() => getActiveEditor().focus());
- }
setExternalResourcesMark();
setProjectInfoMark();
setCustomSettingsMark();
@@ -1543,22 +2124,28 @@ const applyConfig = async (newConfig: Partial, reload = false, oldConfig
const hasEditorConfig = Object.keys(editorConfig).some((k) => k in newConfig);
let shouldReloadEditors = (() => {
- if (newConfig.editor != null && !(newConfig.editor in editors.markup)) return true;
+ if (oldConfig?.files?.length || newConfig.files?.length) return true;
+ const activeEditor = getActiveEditor();
+ if (activeEditor == null) return false;
+ if (newConfig.editor != null && newConfig.editor in activeEditor) return true;
if (newConfig.mode != null) {
- if (newConfig.mode !== 'result' && editors.markup.isFake) return true;
- if (newConfig.mode !== 'codeblock' && editors.markup.codejar) return true;
+ if (newConfig.mode !== 'result' && activeEditor.isFake) return true;
+ if (newConfig.mode !== 'codeblock' && activeEditor.codejar) return true;
}
return false;
})();
- if ('configureTailwindcss' in editors.markup) {
+ const markupEditor = oldConfig?.files.length
+ ? editors[getMainFile(oldConfig) || 'index.html']
+ : editors.markup;
+ if (markupEditor && 'configureTailwindcss' in markupEditor) {
if (newConfig.processors?.includes('tailwindcss')) {
- editors.markup.configureTailwindcss?.(true);
+ markupEditor.configureTailwindcss?.(true);
}
if (
currentConfig.processors?.includes('tailwindcss') &&
!newConfig.processors?.includes('tailwindcss')
) {
- editors.markup.configureTailwindcss?.(false);
+ markupEditor.configureTailwindcss?.(false);
shouldReloadEditors = true;
}
}
@@ -1571,7 +2158,10 @@ const applyConfig = async (newConfig: Partial, reload = false, oldConfig
};
getAllEditors().forEach((editor) => editor.changeSettings(currentEditorConfig));
}
-
+ showEditor(combinedConfig.activeEditor);
+ if (!isEmbed) {
+ setTimeout(() => getActiveEditor()?.focus());
+ }
parent.dispatchEvent(new Event(customEvents.ready));
};
@@ -1618,7 +2208,7 @@ const loadTemplate = async (templateId: string) => {
};
const dispatchChangeEvent = debounce(async () => {
- let changeEvent: CustomEvent<{ code: Code; config: Config } | void>;
+ let changeEvent: CustomEvent<{ code: Code; config: SDKConfig } | void>;
if (sdkWatchers.code.hasSubscribers()) {
if (!cacheIsValid(getCache(), getContentConfig(getConfig()))) {
await getResultPage({ forExport: true });
@@ -1626,7 +2216,7 @@ const dispatchChangeEvent = debounce(async () => {
changeEvent = new CustomEvent(customEvents.change, {
detail: {
code: getCachedCode(),
- config: getConfig(),
+ config: getSDKConfig(getConfig()),
},
});
} else {
@@ -1730,7 +2320,10 @@ const checkRecoverStatus = (isWelcomeScreen = false) => {
} else {
const div = document.createElement('div');
div.innerHTML = recoverPromptScreen;
- modal.show(div.firstChild as HTMLElement, { size: 'small', isAsync: true });
+ modal.show(div.firstChild as HTMLElement, {
+ size: 'small',
+ isAsync: true,
+ });
}
UI.getModalUnsavedName().textContent = projectName;
@@ -1962,7 +2555,10 @@ const registerScreen = (screen: Screen['screen'], fn: Screen['show']) => {
if (registered) {
registered.show = fn;
} else {
- screens.push({ screen: screen.toLowerCase() as Screen['screen'], show: fn });
+ screens.push({
+ screen: screen.toLowerCase() as Screen['screen'],
+ show: fn,
+ });
}
};
@@ -1992,7 +2588,7 @@ const getAllEditors = (): CodeEditor[] =>
...Object.values(editors),
toolsPane?.console?.getEditor?.(),
toolsPane?.compiled?.getEditor?.(),
- ].filter((x) => x != null);
+ ].filter((x) => x != null) as CodeEditor[];
const runViewTransition = (fn: () => void | Promise) => {
if ((document as any).startViewTransition) {
@@ -2183,6 +2779,7 @@ const showLanguageInfo = async (languageInfo: HTMLElement) => {
};
const loadStarterTemplate = async (templateName: Template['name'], checkSaved = true) => {
+ modal.show(loadingMessage(), { size: 'small' });
const templates = await getTemplates();
const { title, thumbnail, ...templateConfig } =
templates.filter((template) => template.name === templateName)?.[0] || {};
@@ -2211,33 +2808,51 @@ const loadStarterTemplate = async (templateName: Template['name'], checkSaved =
}
};
-const getPlaygroundState = (): Config & Code => {
- const config = getConfig();
+const getPlaygroundState = (): Omit & Code => {
+ const config = getSDKConfig(getConfig());
const cachedCode = getCachedCode();
- return {
- ...config,
- ...cachedCode,
- markup: {
- ...config.markup,
- ...cachedCode.markup,
- position: editors.markup.getPosition(),
- },
- style: {
- ...config.style,
- ...cachedCode.style,
- position: editors.style.getPosition(),
- },
- script: {
- ...config.script,
- ...cachedCode.script,
- position: editors.script.getPosition(),
- },
- tools: {
- enabled: config.tools.enabled,
- active: toolsPane?.getActiveTool() ?? '',
- status: toolsPane?.getStatus() ?? '',
- },
+ const tools: Config['tools'] = {
+ enabled: config.tools.enabled,
+ active: toolsPane?.getActiveTool() ?? '',
+ status: toolsPane?.getStatus() ?? '',
};
+
+ return 'files' in config && 'files' in cachedCode
+ ? {
+ ...getMultiFileConfig(config),
+ ...cachedCode,
+ files: cachedCode.files.map((file) => ({
+ ...file,
+ position: editors[file.filename]?.getPosition(),
+ })),
+ tools,
+ }
+ : 'markup' in config && 'markup' in cachedCode
+ ? {
+ ...getSingleFileConfig(config),
+ ...cachedCode,
+ markup: {
+ ...config.markup,
+ ...cachedCode.markup,
+ position: editors.markup?.getPosition(),
+ },
+ style: {
+ ...config.style,
+ ...cachedCode.style,
+ position: editors.style?.getPosition(),
+ },
+ script: {
+ ...config.script,
+ ...cachedCode.script,
+ position: editors.script?.getPosition(),
+ },
+ tools,
+ }
+ : ({
+ ...config,
+ ...cachedCode,
+ tools,
+ } as SDKConfig & Code);
};
const zoom = (level: Config['zoom'] = 1) => {
@@ -2460,12 +3075,6 @@ const handleTitleEdit = () => {
}
};
- const removeFormatting = (e: any) => {
- e.preventDefault();
- const text = e.clipboardData.getData('text/plain');
- document.execCommand('insertHTML', false, text);
- };
-
eventsManager.addEventListener(projectTitle, 'input', () => setProjectTitle(), false);
eventsManager.addEventListener(projectTitle, 'blur', () => setProjectTitle(true), false);
eventsManager.addEventListener(projectTitle, 'keypress', blurOnEnter as any, false);
@@ -2534,7 +3143,9 @@ const handleSelectEditor = () => {
(ev) => {
ev.preventDefault();
showEditor(title.dataset.editor as EditorId);
- setAppData({ language: getEditorLanguage(title.dataset.editor as EditorId) });
+ setAppData({
+ language: getEditorLanguage(title.dataset.editor as EditorId),
+ });
setProjectRecover();
},
false,
@@ -2563,8 +3174,9 @@ const handleChangeLanguage = () => {
}
};
-const handleChangeContent = () => {
- const contentChanged = async (editorId: EditorId, loading: boolean) => {
+const handleChangeContent = (editor?: CodeEditor) => {
+ const contentChanged = async (editor: CodeEditor, loading: boolean) => {
+ const editorId = editor.getEditorId();
updateConfig();
const config = getConfig();
addConsoleInputCodeCompletion();
@@ -2573,17 +3185,23 @@ const handleChangeContent = () => {
await run(editorId);
}
- if (config.markup.content !== getCache().markup.content) {
+ if (getSource(editorId, config)?.content !== getSource(editorId, getCache())?.content) {
await getResultPage({ sourceEditor: editorId });
}
+ const lang = getSource(editorId, config)?.language;
+
for (const key of Object.keys(customEditors)) {
- if (config[editorId].language === key) {
+ if (lang === key) {
await customEditors[key]?.show(true, {
baseUrl,
editors,
config,
- html: getCache().markup.compiled || config.markup.content || '',
+ html:
+ getCache().markup.compiled ||
+ config.markup.content ||
+ getSource(config.mainFile || getMainFile(config) || 'index.html', config)?.content ||
+ '',
eventsManager,
});
}
@@ -2597,18 +3215,27 @@ const handleChangeContent = () => {
loadModuleTypes(editors, config);
};
- const debouncecontentChanged = (editorId: EditorId) =>
+ const debouncecontentChanged = (editor: CodeEditor) =>
debounce(
async () => {
- await contentChanged(editorId, changingContent);
+ await contentChanged(editor, changingContent);
},
() => getConfig().delay ?? defaultConfig.delay,
);
- (Object.keys(editors) as EditorId[]).forEach((editorId) => {
- editors[editorId].onContentChanged(debouncecontentChanged(editorId));
- editors[editorId].onContentChanged(setSavedStatus);
- });
+ const subscribeEditor = (editor: CodeEditor) => {
+ if (!editor) return;
+ editor.onContentChanged(debouncecontentChanged(editor));
+ editor.onContentChanged(setSavedStatus);
+ };
+
+ if (editor) {
+ subscribeEditor(editor);
+ } else {
+ Object.values(editors).forEach((editor) => {
+ subscribeEditor(editor);
+ });
+ }
};
const handleKeyboardShortcutsScreen = () => {
@@ -2814,7 +3441,7 @@ const handleI18nMenu = () => {
};
const handleEditorTools = () => {
- if (!configureEditorTools(getActiveEditor().getLanguage())) return;
+ if (!configureEditorTools(getActiveEditor()?.getLanguage())) return;
const originalMode = getConfig().mode;
const focusButton = UI.getFocusButton();
eventsManager.addEventListener(focusButton, 'click', () => {
@@ -2837,7 +3464,8 @@ const handleEditorTools = () => {
});
eventsManager.addEventListener(UI.getCopyButton(), 'click', () => {
- if (copyToClipboard(getActiveEditor().getValue())) {
+ const activeEditor = getActiveEditor();
+ if (activeEditor && copyToClipboard(activeEditor.getValue())) {
notifications.success(
window.deps.translateString('core.copy.copied', 'Code copied to clipboard'),
);
@@ -2850,14 +3478,14 @@ const handleEditorTools = () => {
eventsManager.addEventListener(UI.getUndoButton(), 'click', () => {
const activeEditor = getActiveEditor();
- activeEditor.undo();
- activeEditor.focus();
+ activeEditor?.undo();
+ activeEditor?.focus();
});
eventsManager.addEventListener(UI.getRedoButton(), 'click', () => {
const activeEditor = getActiveEditor();
- activeEditor.redo();
- activeEditor.focus();
+ activeEditor?.redo();
+ activeEditor?.focus();
});
eventsManager.addEventListener(UI.getFormatButton(), 'click', async () => {
@@ -2866,9 +3494,11 @@ const handleEditorTools = () => {
eventsManager.addEventListener(UI.getCopyAsUrlButton(), 'click', () => {
const currentEditor = getActiveEditor();
- const mimeType = 'text/' + currentEditor.getLanguage();
- const dataUrl = toDataUrl(currentEditor.getValue(), mimeType);
- if (copyToClipboard(dataUrl)) {
+ const content = currentEditor?.getValue() || '';
+ const language = currentEditor?.getLanguage();
+ const mimeType = 'text/' + currentEditor?.getLanguage();
+ const dataUrl = language === 'binary' ? content : toDataUrl(content, mimeType);
+ if (currentEditor && copyToClipboard(dataUrl)) {
notifications.success(
window.deps.translateString('core.copy.copiedAsDataURL', 'Code copied as data URL'),
);
@@ -2884,7 +3514,9 @@ const handleEditorTools = () => {
});
eventsManager.addEventListener(UI.getEditorStatus(), 'click', () => {
- showScreen('editor-settings', { scrollToSelector: 'label[data-name="editorMode"]' });
+ showScreen('editor-settings', {
+ scrollToSelector: 'label[data-name="editorMode"]',
+ });
});
eventsManager.addEventListener(UI.getExternalResourcesBtn(), 'click', () => {
@@ -3115,7 +3747,9 @@ const handleSettings = () => {
themeColorSelector.appendChild(label);
eventsManager.addEventListener(input, 'input', () => {
- setUserConfig({ themeColor: customColor ? input.value : colorItem.themeColor });
+ setUserConfig({
+ themeColor: customColor ? input.value : colorItem.themeColor,
+ });
changeThemeColor();
});
});
@@ -3260,22 +3894,37 @@ const handleNew = () => {
const createTemplatesUI = async () => {
initTemplatesSearchIndex();
const starterTemplatesList = UI.getStarterTemplatesList(templatesContainer);
- if (!starterTemplatesList) return;
+ const multifileTemplatesList = UI.getMultifileTemplatesList(templatesContainer);
+ if (!starterTemplatesList || !multifileTemplatesList) return;
starterTemplatesList.innerHTML = '';
+ multifileTemplatesList.innerHTML = '';
const searchInput = UI.getTemplatesSearchInput(templatesContainer);
if (searchInput) {
searchInput.value = '';
}
const loadingText = starterTemplatesList?.firstElementChild;
+ const multifileLoadingText = multifileTemplatesList?.firstElementChild;
+ const createLink = (template: Template & { id: string }, list: HTMLElement) => {
+ const link = createStarterTemplateLink(template, list, baseUrl);
+ eventsManager.addEventListener(
+ link,
+ 'click',
+ (event) => {
+ event.preventDefault();
+ loadStarterTemplate(template.name, /* checkSaved= */ false);
+ },
+ false,
+ );
+ };
getTemplates()
- .then((starterTemplates) => {
+ .then((allTemplates) => {
loadingText?.remove();
- starterTemplates.forEach((template, id) => {
- const link = createStarterTemplateLink(
+ multifileLoadingText?.remove();
+ allTemplates.forEach((template, id) => {
+ const link = createLink(
{ id: String(id), ...template },
- starterTemplatesList,
- baseUrl,
- );
+ template.files?.length ? multifileTemplatesList : starterTemplatesList,
+ )!;
addTemplateToIndex({ id: String(id), ...template });
eventsManager.addEventListener(
link,
@@ -3290,6 +3939,7 @@ const handleNew = () => {
})
.catch(() => {
loadingText?.remove();
+ multifileLoadingText?.remove();
notifications.error(
window.deps.translateString(
'core.error.failedToLoadTemplates',
@@ -3297,7 +3947,6 @@ const handleNew = () => {
),
);
});
-
loadUserTemplates();
requestAnimationFrame(() => UI.getStarterTemplatesTab(templatesContainer)?.click());
modal.show(templatesContainer, { isAsync: true, size: 'large-fixed', autoFocus: false });
@@ -3379,7 +4028,7 @@ const handleImport = () => {
eventsManager,
getUser: authService?.getUser,
loadConfig,
- populateConfig,
+ importFromFiles,
projectStorage: stores.projects,
showScreen,
});
@@ -3453,11 +4102,14 @@ const handleExport = () => {
await getResultPage({});
}
const cache = getCachedCode();
- const compiled = {
- markup: cache.markup.compiled,
- style: cache.style.compiled,
- script: cache.script.compiled,
- };
+ const compiled =
+ 'markup' in cache
+ ? {
+ markup: cache.markup.compiled,
+ style: cache.style.compiled,
+ script: cache.script.compiled,
+ }
+ : cache.files.reduce((acc, file) => ({ ...acc, [file.filename]: file.compiled }), {});
await loadModule();
exportModule.exportConfig(getConfig(), baseUrl, 'codepen', {
baseUrl,
@@ -3480,11 +4132,14 @@ const handleExport = () => {
await getResultPage({});
}
const cache = getCachedCode();
- const compiled = {
- markup: cache.markup.compiled,
- style: cache.style.compiled,
- script: cache.script.compiled,
- };
+ const compiled =
+ 'markup' in cache
+ ? {
+ markup: cache.markup.compiled,
+ style: cache.style.compiled,
+ script: cache.script.compiled,
+ }
+ : cache.files.reduce((acc, file) => ({ ...acc, [file.filename]: file.compiled }), {});
await loadModule();
exportModule.exportConfig(getConfig(), baseUrl, 'jsfiddle', {
baseUrl,
@@ -3700,9 +4355,11 @@ const handlePersistentStorage = async () => {
const updateRecentProjects = (allProjects: StorageItem[]) => {
const recentProjects =
- allProjects
- ?.slice(0, 5)
- .map((p) => ({ id: p.id, title: p.config.title, description: p.config.description })) || [];
+ allProjects?.slice(0, 5).map((p) => ({
+ id: p.id,
+ title: p.config.title,
+ description: p.config.description,
+ })) || [];
setAppData({ recentProjects });
};
@@ -4042,7 +4699,8 @@ const handleEmbed = () => {
const changeEditorSettings = (newConfig: Partial | null) => {
if (!newConfig) return;
const shouldReload =
- newConfig.editor !== getConfig().editor && !((newConfig.editor || '') in getActiveEditor());
+ newConfig.editor !== getConfig().editor &&
+ !((newConfig.editor || '') in (getActiveEditor() || {}));
setUserConfig(newConfig);
const updatedConfig = getConfig();
@@ -4055,7 +4713,7 @@ const changeEditorSettings = (newConfig: Partial | null) => {
});
}
showEditorModeStatus(updatedConfig.activeEditor || 'markup');
- getActiveEditor().focus();
+ getActiveEditor()?.focus();
};
const handleEditorSettings = () => {
@@ -4115,8 +4773,8 @@ const handleCodeToImage = () => {
editor: 'codejar',
theme: 'dark',
wordWrap: true,
- language: activeEditor.getLanguage(),
- value: activeEditor.getValue(),
+ language: activeEditor?.getLanguage() || 'html',
+ value: activeEditor?.getValue() || '',
readonly: false,
editorId: 'codeToImage',
isEmbed: false,
@@ -4131,7 +4789,7 @@ const handleCodeToImage = () => {
const currentUrl = (location.origin + location.pathname).split('/').slice(0, -1).join('/');
- const getShareUrl = async (config: Partial, shortUrl = true) => {
+ const getShareUrl = async (config: Partial, shortUrl = true) => {
if (shortUrl) {
const param = '/?x=id/' + (await shareService.shareProject(config));
return currentUrl + param;
@@ -4148,13 +4806,13 @@ const handleCodeToImage = () => {
baseUrl,
currentUrl,
fileName: safeName(fileName, '-').toLowerCase(),
- editorId: getLanguageEditorId(activeEditor.getLanguage()) || 'script',
+ editorId: activeEditor?.getEditorId() || 'script',
modal,
notifications,
eventsManager,
deps: {
createEditor: createPreviewEditor,
- getFormatFn: () => formatter.getFormatFn(activeEditor.getLanguage()),
+ getFormatFn: () => formatter.getFormatFn(activeEditor?.getLanguage() || 'javascript'),
getShareUrl,
getSavedPreset,
savePreset,
@@ -4446,7 +5104,10 @@ const handleTestResults = () => {
toolsPane?.tests?.showResults({ results, error });
sdkWatchers.tests.notify({ results, error });
- let testResultsEvent: CustomEvent<{ results: TestResult[]; error?: string } | void>;
+ let testResultsEvent: CustomEvent<{
+ results: TestResult[];
+ error?: string;
+ } | void>;
if (sdkWatchers.tests.hasSubscribers()) {
testResultsEvent = new CustomEvent(customEvents.testResults, {
detail: JSON.parse(JSON.stringify({ results, error })),
@@ -4660,7 +5321,7 @@ const handleResultPopup = () => {
}
if (ev.data.type === 'ready') {
resultPopup?.postMessage(
- { result: await getResultPage({ singleFile: true }) },
+ { result: await getResultPage({ singleFileResult: true }) },
location.origin,
);
}
@@ -4749,13 +5410,52 @@ const handleDropFiles = () => {
eventsManager.addEventListener(document, 'drop', (event: DragEvent) => {
event.preventDefault();
- const files = event.dataTransfer?.files;
- if (!files?.length) return;
+ if (!event.dataTransfer) return;
+ const files = event.dataTransfer.files;
+ const items = event.dataTransfer.items; // for directories
+ if (!files?.length && !items?.length) return;
+ const entries = { files, items };
+ modal.show(loadingMessage(), { size: 'small', autoFocus: false });
- importFromFiles(files, populateConfig, eventsManager)
- .then(loadConfig)
+ importFromFiles(entries, /* multiFile= */ true)
+ .then(async (fileConfig) => {
+ // if in single file project, load as a new project
+ // otherwise, add files to current project
+ const currentConfig = getConfig();
+ if (Object.keys(fileConfig).length === 0) return;
+ if (!currentConfig.files.length) {
+ checkSavedAndExecute(async () => {
+ await loadConfig(fileConfig);
+ modal.close();
+ })();
+ } else {
+ for (const file of fileConfig.files || []) {
+ if (currentConfig.files.find((f) => f.filename === file.filename)) {
+ editors[file.filename]?.setValue(file.content);
+ } else {
+ await addFile(file.filename, {
+ baseUrl,
+ mode: currentConfig.mode,
+ readonly: currentConfig.readonly,
+ ...getEditorConfig(currentConfig),
+ isEmbed,
+ isLite,
+ isHeadless,
+ mapLanguage,
+ getLanguageExtension,
+ getFormatterConfig: () => getFormatterConfig(currentConfig),
+ getFontFamily,
+ });
+ editors[file.filename]?.setValue(file.content);
+ }
+ }
+ showEditor(fileConfig.files?.[0].filename);
+ modal.close();
+ }
+ })
.catch((message) => {
notifications.error(message);
+ modal.close();
});
});
@@ -4902,7 +5602,10 @@ const translateStringMock = (
const { isHTML, ...interpolation } = rawInterpolation ?? {};
if (!interpolation) return value as string;
let result: string = value as string;
- for (const [k, v] of Object.entries({ ...interpolation, ...predefinedValues })) {
+ for (const [k, v] of Object.entries({
+ ...interpolation,
+ ...predefinedValues,
+ })) {
result = result.replaceAll(`{{${k}}}`, v as string);
}
return result;
@@ -4966,7 +5669,7 @@ const basicHandlers = () => {
isEmbed,
onClose: () => {
if (!isEmbed) {
- getActiveEditor().focus();
+ getActiveEditor()?.focus();
}
},
});
@@ -4979,7 +5682,6 @@ const basicHandlers = () => {
handleIframeScroll();
handleSelectEditor();
handleChangeLanguage();
- handleChangeContent();
// Setup keyboard shortcuts with dependency injection
handleKeyboardShortcuts({
eventsManager,
@@ -5126,7 +5828,7 @@ const configureModes = ({
const importExternalContent = async (options: {
config?: Config;
- sdkConfig?: Partial;
+ sdkConfig?: Partial;
configUrl?: string;
template?: string;
importUrl?: string;
@@ -5136,8 +5838,9 @@ const importExternalContent = async (options: {
const hasContentUrls = (conf: Partial) =>
editorIds.filter(
(editorId) =>
- (conf[editorId]?.contentUrl && !conf[editorId]?.content) ||
- (conf[editorId]?.hiddenContentUrl && !conf[editorId]?.hiddenContent),
+ (editorId === 'markup' || editorId === 'style' || editorId === 'script') &&
+ ((conf[editorId]?.contentUrl && !conf[editorId]?.content) ||
+ (conf[editorId]?.hiddenContentUrl && !conf[editorId]?.hiddenContent)),
).length > 0;
const validConfigUrl = getValidUrl(configUrl);
if (importUrl?.startsWith('config') || importUrl?.startsWith('params')) {
@@ -5146,11 +5849,10 @@ const importExternalContent = async (options: {
if (!validConfigUrl && !template && !importUrl && !hasContentUrls(config)) return false;
- const loadingMessage = window.deps.translateString('core.import.loading', 'Loading Project...');
- notifications.info(loadingMessage);
+ modal.show(loadingMessage(), { size: 'small' });
let templateConfig: Partial = {};
- let importUrlConfig: Partial = {};
+ let importUrlConfig: Partial = {};
let contentUrlConfig: Partial = {};
let configUrlConfig: Partial = {};
@@ -5170,6 +5872,7 @@ const importExternalContent = async (options: {
);
}
}
+
if (importUrl) {
let validImportUrl = importUrl;
if (importUrl.startsWith('http') || importUrl.startsWith('data')) {
@@ -5200,27 +5903,30 @@ const importExternalContent = async (options: {
// load content from config contentUrl
const editorsContent = await Promise.all(
editorIds.map(async (editorId) => {
- const contentUrl = config[editorId].contentUrl;
- const hiddenContentUrl = config[editorId].hiddenContentUrl;
+ if (!isEditorId(editorId)) return;
+ const src = config[editorId];
+ const contentUrl = src.contentUrl;
+ const hiddenContentUrl = src.hiddenContentUrl;
const [content, hiddenContent] = await Promise.all([
- contentUrl && getValidUrl(contentUrl) && !config[editorId].content
+ contentUrl && getValidUrl(contentUrl) && !src.content
? fetch(contentUrl).then((res) => res.text())
: Promise.resolve(''),
- hiddenContentUrl && getValidUrl(hiddenContentUrl) && !config[editorId].hiddenContent
+ hiddenContentUrl && getValidUrl(hiddenContentUrl) && !src.hiddenContent
? fetch(hiddenContentUrl).then((res) => res.text())
: Promise.resolve(''),
]);
return {
- ...config[editorId],
+ ...src,
...(content ? { content } : {}),
...(hiddenContent ? { hiddenContent } : {}),
};
}),
);
+ // TODO: handle files
contentUrlConfig = {
- markup: editorsContent[0],
- style: editorsContent[1],
- script: editorsContent[2],
+ markup: editorsContent[0] || config.markup,
+ style: editorsContent[1] || config.style,
+ script: editorsContent[2] || config.script,
};
}
@@ -5231,7 +5937,10 @@ const importExternalContent = async (options: {
.catch(() => ({})),
);
if (hasContentUrls(configUrlConfig)) {
- return importExternalContent({ ...options, config: { ...config, ...configUrlConfig } });
+ return importExternalContent({
+ ...options,
+ config: { ...config, ...configUrlConfig },
+ });
}
}
@@ -5243,11 +5952,12 @@ const importExternalContent = async (options: {
...configUrlConfig,
...sdkConfig,
...contentUrlConfig,
- }),
+ } as Partial),
parent.location.href,
false,
);
+ modal.close();
loadSelectedScreen();
return true;
@@ -5300,7 +6010,7 @@ const loadDefaults = async () => {
const initializePlayground = async (
options?: {
- config?: Partial;
+ config?: Partial;
baseUrl?: string;
isEmbed?: boolean;
isHeadless?: boolean;
@@ -5329,12 +6039,20 @@ const initializePlayground = async (
window.history.replaceState(null, '', './'); // fix URL from "/app" to "/"
await initializeStores(stores, isEmbed);
const userConfig = stores.userConfig?.getValue() ?? {};
- setConfig(buildConfig({ ...getConfig(), ...userConfig, ...initialConfig }));
+ setConfig(
+ buildConfig({
+ ...getConfig(),
+ ...userConfig,
+ ...initialConfig,
+ } as Partial),
+ );
configureModes({ config: getConfig(), isEmbed, isLite });
compiler = (window as any).compiler = await getCompiler({
config: getConfig(),
baseUrl,
eventsManager,
+ getTypes: async (code: string) =>
+ typeLoader.load(code, { ...getConfig().types, ...getConfig().customSettings.types }, true),
});
formatter = getFormatter(getConfig(), baseUrl, isEmbed);
customEditors = createCustomEditors({ baseUrl, eventsManager });
@@ -5378,17 +6096,17 @@ const initializePlayground = async (
const createApi = (): API => {
const apiGetShareUrl = async (shortUrl = false) => (await share(shortUrl, true, false)).url;
- const apiGetConfig = async (contentOnly = false): Promise => {
+ const apiGetConfig = async (contentOnly = false): Promise => {
updateConfig();
const config = contentOnly ? getContentConfig(getConfig()) : getConfig();
- return JSON.parse(JSON.stringify(config));
+ return getSDKConfig(config);
};
- const apiSetConfig = async (newConfig: Partial | string): Promise => {
+ const apiSetConfig = async (newConfig: Partial | string): Promise => {
const currentConfig = getConfig();
if (typeof newConfig === 'string') {
try {
- newConfig = (await fetch(newConfig).then((r) => r.json())) as Partial;
+ newConfig = (await fetch(newConfig).then((r) => r.json())) as Partial;
} catch {
return { error: 'Invalid config URL.' } as any;
}
@@ -5396,38 +6114,46 @@ const createApi = (): API => {
if (!newConfig || typeof newConfig !== 'object') {
return { error: 'Invalid config.' } as any;
}
- const newAppConfig = buildConfig({ ...currentConfig, ...newConfig });
+ const newAppConfig = buildConfig({
+ ...currentConfig,
+ ...(newConfig as Partial),
+ // allow changing multifile project to singlefile
+ ...(currentConfig.files.length &&
+ !newConfig.files?.length &&
+ (newConfig.markup?.language || newConfig.style?.language || newConfig.script?.language)
+ ? { files: [] }
+ : {}),
+ });
const hasNewAppLanguage =
newConfig.appLanguage && newConfig.appLanguage !== i18n?.getLanguage();
const shouldRun =
newConfig.mode != null && newConfig.mode !== 'editor' && newConfig.mode !== 'codeblock';
const shouldReloadCompiler = shouldRun && compiler.isFake;
- const isContentOnlyChange = compareObjects(
- newConfig,
- currentConfig as Record,
- ).every((k) => ['markup.content', 'style.content', 'script.content'].includes(k));
+ const isContentOnlyChange =
+ !currentConfig.files.length &&
+ !newConfig.files?.length &&
+ compareObjects(newConfig, currentConfig as Record).every((k) =>
+ ['markup.content', 'style.content', 'script.content'].includes(k),
+ );
setConfig(newAppConfig);
if (isContentOnlyChange) {
for (const key of ['markup', 'style', 'script'] as const) {
- const content = newConfig[key]?.content;
+ const content = (newAppConfig as Partial)[key]?.content;
if (content != null) {
editors[key].setValue(content);
}
}
- return newAppConfig;
- }
-
- if (hasNewAppLanguage) {
- changeAppLanguage(newConfig.appLanguage!);
- return newAppConfig;
- }
- if (shouldReloadCompiler) {
+ } else if (hasNewAppLanguage) {
+ changeAppLanguage(newAppConfig.appLanguage!);
+ } else if (shouldReloadCompiler) {
await reloadCompiler(newAppConfig);
+ } else {
+ await applyConfig(newAppConfig as Partial, /* reload = */ true, currentConfig);
}
- await applyConfig(newConfig, /* reload = */ true, currentConfig);
- return newAppConfig;
+
+ return getSDKConfig(newAppConfig);
};
const apiGetCode = async (): Promise => {
@@ -5435,7 +6161,7 @@ const createApi = (): API => {
if (!cacheIsValid(getCache(), getContentConfig(getConfig()))) {
await getResultPage({ forExport: true });
}
- return JSON.parse(JSON.stringify(getCachedCode()));
+ return cloneObject(getCachedCode());
};
const apiShow: API['show'] = async (
@@ -5459,7 +6185,7 @@ const createApi = (): API => {
split?.show('code', full);
} else if (panel === 'console' || panel === 'compiled' || panel === 'tests') {
split?.show('output');
- toolsPane?.setActiveTool(panel);
+ toolsPane?.setActiveTool(panel as 'console' | 'compiled' | 'tests');
if (full) {
toolsPane?.maximize();
} else {
@@ -5470,8 +6196,8 @@ const createApi = (): API => {
split?.show('code', full);
if (typeof line === 'number' && line > 0) {
const col = typeof column === 'number' && column > -1 ? column : 0;
- getActiveEditor().setPosition({ lineNumber: line, column: col });
- getActiveEditor().focus();
+ getActiveEditor()?.setPosition({ lineNumber: line, column: col });
+ getActiveEditor()?.focus();
}
} else {
throw new Error(window.deps.translateString('core.error.invalidPanelId', 'Invalid panel id'));
@@ -5516,7 +6242,9 @@ const createApi = (): API => {
}
const token = args[0];
if (typeof token !== 'string') {
- return { error: window.deps.translateString('core.error.invalidToken', 'Invalid token!') };
+ return {
+ error: window.deps.translateString('core.error.invalidToken', 'Invalid token!'),
+ };
}
setAppData({
broadcast: {
@@ -5535,7 +6263,9 @@ const createApi = (): API => {
const output = getVersion();
return { output };
}
- return { error: window.deps.translateString('core.error.invalidCommand', 'Invalid command!') };
+ return {
+ error: window.deps.translateString('core.error.invalidCommand', 'Invalid command!'),
+ };
};
const apiDestroy = async () => {
@@ -5573,7 +6303,7 @@ const createApi = (): API => {
};
};
-const initApp = async (config: Partial, baseUrl: string) => {
+const initApp = async (config: Partial, baseUrl: string) => {
window.deps = {
showMode,
translateString: translateStringMock,
@@ -5588,7 +6318,7 @@ const initApp = async (config: Partial, baseUrl: string) => {
return createApi();
};
-const initEmbed = async (config: Partial, baseUrl: string) => {
+const initEmbed = async (config: Partial, baseUrl: string) => {
window.deps = {
showMode,
translateString: translateStringMock,
@@ -5604,7 +6334,7 @@ const initEmbed = async (config: Partial, baseUrl: string) => {
return createApi();
};
-const initHeadless = async (config: Partial, baseUrl: string) => {
+const initHeadless = async (config: Partial, baseUrl: string) => {
window.deps = {
showMode: () => undefined,
translateString: translateStringMock,
diff --git a/src/livecodes/editor/binary-file-editor.ts b/src/livecodes/editor/binary-file-editor.ts
new file mode 100644
index 0000000000..046e0029e4
--- /dev/null
+++ b/src/livecodes/editor/binary-file-editor.ts
@@ -0,0 +1,120 @@
+import type { CodeEditor, EditorOptions } from '../models';
+import { createFakeEditor } from './fake-editor';
+
+export const createBinaryFileEditor = (options: EditorOptions): CodeEditor => {
+ if (!options.container) return createFakeEditor(options);
+ const container = document.createElement('div');
+ container.classList.add('binary-file-editor');
+ options.container.appendChild(container);
+
+ const editor = createFakeEditor(options);
+
+ type Listener = () => void;
+ const listeners: Listener[] = [];
+ const onContentChanged = (fn: Listener) => {
+ listeners.push(fn);
+ };
+
+ const setValue = (value: string = '') => {
+ editor.setValue(value);
+ listeners.forEach((fn) => fn());
+ if (value) {
+ showFile();
+ } else {
+ showFileSelector();
+ }
+ };
+
+ const fileSelector = document.createElement('input');
+ fileSelector.type = 'file';
+ fileSelector.onchange = (ev) => {
+ const file = (ev.target as HTMLInputElement).files?.[0];
+ if (!file) return;
+
+ // Max 2 MB allowed
+ const maxSizeAllowed = 2 * 1024 * 1024;
+ if (file.size > maxSizeAllowed) {
+ alert(
+ window.deps.translateString(
+ 'generic.error.exceededSize',
+ 'Error: Exceeded size {{size}} MB',
+ { size: 2 },
+ ),
+ );
+ return;
+ }
+
+ const reader = new FileReader();
+ reader.onload = () => {
+ setValue(reader.result as string);
+ showFile();
+ };
+ reader.readAsDataURL(file);
+ };
+
+ const showFileSelector = () => {
+ const btn = document.createElement('button');
+ btn.innerHTML = window.deps.translateString('app.binaryFileEditor.selectFile', 'Select file');
+ btn.onclick = () => fileSelector.click();
+ container.innerHTML = '';
+ container.appendChild(btn);
+ };
+
+ const showFile = () => {
+ const src = editor.getValue();
+
+ if (!src) {
+ showFileSelector();
+ return;
+ }
+
+ let display;
+ if (src.startsWith('data:video')) {
+ display = document.createElement('video');
+ display.src = src;
+ } else {
+ display = document.createElement('img');
+ if (src.startsWith('data:image')) {
+ display.src = src;
+ } else if (src.startsWith('data:audio')) {
+ display.src = options.baseUrl + 'assets/images/audio.svg';
+ display.classList.add('icon');
+ } else if (src.startsWith('data:font')) {
+ display.src = options.baseUrl + 'assets/images/font.svg';
+ display.classList.add('icon');
+ } else {
+ display.src = options.baseUrl + 'assets/images/file.svg';
+ display.classList.add('icon');
+ }
+ }
+
+ const link = document.createElement('a');
+ link.title = window.deps.translateString('app.binaryFileEditor.selectFile', 'Select file');
+ link.onclick = (ev) => {
+ ev.preventDefault();
+ fileSelector.click();
+ };
+ link.appendChild(display);
+
+ container.innerHTML = '';
+ container.appendChild(link);
+ };
+
+ if (!editor.getValue()) {
+ showFileSelector();
+ } else {
+ showFile();
+ }
+
+ const destroy = () => {
+ listeners.length = 0;
+ container.remove();
+ };
+
+ return {
+ ...editor,
+ setValue,
+ onContentChanged,
+ destroy,
+ };
+};
diff --git a/src/livecodes/editor/codejar/codejar.ts b/src/livecodes/editor/codejar/codejar.ts
index 7fbc1f45f5..282569bb78 100644
--- a/src/livecodes/editor/codejar/codejar.ts
+++ b/src/livecodes/editor/codejar/codejar.ts
@@ -10,6 +10,7 @@ import 'prismjs/components/prism-typescript';
import 'prismjs/plugins/autoloader/prism-autoloader';
import 'prismjs/plugins/line-numbers/prism-line-numbers';
+import { getFileLanguage } from '../../languages';
import type {
CodeEditor,
CodejarTheme,
@@ -32,13 +33,17 @@ Prism.manual = true;
Prism.plugins.autoloader.languages_path = prismBaseUrl;
export const createEditor = async (options: EditorOptions): Promise => {
- const { container, mode, editorId, readonly, isEmbed, getFormatterConfig, getFontFamily } =
- options;
+ const { container, mode, readonly, isEmbed, getFormatterConfig, getFontFamily } = options;
if (!container) throw new Error('editor container not found');
- let { value, language } = options;
+ let { value, language, editorId } = options;
let currentPosition: EditorPosition = { lineNumber: 1 };
- const mapLanguage = (lang: Language) => options.mapLanguage?.(lang, 'codejar');
+ const mapLanguage = (lang: Language) => {
+ if (!lang) return 'html';
+ if (editorId.endsWith('.js')) return 'javascript';
+ if (editorId.endsWith('.ts')) return 'typescript';
+ return options.mapLanguage?.(lang, 'codejar') || lang;
+ };
let mappedLanguage = mapLanguage(language);
let editorOptions: ReturnType;
@@ -135,6 +140,13 @@ export const createEditor = async (options: EditorOptions): Promise
// codejar?.onPaste(handleUpdate);
const getEditorId = () => editorId;
+ const setEditorId = (filename: string, lang?: Language) => {
+ editorId = filename;
+ const newLang = lang || getFileLanguage(filename, {});
+ if (newLang && newLang !== language) {
+ setLanguage(newLang);
+ }
+ };
const getValue = () => (codejar ? codejar.toString() : value);
const setValue = (newValue = '\n') => {
value = newValue;
@@ -157,6 +169,7 @@ export const createEditor = async (options: EditorOptions): Promise
const getLanguage = () => language;
const setLanguage = (lang: Language, newValue?: string) => {
+ if (!lang) return;
language = lang;
mappedLanguage = mapLanguage(language);
codeElement.className = 'language-' + mappedLanguage;
@@ -430,6 +443,7 @@ export const createEditor = async (options: EditorOptions): Promise
getLanguage,
setLanguage,
getEditorId,
+ setEditorId,
focus,
getPosition,
setPosition: (position) => setPosition(position),
diff --git a/src/livecodes/editor/codemirror/codemirror.ts b/src/livecodes/editor/codemirror/codemirror.ts
index a947789215..a129c30cf7 100644
--- a/src/livecodes/editor/codemirror/codemirror.ts
+++ b/src/livecodes/editor/codemirror/codemirror.ts
@@ -31,7 +31,7 @@ import { rainbowbrackets } from 'rainbowbrackets';
// these are imported normally
import { getEditorModeNode } from '../../UI/selectors';
-import { getLanguageSpecs } from '../../languages';
+import { getFileLanguage, getLanguageSpecs } from '../../languages';
import type {
CodeEditor,
CodemirrorTheme,
@@ -48,7 +48,6 @@ import { ctrl, debounce, getRandomString } from '../../utils/utils';
import { codeMirrorBaseUrl, codemirrorMinimapUrl, comlinkBaseUrl } from '../../vendors';
import { getEditorTheme } from '../themes';
import { codemirrorThemes, customThemes } from './codemirror-themes';
-import { editorLanguages } from './editor-languages';
// export type CodeiumEditor = Pick & {
// editorId: EditorOptions['editorId'];
@@ -59,23 +58,15 @@ let tabFocusMode = false;
const changeTabFocusMode = debounce(() => (tabFocusMode = !tabFocusMode), 50);
export const createEditor = async (options: EditorOptions): Promise => {
- const {
- container,
- readonly,
- isEmbed,
- editorId,
- getFormatterConfig,
- getFontFamily,
- getLanguageExtension,
- } = options;
+ const { container, readonly, isEmbed, getFormatterConfig, getFontFamily, getLanguageExtension } =
+ options;
+ let { editorId, language } = options;
let editorSettings: EditorConfig = { ...options };
if (!container) throw new Error('editor container not found');
const getLanguageSupport = async (lang: Language): Promise => {
const langSupport = getLanguageSpecs(lang)?.editorSupport?.codemirror?.languageSupport;
- if (!langSupport) {
- return editorLanguages[lang]?.() || editorLanguages.html?.() || [];
- }
+ if (!langSupport) return [];
const loadLanguage: () => Promise =
typeof langSupport === 'string'
? (await import(langSupport)).default
@@ -85,10 +76,10 @@ export const createEditor = async (options: EditorOptions): Promise
return loadLanguage();
};
- const mapLanguage = (lang: Language) => {
- if (lang.startsWith('vue')) return 'vue';
- if (lang.startsWith('svelte')) return 'svelte';
- if (lang === 'liquid') return 'liquid';
+ const mapLanguage = (lang: Language | undefined) => {
+ if (!lang) return 'html';
+ if (editorId.endsWith('.ts')) return 'typescript';
+ if (editorId.endsWith('.js')) return 'javascript';
return options.mapLanguage?.(lang, 'codemirror') || lang;
};
@@ -108,7 +99,6 @@ export const createEditor = async (options: EditorOptions): Promise
};
const getActiveTheme = () => themes[theme] || themes[defaultThemes[options.theme]] || [];
- let language = options.language;
let mappedLanguage = mapLanguage(language);
let mappedLanguageSupport = await getLanguageSupport(mappedLanguage);
let theme: CodemirrorTheme = await loadTheme(options.theme, options.editorTheme);
@@ -176,7 +166,7 @@ export const createEditor = async (options: EditorOptions): Promise
mappedLanguage === 'typescript' && !ext?.endsWith('ts') && !ext?.endsWith('tsx')
? ext + '.tsx'
: ext;
- const path = `/${editorId}.${random}.${extension}`;
+ const path = editorId.includes('.') ? `/${editorId}` : `/${editorId}.${random}.${extension}`;
codemirrorTS = codemirrorTS || [
tsFacetWorker.of({ worker: tsWorker, path }),
@@ -340,6 +330,14 @@ export const createEditor = async (options: EditorOptions): Promise
showEditorMode(options.editorMode);
const getEditorId = () => editorId;
+ const setEditorId = (filename: string, lang?: Language) => {
+ editorId = filename;
+ const newLang = lang || getFileLanguage(filename, {});
+ if (newLang && newLang !== language) {
+ setLanguage(newLang);
+ }
+ tsLoaded.then(() => loadTS(true));
+ };
const getValue = () => view.state.doc.toString();
const setValue = (value = '', newState = true) => {
if (newState) {
@@ -357,6 +355,7 @@ export const createEditor = async (options: EditorOptions): Promise
const focus = () => view.focus();
const getLanguage = () => language;
const setLanguage = (lang: Language, value?: string) => {
+ if (!lang) return;
language = lang;
mappedLanguage = mapLanguage(language);
getLanguageSupport(mappedLanguage).then((langSupport) => {
@@ -365,9 +364,7 @@ export const createEditor = async (options: EditorOptions): Promise
effects: [languageExtension.reconfigure(mappedLanguageSupport)],
});
});
- tsLoaded.then(() => {
- loadTS(true);
- });
+ tsLoaded.then(() => loadTS(true));
if (value != null) {
setValue(value);
}
@@ -559,6 +556,7 @@ export const createEditor = async (options: EditorOptions): Promise
getLanguage,
setLanguage,
getEditorId,
+ setEditorId,
focus,
getPosition,
setPosition,
diff --git a/src/livecodes/editor/codemirror/editor-languages.ts b/src/livecodes/editor/codemirror/editor-languages.ts
deleted file mode 100644
index b921ceb36b..0000000000
--- a/src/livecodes/editor/codemirror/editor-languages.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/* eslint-disable import/no-unresolved */
-// @ts-ignore
-import type { LanguageSupport } from '@codemirror/language';
-// @ts-ignore
-import { json } from '@codemirror/lang-json';
-
-import type { Language } from '../../models';
-
-export const editorLanguages: Partial<{ [key in Language]: () => Promise }> = {
- json: async () => json(),
-};
diff --git a/src/livecodes/editor/create-editor.ts b/src/livecodes/editor/create-editor.ts
index 5fa27664b0..85dffde055 100644
--- a/src/livecodes/editor/create-editor.ts
+++ b/src/livecodes/editor/create-editor.ts
@@ -1,5 +1,7 @@
+import { getFileLanguage } from '../languages/utils';
import type { CodeEditor, Config, EditorOptions } from '../models';
import { isMobile, loadStylesheet } from '../utils';
+import { createBinaryFileEditor } from './binary-file-editor';
import { createFakeEditor } from './fake-editor';
import { fonts } from './fonts';
@@ -30,21 +32,23 @@ const selectEditor = (options: EditorOptions & { activeEditor?: Config['activeEd
const { editor, mode, editorId, activeEditor, isLite, isHeadless } = options;
const auto = isMobile() ? 'codemirror' : 'monaco';
return (
- (isHeadless
- ? 'fake'
- : mode === 'result' && editorId !== 'console' && editorId !== 'compiled'
+ (getFileLanguage(editorId, {}) === 'binary'
+ ? 'binary'
+ : isHeadless
? 'fake'
- : mode === 'simple' && editorId !== activeEditor
+ : mode === 'result' && editorId !== 'console' && editorId !== 'compiled'
? 'fake'
- : ['codemirror', 'monaco', 'codejar'].includes(editor || '')
- ? editor
- : editor === 'auto'
- ? auto
- : mode === 'simple' && editorId === activeEditor
- ? 'codemirror'
- : mode === 'codeblock' || isLite
- ? 'codejar'
- : auto) || 'monaco'
+ : mode === 'simple' && editorId !== activeEditor
+ ? 'fake'
+ : ['codemirror', 'monaco', 'codejar'].includes(editor || '')
+ ? editor
+ : editor === 'auto'
+ ? auto
+ : mode === 'simple' && editorId === activeEditor
+ ? 'codemirror'
+ : mode === 'codeblock' || isLite
+ ? 'codejar'
+ : auto) || 'monaco'
);
};
@@ -93,9 +97,11 @@ export const createEditor = async (
if (!options) throw new Error();
const editorOptions = getEditorOptions(options);
+ if (!options.language) return createFakeEditor(editorOptions);
const editorName = selectEditor(editorOptions);
if (editorName === 'fake') return createFakeEditor(editorOptions);
+ if (editorName === 'binary') return createBinaryFileEditor(editorOptions);
if (editorOptions.fontFamily) {
loadFont(editorOptions.fontFamily);
diff --git a/src/livecodes/editor/fake-editor.ts b/src/livecodes/editor/fake-editor.ts
index ef354afcf3..862a6ffbd4 100644
--- a/src/livecodes/editor/fake-editor.ts
+++ b/src/livecodes/editor/fake-editor.ts
@@ -1,9 +1,8 @@
-import { getLanguageEditorId } from '../languages';
+import { getFileLanguage } from '../languages';
import type { CodeEditor, EditorOptions } from '../models';
export const createFakeEditor = (options: EditorOptions): CodeEditor => {
- let value = options.value;
- let language = options.language;
+ let { value, language, editorId } = options;
return {
getValue: () => value,
setValue: (v = '') => {
@@ -16,7 +15,11 @@ export const createFakeEditor = (options: EditorOptions): CodeEditor => {
value = v;
}
},
- getEditorId: () => getLanguageEditorId(language) || 'markup',
+ getEditorId: () => editorId,
+ setEditorId: (fileName) => {
+ editorId = fileName;
+ language = getFileLanguage(fileName, {}) || language;
+ },
focus: () => undefined,
getPosition: () => ({ lineNumber: 1, column: 1 }),
setPosition: () => undefined,
diff --git a/src/livecodes/editor/monaco/monaco-languages.ts b/src/livecodes/editor/monaco/monaco-languages.ts
new file mode 100644
index 0000000000..5135d08be5
--- /dev/null
+++ b/src/livecodes/editor/monaco/monaco-languages.ts
@@ -0,0 +1,38 @@
+import type * as Monaco from 'monaco-editor';
+
+import type { Language } from '../../models';
+import { monacoLanguagesBaseUrl } from '../../vendors';
+
+export interface CustomLanguageDefinition {
+ config?: Monaco.languages.LanguageConfiguration;
+ tokens?: Monaco.languages.IMonarchLanguage;
+ completions?: Monaco.languages.CompletionItemProvider;
+ definitions?: Monaco.languages.DefinitionProvider;
+ init?: (monaco: typeof Monaco) => void;
+}
+
+export const customLanguages: Partial> = {
+ astro: monacoLanguagesBaseUrl + 'astro.js',
+ clio: monacoLanguagesBaseUrl + 'clio.js',
+ imba: monacoLanguagesBaseUrl + 'imba.js',
+ json5: monacoLanguagesBaseUrl + 'json5.js',
+ minizinc: monacoLanguagesBaseUrl + 'minizinc.js',
+ prolog: monacoLanguagesBaseUrl + 'prolog.js',
+ // sql: monacoLanguagesBaseUrl + 'sql.js', // TODO: add autocomplete
+ vue: monacoLanguagesBaseUrl + 'vue.js',
+ svelte: monacoLanguagesBaseUrl + 'svelte.js',
+ wat: monacoLanguagesBaseUrl + 'wat.js',
+
+ dotenv: {
+ config: { comments: { lineComment: '#' } },
+ tokens: {
+ tokenizer: {
+ root: [
+ [/#.*$/, 'comment'],
+ [/([a-zA-Z_][a-zA-Z0-9_]*)(=)([^#]*)(#.*)$/, ['key', 'delimiter', 'value', 'comment']],
+ [/([a-zA-Z_][a-zA-Z0-9_]*)(=)(.*)$/, ['key', 'delimiter', 'value']],
+ ],
+ },
+ },
+ },
+};
diff --git a/src/livecodes/editor/monaco/monaco.ts b/src/livecodes/editor/monaco/monaco.ts
index 473e0dc253..d289b73078 100644
--- a/src/livecodes/editor/monaco/monaco.ts
+++ b/src/livecodes/editor/monaco/monaco.ts
@@ -1,8 +1,9 @@
import type * as Monaco from 'monaco-editor';
-import { getEditorModeNode } from '../../UI/selectors';
+import { getEditorModeNode, getEditorTab } from '../../UI/selectors';
import { getImports } from '../../compiler/import-map';
import { getLanguageSpecs, hasJsx } from '../../languages';
+import { getFileLanguage } from '../../languages/utils';
import type {
APIError,
CodeEditor,
@@ -52,14 +53,20 @@ export const createEditor = async (options: EditorOptions): Promise
editorTheme,
isEmbed,
getLanguageExtension,
- mapLanguage,
getFormatterConfig,
getFontFamily,
} = options;
- let language = options.language;
+ let { editorId, language } = options;
if (!container) throw new Error('editor container not found');
+ const mapLanguage = (lang: Language | undefined) => {
+ if (!lang) return 'html';
+ if (editorId.endsWith('.ts')) return 'typescript';
+ if (editorId.endsWith('.js')) return 'javascript';
+ return options.mapLanguage?.(lang, 'monaco') || lang;
+ };
+
const loadMonaco = () => import(monacoBaseUrl + 'monaco.js');
let editorMode: any | undefined;
@@ -186,7 +193,6 @@ export const createEditor = async (options: EditorOptions): Promise
...consoleOptions,
};
- const editorId = options.editorId;
const initOptions =
editorId === 'console'
? consoleOptions
@@ -202,10 +208,7 @@ export const createEditor = async (options: EditorOptions): Promise
const configureTypeScriptFeatures = () => {
const JSLangs = ['javascript', 'jsx', 'react', 'flow', 'solid', 'react-native'];
const isJSLang = JSLangs.includes(language);
- if (
- !['script', 'tests', 'editorSettings'].includes(editorId) ||
- !['javascript', 'typescript'].includes(mapLanguage(language, 'monaco'))
- ) {
+ if (!['javascript', 'typescript'].includes(mapLanguage(language))) {
return;
}
@@ -257,7 +260,7 @@ export const createEditor = async (options: EditorOptions): Promise
const getOrCreateModel = (value: string, lang: string | undefined, uri: Monaco.Uri) => {
const model = monaco.editor.getModel(uri);
if (model) {
- if (model.getLanguageId() === mapLanguage(lang as Language, 'monaco')) {
+ if (model.getLanguageId() === mapLanguage(lang as Language)) {
model.setValue(value);
return model;
}
@@ -275,20 +278,14 @@ export const createEditor = async (options: EditorOptions): Promise
const random = getRandomString();
const ext = getLanguageExtension(language);
const extension =
- mapLanguage(language, 'monaco') === 'typescript' &&
- !ext?.endsWith('ts') &&
- !ext?.endsWith('tsx')
+ mapLanguage(language) === 'typescript' && !ext?.endsWith('ts') && !ext?.endsWith('tsx')
? ext + '.tsx'
: ext;
modelUri = editorId.includes('.')
? `file:///${editorId}`
: `file:///${editorId}.${random}.${extension}`;
const oldModel = editor.getModel();
- const model = getOrCreateModel(
- value || '',
- mapLanguage(language, 'monaco'),
- monaco.Uri.parse(modelUri),
- );
+ const model = getOrCreateModel(value || '', mapLanguage(language), monaco.Uri.parse(modelUri));
editor.setModel(model);
setTimeout(() => oldModel?.dispose(), 1000); // avoid race https://github.com/microsoft/monaco-editor/issues/1715
updateListeners();
@@ -297,9 +294,9 @@ export const createEditor = async (options: EditorOptions): Promise
const editor = monaco.editor.create(container, {
...editorOptions,
- language: mapLanguage(language, 'monaco'),
+ language: mapLanguage(language),
});
- setModel(editor, options.value, mapLanguage(language, 'monaco'));
+ setModel(editor, options.value, mapLanguage(language));
if (editorId.includes('.')) {
editors.push(editor);
@@ -317,6 +314,11 @@ export const createEditor = async (options: EditorOptions): Promise
}
const getEditorId = () => editorId;
+ const setEditorId = (filename: string, lang?: Language) => {
+ editorId = filename;
+ language = lang || getFileLanguage(filename, {}) || language;
+ setModel(editor, editor.getValue(), language);
+ };
const getValue = () => editor.getValue();
const setValue = (value = '') => {
editor.getModel()?.setValue(value);
@@ -504,7 +506,7 @@ export const createEditor = async (options: EditorOptions): Promise
const registerFormatter = (formatFn: FormatFn | undefined) => {
if (!formatFn) return;
- monaco.languages.registerDocumentFormattingEditProvider(mapLanguage(language, 'monaco'), {
+ monaco.languages.registerDocumentFormattingEditProvider(mapLanguage(language), {
provideDocumentFormattingEdits: async (model) => {
if (!model || model.isDisposed()) return [];
const val = model.getValue() || '';
@@ -681,8 +683,8 @@ export const createEditor = async (options: EditorOptions): Promise
const model = editor.getModel();
if (
!model ||
- !addCloseLanguages.includes(mapLanguage(language, 'monaco')) ||
- (mapLanguage(language, 'monaco') === 'typescript' && !hasJsx(language)) || // avoid autocompleting TS generics
+ !addCloseLanguages.includes(mapLanguage(language)) ||
+ (mapLanguage(language) === 'typescript' && !hasJsx(language)) || // avoid autocompleting TS generics
editorOptions.autoClosingBrackets === 'never'
) {
return;
@@ -871,8 +873,8 @@ export const createEditor = async (options: EditorOptions): Promise
const targetEditorId = resource.path.slice(1); // remove leading slash
if (targetEditorId) {
- // const targetEditorTab = getEditorTab(targetEditorId);
- // targetEditorTab?.click();
+ const targetEditorTab = getEditorTab(targetEditorId);
+ targetEditorTab?.click();
if (monaco.Range.isIRange(selectionOrPosition)) {
targetEditor?.revealRangeInCenterIfOutsideViewport(
@@ -908,6 +910,7 @@ export const createEditor = async (options: EditorOptions): Promise
getLanguage,
setLanguage,
getEditorId,
+ setEditorId,
focus,
getPosition,
setPosition,
diff --git a/src/livecodes/export/export-src.ts b/src/livecodes/export/export-src.ts
index 7e4c085ff0..4159d01a91 100644
--- a/src/livecodes/export/export-src.ts
+++ b/src/livecodes/export/export-src.ts
@@ -1,4 +1,4 @@
-import type { getLanguageExtension as getLanguageExtensionFn } from '../languages';
+import { getFileLanguage, type getLanguageExtension as getLanguageExtensionFn } from '../languages';
import type { Config, EditorId } from '../models';
import { downloadFile, loadScript } from '../utils/utils';
import { jsZipUrl } from '../vendors';
@@ -22,7 +22,12 @@ export const exportSrc = async (
const files = getFilesFromConfig(config, deps);
(Object.keys(files) as EditorId[]).forEach((filename) => {
- zip.file(filename, files[filename]?.content);
+ const content = files[filename]?.content || '';
+ if (getFileLanguage(filename, config) === 'binary') {
+ zip.file(filename, content.split('base64,')[1] || '', { base64: true });
+ } else {
+ zip.file(filename, content);
+ }
});
zip.file('result.html', html);
zip.file('livecodes.json', JSON.stringify(config, null, 2));
diff --git a/src/livecodes/export/utils.ts b/src/livecodes/export/utils.ts
index b08352c5f6..32e516246e 100644
--- a/src/livecodes/export/utils.ts
+++ b/src/livecodes/export/utils.ts
@@ -1,4 +1,5 @@
import { replaceImports } from '../compiler/import-map';
+import { getSource, isEditorId } from '../config/utils';
import type {
getLanguageCompiler as getLanguageCompilerFn,
getLanguageExtension as getLanguageExtensionFn,
@@ -22,16 +23,28 @@ export const getFilesFromConfig = (
style: 'style',
script: 'script',
};
- const codeFiles = (Object.keys(filenames) as EditorId[]).reduce((files, editorId) => {
- const filename = filenames[editorId];
- const language = config[editorId].language;
- const extension = getLanguageExtension?.(language) || 'md';
- const content = config[editorId].content || '';
- return {
- ...files,
- ...(content ? { [filename + '.' + extension]: { content } } : {}),
- };
- }, {});
+ const codeFiles =
+ config.files.length > 0
+ ? config.files.reduce(
+ (files, file) => ({
+ ...files,
+ [file.filename]: { content: file.content },
+ }),
+ {},
+ )
+ : (Object.keys(filenames) as EditorId[]).reduce((files, editorId) => {
+ if (!isEditorId(editorId)) {
+ return files;
+ }
+ const filename = filenames[editorId];
+ const language = config[editorId].language;
+ const extension = getLanguageExtension?.(language) || 'md';
+ const content = config[editorId].content || '';
+ return {
+ ...files,
+ ...(content ? { [filename + '.' + extension]: { content } } : {}),
+ };
+ }, {});
const externalStyles =
config.stylesheets.length > 0
@@ -106,10 +119,10 @@ export const getCompilerScripts = ({
supportedLanguages: { [key in EditorId]: Language[] };
getLanguageCompiler: typeof getLanguageCompilerFn;
}) => {
- if (supportedLanguages[editorId].includes(config[editorId].language)) return [];
- const compilerScripts = getLanguageCompiler?.(config[editorId].language)?.scripts;
- const compiledCode =
- config[editorId].language === 'python' ? config[editorId].content || '' : compiled[editorId];
+ const src = getSource(editorId, config);
+ if (!src || supportedLanguages[editorId].includes(src.language)) return [];
+ const compilerScripts = getLanguageCompiler?.(src.language)?.scripts;
+ const compiledCode = src.language === 'python' ? src.content || '' : compiled[editorId];
const scripts =
typeof compilerScripts === 'function'
? compilerScripts({ compiled: compiledCode, baseUrl, config })
@@ -126,7 +139,7 @@ export const getContent = ({
}: {
editorId: EditorId;
config: Config;
- compiled: { [key in EditorId]: string };
+ compiled: Partial<{ [key in EditorId]: string }>;
supportedLanguages: { [key in EditorId]: Language[] };
getLanguageCompiler: typeof getLanguageCompilerFn;
}) => {
@@ -137,19 +150,23 @@ export const getContent = ({
const content = {
markup: ['html', ...supportedLanguages.markup].includes(config.markup.language)
? config.markup.content
- : compiled.markup,
+ : compiled.markup || '',
style: ['css', ...supportedLanguages.style].includes(config.style.language)
? config.style.content
- : compiled.style,
+ : compiled.style || '',
script:
config.script.language === 'php'
? config.script.content?.replace(/<\?php/g, '') || ''
: config.script.language === 'python'
? config.script.content
: replaceImports(
- (isScriptSupported ? config.script.content : compiled.script) || '',
+ (isScriptSupported ? config.script.content : compiled.script || '') || '',
config,
),
+ files: config.files.map((file) => ({
+ ...file,
+ content: replaceImports(file.content, config),
+ })),
};
const scriptType = getLanguageCompiler?.(config.script.language)?.scriptType;
@@ -171,5 +188,5 @@ ${escapeScript(content.script || '')}
return '';
}
}
- return content[editorId] || '';
+ return getSource(editorId, content as any)?.content || '';
};
diff --git a/src/livecodes/handlers/keyboard-shortcuts.ts b/src/livecodes/handlers/keyboard-shortcuts.ts
index 0164d7fb28..1c0923a40e 100644
--- a/src/livecodes/handlers/keyboard-shortcuts.ts
+++ b/src/livecodes/handlers/keyboard-shortcuts.ts
@@ -1,5 +1,6 @@
import type { createSplitPanes } from '../UI';
import * as UI from '../UI/selectors';
+import { getSource } from '../config/utils';
import type { CodeEditor, Config, EditorId, EventsManager, ToolsPane } from '../models';
import { ctrl } from '../utils';
@@ -8,7 +9,7 @@ import { ctrl } from '../utils';
*/
export interface KeyboardShortcutDeps {
eventsManager: EventsManager;
- getActiveEditor: () => CodeEditor;
+ getActiveEditor: () => CodeEditor | undefined;
getConfig: () => Config;
showEditor: (editorId: EditorId) => void;
run: () => Promise;
@@ -27,7 +28,7 @@ let lastkeys = '';
*/
const createCommandPaletteHandler = (deps: KeyboardShortcutDeps) => (e: KeyboardEvent) => {
const activeEditor = deps.getActiveEditor();
- if (ctrl(e) && e.code === 'KeyP' && activeEditor.monaco) {
+ if (ctrl(e) && e.code === 'KeyP' && activeEditor?.monaco) {
e.preventDefault();
activeEditor.monaco.trigger('anyString', 'editor.action.quickCommand');
lastkeys = 'Ctrl + P';
@@ -108,7 +109,7 @@ const createZoomToggleHandler = () => (e: KeyboardEvent) => {
const createFocusEditorHandler = (deps: KeyboardShortcutDeps) => (e: KeyboardEvent) => {
if (ctrl(e) && e.altKey && e.code === 'KeyE') {
e.preventDefault();
- deps.getActiveEditor().focus();
+ deps.getActiveEditor()?.focus();
lastkeys = 'Ctrl + Alt + E';
return true;
}
@@ -152,25 +153,26 @@ const createEscapeHandler = (deps: KeyboardShortcutDeps) => (e: KeyboardEvent) =
// Ctrl + Alt + (1-3) activates editor 1-3
// Ctrl + Alt + (ArrowLeft/ArrowRight) activates previous/next editor
const createEditorSwitchHandler = (deps: KeyboardShortcutDeps) => (e: KeyboardEvent) => {
- if (ctrl(e) && e.altKey && ['1', '2', '3', 'ArrowLeft', 'ArrowRight'].includes(e.key)) {
- const editorIds = (['markup', 'style', 'script'] as const).filter(
- (id) => deps.getConfig()[id].hideTitle !== true,
- );
-
+ const config = deps.getConfig();
+ const editorIds = (
+ config.files.length
+ ? config.files.map((f) => f.filename)
+ : (['markup', 'style', 'script'] as EditorId[])
+ ).filter((id) => getSource(id, config)?.hidden !== true);
+ const editorNumbers = editorIds.map((_, id) => String(id + 1));
+
+ if (ctrl(e) && e.altKey && [...editorNumbers, 'ArrowLeft', 'ArrowRight'].includes(e.key)) {
e.preventDefault();
deps.split?.show('code');
-
- const index = ['1', '2', '3'].includes(e.key)
+ const index = editorNumbers.includes(e.key)
? Number(e.key) - 1
: e.key === 'ArrowLeft'
- ? editorIds.findIndex((id) => id === deps.getConfig().activeEditor) - 1 || 0
+ ? editorIds.findIndex((id) => id === config.activeEditor) - 1 || 0
: e.key === 'ArrowRight'
- ? editorIds.findIndex((id) => id === deps.getConfig().activeEditor) + 1 || 0
+ ? editorIds.findIndex((id) => id === config.activeEditor) + 1 || 0
: 0;
-
const editorIndex =
index === editorIds.length ? 0 : index === -1 ? editorIds.length - 1 : index;
-
deps.showEditor(editorIds[editorIndex]);
lastkeys = 'Ctrl + Alt + ' + e.key;
return true;
diff --git a/src/livecodes/html/app.html b/src/livecodes/html/app.html
index b342695951..a5310a1643 100644
--- a/src/livecodes/html/app.html
+++ b/src/livecodes/html/app.html
@@ -133,7 +133,15 @@
-
+