diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 19b757f0c..67cb5eab3 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -12,10 +12,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - name: Setup Node
+ uses: actions/setup-node@v4
with:
- python-version: 3.x
- - run: python3 -m pip install -r ./pip-requirements.txt
+ node-version: 20
+ cache: yarn
- uses: ocaml/setup-ocaml@v2
with:
ocaml-compiler: 5.1.1
@@ -25,24 +26,34 @@ jobs:
- name: Generate melange docs in ml syntax
run: opam reinstall -y melange --with-doc
- name: Copy melange docs in ml syntax
- run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/api/ml
+ run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/public/api/ml
- name: Generate melange docs in re syntax
run: ODOC_SYNTAX="re" opam reinstall -y melange --with-doc
- name: Copy melange docs in re syntax
- run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/api/re
+ run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/public/api/re
- name: Run canonical script
- run: opam exec -- dune exec add_canonical docs/api
+ run: opam exec -- dune exec add_canonical docs/public/api
- name: Check Reason syntax
run: make check-reason
- name: Check extracted code blocks
run: make check-extracted-code-blocks
- name: Run tests
run: make test
- - name: Build playground
- run: make build-playground
+ - name: Build site (and playground)
+ run: make build-site
- name: Configure Git user
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
- - run: git fetch origin gh-pages --depth=1
- - run: mike deploy --push unstable
+ - name: Fetch and checkout gh-pages
+ run: |
+ git fetch origin gh-pages --depth=1
+ git checkout gh-pages
+ - name: Copy published site into folder
+ run: cp -TRv docs/.vitepress/dist/ unstable/
+ - name: Add unstable files to git index
+ run: git add unstable
+ - name: Committing
+ run: git commit -m 'Deployed ${{ github.sha }} to unstable'
+ - name: Push
+ run: git push
diff --git a/.github/workflows/publish-version.yml b/.github/workflows/publish-version.yml
index 5f29dc81e..291837f3f 100644
--- a/.github/workflows/publish-version.yml
+++ b/.github/workflows/publish-version.yml
@@ -10,10 +10,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - uses: actions/setup-python@v2
+ - name: Setup Node
+ uses: actions/setup-node@v4
with:
- python-version: 3.x
- - run: python3 -m pip install -r ./pip-requirements.txt
+ node-version: 20
+ cache: yarn
- uses: ocaml/setup-ocaml@v2
with:
ocaml-compiler: 5.1.1
@@ -23,26 +24,35 @@ jobs:
- name: Generate melange docs
run: opam reinstall -y melange --with-doc
- name: Copy melange docs in ml syntax
- run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/api/ml
+ run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/public/api/ml
- name: Generate melange docs in re syntax
run: ODOC_SYNTAX="re" opam reinstall -y melange --with-doc
- name: Copy melange docs in re syntax
- run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/api/re
+ run: cp -r _opam/.opam-switch/build/melange.dev/_build/default/_doc/_html docs/public/api/re
# only uncomment after a new version is released, from inside a `x.x.x-patches` branch
# - name: Run canonical script
- # run: opam exec -- dune exec add_canonical docs/api
+ # run: opam exec -- dune exec add_canonical docs/public/api
- name: Check Reason syntax
run: make check-reason
- name: Check extracted code blocks
run: make check-extracted-code-blocks
- name: Run tests
run: make test
- - name: Build playground
- run: make build-playground
+ - name: Build site (and playground)
+ run: BASE=${{ github.ref_name }} make build-site
- name: Configure Git user
run: |
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
- - run: git fetch origin gh-pages --depth=1
- - run: mike deploy ${{ github.ref_name }}
- - run: mike set-default --push ${{ github.ref_name }}
+ - name: Fetch and checkout gh-pages
+ run: |
+ git fetch origin gh-pages --depth=1
+ git checkout gh-pages
+ - name: Copy published site into folder
+ run: cp -TRv docs/.vitepress/dist/ ${{ github.ref_name }}/
+ - name: Add ${{ github.ref_name }} files to git index
+ run: git add ${{ github.ref_name }}
+ - name: Committing
+ run: git commit -m 'Deployed ${{ github.sha }} to ${{ github.ref_name }}'
+ - name: Push
+ run: git push
diff --git a/.gitignore b/.gitignore
index 83be7a408..fffea0075 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,12 @@ _build
_opam
.vscode
.DS_Store
+node_modules
-docs/playground
+docs/.vitepress/cache
+docs/.vitepress/dist
+docs/public/playground
+docs/public/api/ml
+docs/public/api/re
docs/api/ml
docs/api/re
diff --git a/Makefile b/Makefile
index 1644b595d..12d9a1d8b 100644
--- a/Makefile
+++ b/Makefile
@@ -62,3 +62,7 @@ format-check: ## Checks if format is correct
build-playground: ## Builds the playground
$(DUNE) build @playground-assets
cd playground && yarn && yarn build
+
+.PHONY: build-site
+build-site: build-playground ## Builds the whole site (including playground)
+ yarn && yarn docs:build
diff --git a/README.md b/README.md
index 3ba2705e3..93edee538 100644
--- a/README.md
+++ b/README.md
@@ -11,13 +11,13 @@ https://github.com/melange-re/melange.
## Working locally
-After cloning the repository, install the necessary Python packages:
+After cloning the repository, install the necessary JavaScript packages:
```
-python3 -m pip install -r ./pip-requirements.txt
+yarn
```
-Then run `mkdocs serve .` from the folder where the repository lives.
+Then run `yarn docs:dev` from the folder where the repository lives.
### (Optional) Tooling for docs generation
@@ -53,8 +53,7 @@ dune build @re --auto-promote
Publishing is done automatically from GitHub actions:
- Every commit to `master` will publish in the `unstable` folder
-- Every tag pushed with the `v*` format will publish on its corresponding
- folder, and set it as default
+- Every tag pushed with the `v*` format will publish on its corresponding folder
### Tracking new versions of `melange` in opam
@@ -94,15 +93,5 @@ move-vx.x.x-tag: ## Moves the vx.x.x tag to the latest commit, useful to publish
- update the version in `add_canonical.ml`
- run `dune test --auto-promote`
- uncomment the relevant code in `publish-version.yml`
-- Finally, we need to disable the publication of previous version `y.y.y` as the
- default version:
- - In `y.y.y-patches`: update `publish-version.yml` so that `mike deploy -push`
- is used and `set-default` is removed. The diff should look like:
- ```diff
- + - run: mike deploy --push ${{ github.ref_name }}
- - - run: mike deploy ${{ github.ref_name }}
- - - run: mike set-default --push ${{ github.ref_name }}
- ```
-
- - Commit and run `make move-vy.y.y-tag` to deploy.
-
+- In the `gh-pages` branch, replace the default version with the new one [in
+ index.html](https://github.com/melange-re/melange-re.github.io/blob/gh-pages/index.html#L10)
diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts
new file mode 100644
index 000000000..c3a0de268
--- /dev/null
+++ b/docs/.vitepress/config.mts
@@ -0,0 +1,111 @@
+import { readFileSync } from "fs";
+import { join } from "path";
+import { defineConfig } from "vitepress";
+
+// From https://github.com/ocamllabs/vscode-ocaml-platform/blob/master/syntaxes/reason.json
+const reasonGrammar = JSON.parse(
+ readFileSync(join(__dirname, "./reasonml.tmLanguage.json"), "utf8")
+);
+
+const base = process.env.BASE || "unstable";
+
+// https://vitepress.dev/reference/site-config
+export default defineConfig({
+ title: "Melange Documentation Site",
+ description:
+ "The official documentation site for Melange, a compiler from OCaml to JavaScript. Explore the features and resources for functional programming with Melange, including the standard libraries APIs, the playground, and extensive documentation about bindings, build system, and the opam package manager.",
+ base: `/${base}/`,
+ sitemap: {
+ hostname: "https://melange.re/unstable/",
+ },
+ markdown: {
+ languages: [reasonGrammar],
+ },
+ themeConfig: {
+ outline: {level: [2, 3]},
+ search: {
+ provider: "local",
+ },
+ editLink: {
+ pattern: 'https://github.com/melange-re/melange-re.github.io/edit/master/docs/:path'
+ },
+ // https://vitepress.dev/reference/default-theme-config
+ nav: [
+ { text: "Learn", link: "/what-is-melange" },
+ { text: "API", link: "/api" },
+ { text: "Playground", link: "/playground/", target: '_self' },
+ {
+ text: "unstable",
+ items: [
+ {
+ text: "v3.0.0",
+ link: "https://melange.re/v3.0.0/",
+ },
+ {
+ text: "v2.2.0",
+ link: "https://melange.re/v2.2.0/",
+ },
+ {
+ text: "v2.1.0",
+ link: "https://melange.re/v2.1.0/",
+ },
+ {
+ text: "v2.0.0",
+ link: "https://melange.re/v2.0.0/",
+ },
+ {
+ text: "v1.0.0",
+ link: "https://melange.re/v1.0.0/",
+ },
+ ],
+ },
+ ],
+
+ sidebar: [
+ {
+ text: "Intro",
+ items: [
+ { text: "What is Melange", link: "/what-is-melange" },
+ { text: "Rationale", link: "/rationale" },
+ { text: "Getting Started", link: "/getting-started" },
+ ],
+ },
+ {
+ text: "Learn",
+ items: [
+ { text: "New to OCaml?", link: "/new-to-ocaml" },
+ { text: "Package Management", link: "/package-management" },
+ { text: "Build System", link: "/build-system" },
+ {
+ text: "Communicate with JavaScript",
+ link: "/communicate-with-javascript",
+ },
+ { text: "How-to Guides", link: "/how-to-guides" },
+ {
+ text: "Melange for X Developers",
+ link: "/melange-for-x-developers",
+ },
+ ],
+ },
+ {
+ text: "Reference",
+ items: [{ text: "API", link: "/api" }],
+ },
+ {
+ text: "Try",
+ items: [{ text: "Playground", link: "/playground/", target: '_self' }],
+ },
+ {
+ text: "About",
+ items: [
+ { text: "Community", link: "/community" },
+ { text: "Roadmap", link: "/roadmap" },
+ ],
+ },
+ ],
+
+ socialLinks: [
+ { icon: "github", link: "https://github.com/melange-re/melange" },
+ ],
+ },
+});
diff --git a/docs/.vitepress/reasonml.tmLanguage.json b/docs/.vitepress/reasonml.tmLanguage.json
new file mode 100644
index 000000000..eac8bddaf
--- /dev/null
+++ b/docs/.vitepress/reasonml.tmLanguage.json
@@ -0,0 +1,2358 @@
+{
+ "name": "reasonml",
+ "scopeName": "source.reasonml",
+ "fileTypes": ["re", "rei"],
+ "patterns": [
+ { "include": "#structure-expression-block-item" },
+ { "include": "#value-expression" }
+ ],
+ "repository": {
+ "attribute": {
+ "begin": "(?=\\[(@{1,3})[[:space:]]*[[:alpha:]])",
+ "end": "\\]",
+ "patterns": [
+ {
+ "begin": "\\[(@{1,3})",
+ "end": "(?=[^_\\.'[:word:]])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#attribute-identifier" }]
+ },
+ { "include": "#attribute-payload" }
+ ]
+ },
+ "attribute-identifier": {
+ "patterns": [
+ {
+ "match": "\\b([[:alpha:]][[:word:]]*)\\b[[:space:]]*(?:(\\.))",
+ "captures": {
+ "1": { "name": "support.class entity.name.class" },
+ "2": { "name": "keyword.control.less" }
+ }
+ },
+ {
+ "match": "\\b([[:alpha:]][[:word:]]*)\\b",
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ ]
+ },
+ "attribute-payload": {
+ "patterns": [
+ {
+ "begin": "(:)",
+ "end": "(?=\\])",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#structure-expression" },
+ { "include": "#module-item-type" },
+ { "include": "#type-expression" }
+ ]
+ },
+ {
+ "begin": "([\\?])",
+ "end": "(?=\\])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ { "include": "#pattern-guard" },
+ { "include": "#pattern" }
+ ]
+ },
+ { "include": "#structure-expression-block-item" },
+ { "include": "#value-expression" }
+ ]
+ },
+ "class-item-inherit": {
+ "begin": "\\b(inherit)\\b",
+ "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ "class-item-method": {
+ "begin": "\\b(method)\\b",
+ "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-let-value-bind-name-params-type-body" }
+ ]
+ },
+ "comment": {
+ "name": "comment",
+ "patterns": [
+ { "include": "#comment-line" },
+ { "include": "#comment-block-doc" },
+ { "include": "#comment-block" }
+ ]
+ },
+ "comment-line": {
+ "name": "comment.line",
+ "begin": "(^[ \\t]+)?((//))",
+ "end": "(?=^)"
+ },
+ "comment-block": {
+ "begin": "/\\*",
+ "end": "\\*/",
+ "name": "comment.block",
+ "patterns": [
+ { "include": "#comment-block-doc" },
+ { "include": "#comment-block" }
+ ]
+ },
+ "comment-block-doc": {
+ "begin": "/\\*\\*(?!/)",
+ "end": "\\*/",
+ "name": "comment.block.documentation",
+ "patterns": [
+ { "include": "#comment-block-doc" },
+ { "include": "#comment-block" }
+ ]
+ },
+ "condition-lhs": {
+ "begin": "(?|~$\\\\])([\\?])(?![#\\-:!?.@*/&%^+<=>|~$\\\\])",
+ "end": "(?=[\\)])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control message.error variable.interpolation" }
+ },
+ "patterns": [
+ {
+ "match": "(?:\\b|[[:space:]]+)([?])(?:\\b|[[:space:]]+)",
+ "name": "keyword.control message.error variable.interpolation"
+ },
+ { "include": "#value-expression" }
+ ]
+ },
+ "extension-node": {
+ "begin": "(?=\\[(%{1,3})[[:space:]]*[[:alpha:]])",
+ "end": "\\]",
+ "patterns": [
+ {
+ "begin": "\\[(%{1,3})",
+ "end": "(?=[^_\\.'[:word:]])\\:?",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#attribute-identifier" }]
+ },
+ { "include": "#attribute-payload" }
+ ]
+ },
+ "jsx": {
+ "patterns": [{ "include": "#jsx-head" }, { "include": "#jsx-tail" }]
+ },
+ "jsx-attributes": {
+ "patterns": [
+ {
+ "begin": "\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*(=)",
+ "end": "(?[:lower:]])",
+ "comment": "meta.separator",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ },
+ "2": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#value-expression-atomic-with-paths" }]
+ },
+ {
+ "match": "(\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*+)",
+ "captures": {
+ "1": { "comment": "meta.separator" },
+ "2": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ }
+ }
+ }
+ ]
+ },
+ "jsx-body": {
+ "begin": "((>))",
+ "end": "(?=)",
+ "beginCaptures": {
+ "1": { "comment": "meta.separator" },
+ "2": { "name": "punctuation.definition.tag.end.js" }
+ },
+ "patterns": [
+ {
+ "comment": "FIXME: seems necessary in order to properly tokenize `[[:word:]]` boundary",
+ "match": "[[:lower:]][[:word:]]*"
+ },
+ { "include": "#value-expression" }
+ ]
+ },
+ "jsx-head": {
+ "begin": "((<))(?=[_[:alpha:]])",
+ "end": "((/>))|(?=)",
+ "applyEndPatternLast": true,
+ "beginCaptures": {
+ "1": { "comment": "meta.separator" },
+ "2": { "name": "punctuation.definition.tag.begin.js" }
+ },
+ "endCaptures": {
+ "1": { "comment": "meta.separator" },
+ "2": { "name": "punctuation.definition.tag.end.js" }
+ },
+ "patterns": [
+ {
+ "begin": "\\G",
+ "end": "(?=[[:space:]/>])[[:space:]]*+",
+ "comment": "meta.separator",
+ "patterns": [
+ { "include": "#module-path-simple" },
+ {
+ "match": "\\b[[:lower:]][[:word:]]*\\b",
+ "name": "entity.name.tag.inline.any.html"
+ }
+ ]
+ },
+ { "include": "#jsx-attributes" },
+ { "include": "#jsx-body" },
+ { "include": "#comment" }
+ ]
+ },
+ "jsx-tail": {
+ "begin": "\\G(/>)|()",
+ "end": "(>)",
+ "applyEndPatternLast": true,
+ "comment": "meta.separator",
+ "beginCaptures": {
+ "1": { "name": "punctuation.definition.tag.end.js" },
+ "2": { "name": "punctuation.definition.tag.begin.js" }
+ },
+ "endCaptures": {
+ "1": { "name": "punctuation.definition.tag.end.js" }
+ },
+ "patterns": [
+ { "include": "#module-path-simple" },
+ {
+ "match": "\\b[[:lower:]][[:word:]]*\\b",
+ "name": "entity.name.tag.inline.any.html"
+ }
+ ]
+ },
+ "module-name-extended": {
+ "patterns": [
+ { "include": "#module-name-simple" },
+ {
+ "begin": "([\\(])",
+ "end": "([\\)])",
+ "captures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [{ "include": "#module-path-extended" }]
+ }
+ ]
+ },
+ "module-name-simple": {
+ "match": "\\b[[:upper:]][[:word:]]*\\b",
+ "name": "support.class entity.name.class"
+ },
+ "module-path-extended": {
+ "patterns": [
+ { "include": "#module-name-extended" },
+ { "include": "#comment" },
+ {
+ "comment": "NOTE: end early to avoid too much reparsing",
+ "begin": "([\\.])",
+ "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ {
+ "begin": "(?<=[\\.])",
+ "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-name-extended" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "module-path-extended-prefix": {
+ "begin": "(?=\\b[[:upper:]])",
+ "end": "([\\.])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#module-path-extended" }]
+ },
+ "module-path-simple": {
+ "patterns": [
+ { "include": "#module-name-simple" },
+ { "include": "#comment" },
+ {
+ "comment": "NOTE: end early to avoid too much reparsing",
+ "begin": "([\\.])",
+ "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "begin": "(?<=[\\.])",
+ "end": "(?<=[[:word:]\\)])|(?=[^\\.[:upper:]/])",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-name-simple" }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "module-path-simple-prefix": {
+ "begin": "(?=\\b[[:upper:]])",
+ "end": "([\\.])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#module-path-simple" }]
+ },
+ "module-item-class-type": {
+ "comment": "FIXME: proper parsing",
+ "begin": "\\b(class)\\b",
+ "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(type)\\b",
+ "end": "(?==)",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [{ "include": "#module-item-type-bind-name-tyvars" }]
+ },
+ {
+ "begin": "(=)",
+ "end": "(?=;)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ { "include": "#attribute" },
+ { "include": "#comment" },
+ { "include": "#class-item-inherit" },
+ { "include": "#class-item-method" }
+ ]
+ }
+ ]
+ },
+ "module-item-exception": {
+ "begin": "\\b(exception)\\b",
+ "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#module-item-type-bind-body-item" }]
+ },
+ "module-item-external": {
+ "begin": "\\b(external)\\b",
+ "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-let-value-bind-name-or-pattern" },
+ { "include": "#module-item-let-value-bind-type" },
+ {
+ "begin": "(=)",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ { "include": "#attribute" },
+ {
+ "begin": "\"",
+ "end": "\"",
+ "name": "string.double string.regexp",
+ "patterns": [
+ { "include": "#value-literal-string-escape" },
+ {
+ "match": "(?:(%)(.*?)|(caml.*?))(?=\"|(?:[^\\\\\\n]$))",
+ "captures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ },
+ "2": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "3": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "module-item-include": {
+ "begin": "\\b(include)\\b",
+ "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.include" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#signature-expression" }]
+ },
+ "module-item-let": {
+ "begin": "\\b(let)((%)([[:word:]\\.]+))?\\b",
+ "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type" },
+ "3": { "name": "keyword.control.less" },
+ "4": { "name": "entity.name.class" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-let-module" },
+ { "include": "#module-item-let-value" }
+ ]
+ },
+ "module-item-let-module": {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(module)\\b",
+ "end": "(?=[;}]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.control storage.type message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-item-let-module-and" },
+ { "include": "#module-item-let-module-rec" },
+ { "include": "#module-item-let-module-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-let-module-and": {
+ "begin": "\\b(and)\\b",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type" }
+ },
+ "patterns": [
+ { "include": "#module-item-let-module-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-let-module-bind-body": {
+ "begin": "(=>?)",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ { "include": "#structure-expression" },
+ { "include": "#extension-node" }
+ ]
+ },
+ "module-item-let-module-bind-name-params": {
+ "begin": "\\b([[:upper:]][[:word:]]*)\\b",
+ "end": "(?=[;:}=]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "support.class entity.name.class" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-item-let-module-param" }
+ ]
+ },
+ "module-item-let-module-bind-name-params-type-body": {
+ "begin": "(?:\\G|^)",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-item-let-module-bind-name-params" },
+ { "include": "#module-item-let-module-bind-type" },
+ { "include": "#module-item-let-module-bind-body" }
+ ]
+ },
+ "module-item-let-module-bind-type": {
+ "begin": "(:)",
+ "end": "(?=[;}=]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#signature-expression" }]
+ },
+ "module-item-let-module-param": {
+ "begin": "(?=\\()",
+ "end": "\\)",
+ "patterns": [
+ {
+ "begin": "\\(",
+ "end": "(?=[:])",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-name-simple" }
+ ]
+ },
+ {
+ "begin": "(:)",
+ "end": "(?=\\))",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#signature-expression" }]
+ }
+ ]
+ },
+ "module-item-let-module-rec": {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(rec)\\b",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control storage.modifier.rec" }
+ },
+ "patterns": [
+ { "include": "#module-item-let-module-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-let-value": {
+ "patterns": [
+ { "include": "#module-item-let-value-and" },
+ { "include": "#module-item-let-value-rec" },
+ { "include": "#module-item-let-value-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-let-value-and": {
+ "begin": "\\b(and)\\b",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type" }
+ },
+ "patterns": [
+ { "include": "#module-item-let-value-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-let-value-bind-body": {
+ "begin": "(=>?)",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ "module-item-let-value-bind-name-or-pattern": {
+ "end": "(?<=[^[:space:]])|(?=[[:space:]]|[;:}=]|\\b(and|as|class|constraint|exception|external|for|include|inherit|let|method|module|nonrec|open|private|rec|switch|try|type|val|while|with)\\b)",
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "match": "\\b(?:([_][[:word:]]+)|([[:lower:]][[:word:]]*))\\b",
+ "captures": {
+ "1": { "name": "comment" },
+ "2": { "name": "entity.name.function" }
+ }
+ },
+ { "include": "#module-item-let-value-bind-parens-params" },
+ { "include": "#pattern" }
+ ]
+ },
+ "module-item-let-value-bind-name-params-type-body": {
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#module-item-let-value-bind-name-or-pattern" },
+ { "include": "#module-item-let-value-bind-params-type" },
+ { "include": "#module-item-let-value-bind-type" },
+ { "include": "#module-item-let-value-bind-body" }
+ ]
+ },
+ "module-item-let-value-bind-params-type": {
+ "begin": "(?=[^[:space:]:=])",
+ "end": "(?=[;}=]|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-item-let-value-param" },
+ {
+ "begin": "(?]|[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "begin": "\\b(type)\\b",
+ "end": "([\\.])",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "endCaptures": {
+ "1": { "name": "entity.name.function" }
+ },
+ "patterns": [{ "include": "#pattern-variable" }]
+ },
+ { "include": "#type-expression" }
+ ]
+ },
+ "module-item-let-value-param": {
+ "patterns": [
+ { "include": "#module-item-let-value-param-label" },
+ { "include": "#module-item-let-value-param-type" },
+ { "include": "#module-item-let-value-param-module" },
+ { "include": "#pattern" }
+ ]
+ },
+ "module-item-let-value-param-label": {
+ "patterns": [
+ {
+ "begin": "(\\b[[:lower:]][[:word:]]*\\b)?[[:space:]]*(::)",
+ "end": "(?<=[[:space:]])",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ },
+ "2": { "name": "keyword.control" }
+ },
+ "patterns": [
+ { "include": "#pattern" },
+ {
+ "begin": "(=)",
+ "end": "(\\?)|(?<=[^[:space:]=][[:space:]])(?=[[:space:]]*+[^\\.])",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted keyword.control.less message.error"
+ }
+ },
+ "endCaptures": {
+ "1": { "name": "storage.type" }
+ },
+ "patterns": [{ "include": "#value-expression-atomic-with-paths" }]
+ }
+ ]
+ }
+ ]
+ },
+ "module-item-let-value-param-module": {
+ "comment": "FIXME: merge with pattern-parens",
+ "begin": "\\([[:space:]]*(?=\\b(module)\\b)",
+ "end": "\\)",
+ "patterns": [
+ {
+ "begin": "\\b(module)\\b",
+ "end": "(?=\\))",
+ "beginCaptures": {
+ "1": { "name": "keyword.other message.error" }
+ },
+ "patterns": [
+ {
+ "match": "\\b[[:upper:]][[:word:]]*\\b",
+ "name": "support.class entity.name.class"
+ }
+ ]
+ }
+ ]
+ },
+ "module-item-let-value-param-type": {
+ "comment": "FIXME: merge with pattern-parens",
+ "begin": "\\((?=\\b(type)\\b)",
+ "end": "\\)",
+ "patterns": [
+ {
+ "begin": "\\b(type)\\b",
+ "end": "(?=\\))",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [{ "include": "#pattern-variable" }]
+ }
+ ]
+ },
+ "module-item-let-value-rec": {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(rec)\\b",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control storage.modifier message.error" }
+ },
+ "patterns": [
+ { "include": "#module-item-let-value-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-module": {
+ "comment": "NOTE: this is to support the let-module case without the let prefix",
+ "begin": "\\b(module)\\b[[:space:]]*(?!\\b(type)\\b|$)",
+ "end": "(;)|(?=}|\\b(class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "storage.type message.error" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-let-module-and" },
+ { "include": "#module-item-let-module-rec" },
+ { "include": "#module-item-let-module-bind-name-params-type-body" }
+ ]
+ },
+ "module-item-module-type": {
+ "begin": "\\b(module)\\b[[:space:]]*(?=\\b(type)\\b|$)",
+ "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control message.error" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(type)\\b",
+ "end": "(?==)",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "match": "([[:upper:]][[:word:]]*)",
+ "captures": {
+ "1": { "name": "support.class entity.name.class" }
+ }
+ }
+ ]
+ },
+ {
+ "begin": "(=)",
+ "end": "(?=;)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#signature-expression" }
+ ]
+ }
+ ]
+ },
+ "module-item-open": {
+ "begin": "\\b(open)\\b",
+ "end": "(;)|(?=}|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.open" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-path-simple" }
+ ]
+ },
+ "module-item-type": {
+ "comment": "FIXME: the semi-colon is optional so we can re-use this for hover, which does not print the trailing ;",
+ "begin": "\\b(type)\\b",
+ "end": "(;)|(?=[\\)}]|\\b(class|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-type-and" },
+ { "include": "#module-item-type-constraint" },
+ { "include": "#module-item-type-bind" }
+ ]
+ },
+ "module-item-type-and": {
+ "comment": "FIXME: the optional `type` is for module constraints",
+ "begin": "\\b(and)\\b([[:space:]]*type)?",
+ "end": "(?=[;\\)}]|\\b(class|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" },
+ "2": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [{ "include": "#module-item-type-bind-name-tyvars-body" }]
+ },
+ "module-item-type-bind": {
+ "comment": "FIXME: only allow module paths before type variables",
+ "patterns": [
+ { "include": "#module-item-type-bind-nonrec" },
+ { "include": "#module-item-type-bind-name-tyvars-body" }
+ ]
+ },
+ "module-item-type-bind-body": {
+ "comment": "FIXME: parsing",
+ "begin": "(\\+?=)",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#module-item-type-bind-body-item" }]
+ },
+ "module-item-type-bind-body-item": {
+ "patterns": [
+ {
+ "match": "(=)(?!>)|\\b(private)\\b",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": {
+ "name": "variable.other.class.js variable.interpolation storage.modifier message.error"
+ }
+ }
+ },
+ {
+ "comment": "FIXME: specialized version of variant rule that also scans for (",
+ "match": "\\b([[:upper:]][[:word:]]*)\\b(?![[:space:]]*[\\.\\(])",
+ "captures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ }
+ },
+ {
+ "begin": "(\\.\\.)",
+ "end": "(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ }
+ },
+ {
+ "begin": "(\\|)(?![#\\-:!?.@*/&%^+<=>|~$\\\\])[[:space:]]*",
+ "end": "(?=[;\\)}]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#value-expression-constructor" },
+ {
+ "match": "([:])|\\b(of)\\b",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "keyword.other" }
+ }
+ },
+ { "include": "#type-expression" }
+ ]
+ },
+ {
+ "comment": "FIXME: remove this once the pretty printer no longer outputs 'of'",
+ "match": "(:)|(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|\\b(of)\\b",
+ "captures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "2": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "3": { "name": "keyword.other" }
+ }
+ },
+ { "include": "#type-expression" }
+ ]
+ },
+ "module-item-type-bind-name-tyvars": {
+ "begin": "(?<=\\G|^|\\.)[[:space:]]*\\b([[:lower:]][[:word:]]*)\\b",
+ "end": "(?=\\+?=|[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "entity.name.function" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#attribute" },
+ {
+ "match": "_",
+ "name": "comment"
+ },
+ {
+ "comment": "FIXME: add separate type-variable rule",
+ "match": "([+\\-])?(?:(_)|(')([[:lower:]][[:word:]]*)\\b)(?!\\.[[:upper:]])",
+ "captures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "2": { "name": "comment" },
+ "3": { "name": "comment" },
+ "4": {
+ "name": "variable.parameter string.other.link variable.language"
+ }
+ }
+ }
+ ]
+ },
+ "module-item-type-bind-name-tyvars-body": {
+ "begin": "(?=(\\G|^)[[:space:]]*\\b[[:alpha:]])",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#module-item-type-bind-name-tyvars" },
+ { "include": "#module-item-type-bind-body" }
+ ]
+ },
+ "module-item-type-bind-nonrec": {
+ "begin": "(?:\\G|^)[[:space:]]*\\b(nonrec)\\b",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control storage.modifier message.error" }
+ },
+ "patterns": [{ "include": "#module-item-type-bind-name-tyvars-body" }]
+ },
+ "module-item-type-constraint": {
+ "comment": "FIXME: proper parsing",
+ "begin": "\\b(constraint)\\b",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation storage.modifier message.error"
+ }
+ },
+ "patterns": [
+ {
+ "comment": "FIXME: add separate type-variable rule",
+ "match": "([+\\-])?(')([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])",
+ "captures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "2": { "name": "comment" },
+ "3": {
+ "name": "variable.parameter string.other.link variable.language"
+ }
+ }
+ },
+ {
+ "match": "=",
+ "name": "keyword.control.less"
+ },
+ { "include": "#type-expression" }
+ ]
+ },
+ "object-item": {
+ "begin": "\\G|(;)",
+ "end": "(?=[;}]|\\b(class|constraint|exception|external|include|let|module|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#class-item-method" }]
+ },
+ "operator": {
+ "patterns": [
+ { "include": "#operator-infix" },
+ { "include": "#operator-prefix" }
+ ]
+ },
+ "operator-infix": {
+ "patterns": [
+ {
+ "match": ";",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ { "include": "#operator-infix-assign" },
+ { "include": "#operator-infix-builtin" },
+ { "include": "#operator-infix-custom" },
+ { "comment": "#operator-infix-custom-hash" }
+ ]
+ },
+ "operator-infix-assign": {
+ "match": "(?|~$\\\\])(=)(?![#\\-:!?.@*/&%^+<=>|~$\\\\])",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control.less message.error"
+ },
+ "operator-infix-builtin": {
+ "match": ":=",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control.less message.error"
+ },
+ "operator-infix-custom": {
+ "match": "(?:(?|~$\\\\])((<>))(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|([#\\-@*/&%^+<=>$\\\\][#\\-:!?.@*/&%^+<=>|~$\\\\]*|[|][#\\-:!?.@*/&%^+<=>|~$\\\\]+)",
+ "captures": {
+ "1": { "comment": "meta.separator" },
+ "2": { "name": "punctuation.definition.tag.begin.js" },
+ "3": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ }
+ },
+ "operator-infix-custom-hash": {
+ "match": "#[\\-:!?.@*/&%^+<=>|~$]+",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "operator-prefix": {
+ "patterns": [
+ { "include": "#operator-prefix-bang" },
+ { "include": "#operator-prefix-label-token" }
+ ]
+ },
+ "operator-prefix-bang": {
+ "match": "![\\-:!?.@*/&%^+<=>|~$]*",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "operator-prefix-label-token": {
+ "match": "[?~][\\-:!?.@*/&%^+<=>|~$]+",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "pattern": {
+ "patterns": [
+ { "include": "#attribute" },
+ { "include": "#comment" },
+ { "include": "#pattern-atomic" },
+ {
+ "match": "[[:space:]]*+(?:(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|\\b(as)\\b|(\\.\\.\\.?))[[:space:]]*+",
+ "captures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "2": { "name": "keyword.other" },
+ "3": { "name": "keyword.control" }
+ }
+ }
+ ]
+ },
+ "pattern-atomic": {
+ "patterns": [
+ {
+ "match": "\\b(exception)\\b",
+ "name": "keyword.other"
+ },
+ { "include": "#value-expression-literal" },
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#pattern-list-or-array" },
+ { "include": "#pattern-record" },
+ { "include": "#pattern-variable" },
+ { "include": "#pattern-parens" }
+ ]
+ },
+ "pattern-guard": {
+ "begin": "\\b(when)\\b",
+ "end": "(?==>)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ "pattern-list-or-array": {
+ "begin": "(\\[\\|?)(?![@%])",
+ "end": "(\\|?\\])",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [
+ { "include": "#value-expression-literal-list-or-array-separator" },
+ { "include": "#pattern" }
+ ]
+ },
+ "pattern-parens": {
+ "begin": "(?=\\()",
+ "end": "\\)|(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#pattern-parens-lhs" },
+ { "include": "#type-annotation-rhs" }
+ ]
+ },
+ "pattern-parens-lhs": {
+ "begin": "\\(|(,)",
+ "end": "(?=(?:[,:\\)]))|(?=[;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#pattern" }]
+ },
+ "record-path": {
+ "begin": "\\b[[:lower:]][[:word:]]*\\b",
+ "end": "(?=[^[:space:]\\.])(?!/\\*)",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#record-path-suffix" }
+ ]
+ },
+ "record-path-suffix": {
+ "begin": "(\\.)",
+ "end": "(\\))|\\b([[:upper:]][[:word:]]*)\\b|\\b([[:lower:]][[:word:]]*)\\b|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "endCaptures": {
+ "1": { "name": "keyword.control" },
+ "2": { "name": "support.class entity.name.class" },
+ "3": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "begin": "([\\(])",
+ "end": "(?=[\\)])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "match": "\\b([[:lower:]][[:word:]]*)\\b(?=[^\\)]*([\\.]))",
+ "captures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ },
+ "2": { "name": "keyword.other" }
+ }
+ },
+ {
+ "match": "([\\.])",
+ "name": "keyword.control.less"
+ },
+ {
+ "match": "\\b([[:lower:]][[:word:]]*)\\b[[:space:]]*",
+ "captures": {
+ "1": {
+ "name": "variable.parameter string.other.link variable.language"
+ }
+ }
+ },
+ { "include": "#value-expression" }
+ ]
+ }
+ ]
+ },
+ "pattern-record": {
+ "begin": "{",
+ "end": "}",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#pattern-record-item" }
+ ]
+ },
+ "pattern-record-field": {
+ "begin": "\\b([_][[:word:]]*)\\b|\\b([[:lower:]][[:word:]]*)\\b",
+ "end": "(,)|(?=})",
+ "beginCaptures": {
+ "1": { "name": "comment" },
+ "2": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "begin": "\\G(:)",
+ "end": "(?=[,}])",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#pattern" }]
+ }
+ ]
+ },
+ "pattern-record-item": {
+ "patterns": [
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#pattern-record-field" }
+ ]
+ },
+ "pattern-variable": {
+ "patterns": [
+ {
+ "match": "\\b(_(?:[[:lower:]][[:word:]]*)?)\\b(?!\\.[[:upper:]])",
+ "captures": {
+ "1": { "name": "comment" }
+ }
+ },
+ {
+ "match": "\\b([[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])",
+ "captures": {
+ "1": { "name": "variable.language string.other.link" }
+ }
+ }
+ ]
+ },
+ "signature-expression": {
+ "patterns": [
+ {
+ "comment": "FIXME: scan for :upper: to disambiguate type/signature in hover",
+ "begin": "(?=\\([[:space:]]*[[:upper:]][[:word:]]*[[:space:]]*:)",
+ "end": "(?=[;])",
+ "patterns": [
+ {
+ "begin": "(?=\\()",
+ "end": "(?=[;]|=>)",
+ "patterns": [{ "include": "#module-item-let-module-param" }]
+ },
+ {
+ "begin": "(=>)",
+ "end": "(?=[;\\(])",
+ "beginCaptures": {
+ "1": { "name": "markup.inserted keyword.control.less" }
+ },
+ "patterns": [{ "include": "#structure-expression" }]
+ }
+ ]
+ },
+ {
+ "begin": "\\b(module)\\b[[:space:]]*\\b(type)\\b([[:space:]]*\\b(of)\\b)?",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted keyword.other variable.other.readwrite.instance"
+ },
+ "2": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ },
+ "3": {
+ "name": "markup.inserted keyword.other variable.other.readwrite.instance"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-path-simple" },
+ {
+ "match": "\\b([[:upper:]][[:word:]]*)\\b",
+ "name": "support.class entity.name.class"
+ }
+ ]
+ },
+ { "include": "#signature-expression-constraints" },
+ { "include": "#structure-expression" }
+ ]
+ },
+ "signature-expression-constraints": {
+ "begin": "(?=\\b(with))",
+ "end": "(?=[;\\)}]|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val)\\b)",
+ "patterns": [
+ {
+ "begin": "\\b(and|with)\\b",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation storage.modifier message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "comment": "FIXME: special version of #module-item-type with non-consuming `;`. Atom seems to need this to work.",
+ "begin": "\\b(type)\\b",
+ "end": "(?=[;\\)}]|\\b(class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ },
+ "patterns": [
+ { "include": "#module-item-type-and" },
+ { "include": "#module-item-type-constraint" },
+ { "include": "#module-item-type-bind" }
+ ]
+ },
+ {
+ "begin": "(?=\\b(module)\\b)",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|val|with)\\b)",
+ "patterns": [
+ {
+ "begin": "\\b(module)\\b",
+ "end": "(?=:?=|[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted keyword.control storage.type variable.other.readwrite.instance"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-path-simple" },
+ {
+ "match": "[[:upper:]][[:word:]]*",
+ "name": "support.class entity.name.class"
+ }
+ ]
+ },
+ {
+ "begin": "(:=)|(=)",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted keyword.control.less message.error"
+ },
+ "2": { "name": "markup.inserted keyword.control.less" }
+ },
+ "patterns": [{ "include": "#structure-expression" }]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "structure-expression": {
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "comment": "FIXME: scan for :upper: or `val` to disambiguate types from signatures for hover",
+ "begin": "\\((?=[[:space:]]*(\\b(val)\\b|[^'\\[<[:lower:]]))",
+ "end": "\\)|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|with)\\b)",
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "comment": "FIXME: might need to refactor this or include more expressions",
+ "include": "#structure-expression-block"
+ },
+ {
+ "begin": "\\b(val)\\b",
+ "end": "(?=\\))|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.other" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "match": "\\b([[:lower:]][[:word:]]*)\\b",
+ "name": "support.class entity.name.class"
+ }
+ ]
+ },
+ { "include": "#module-path-simple" },
+ {
+ "begin": "(:)",
+ "end": "(?=[\\)])|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#signature-expression" }]
+ }
+ ]
+ },
+ { "include": "#module-path-simple" },
+ { "include": "#structure-expression-block" }
+ ]
+ },
+ "structure-expression-block": {
+ "begin": "{",
+ "end": "}",
+ "patterns": [{ "include": "#structure-expression-block-item" }]
+ },
+ "structure-expression-block-item": {
+ "patterns": [
+ { "include": "#attribute" },
+ { "include": "#comment" },
+ { "include": "#module-item-exception" },
+ { "include": "#module-item-external" },
+ { "include": "#module-item-include" },
+ { "include": "#module-item-let" },
+ { "include": "#module-item-class-type" },
+ { "include": "#module-item-module-type" },
+ { "include": "#module-item-module" },
+ { "include": "#module-item-open" },
+ { "include": "#module-item-type" }
+ ]
+ },
+ "type-annotation-rhs": {
+ "begin": "(?|~$\\\\])([:])(?![#\\-:!?.@*/&%^+<=>|~$\\\\])",
+ "end": "(?=\\))|(?=[,;}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#type-expression" }]
+ },
+ "type-expression": {
+ "patterns": [
+ {
+ "match": "([\\.])",
+ "name": "entity.name.function"
+ },
+ { "include": "#type-expression-atomic" },
+ { "include": "#type-expression-arrow" }
+ ]
+ },
+ "type-expression-atomic": {
+ "patterns": [
+ { "include": "#attribute" },
+ { "include": "#comment" },
+ { "include": "#module-path-extended-prefix" },
+ { "include": "#type-expression-label" },
+ {
+ "match": "\\b(as)\\b",
+ "name": "variable.other.class.js variable.interpolation storage.modifier message.error"
+ },
+ { "include": "#type-expression-constructor" },
+ { "include": "#type-expression-object" },
+ { "include": "#type-expression-parens" },
+ { "include": "#type-expression-polymorphic-variant" },
+ { "include": "#type-expression-record" },
+ { "include": "#type-expression-variable" }
+ ]
+ },
+ "type-expression-arrow": {
+ "match": "=>",
+ "name": "markup.inserted keyword.control.less"
+ },
+ "type-expression-constructor": {
+ "match": "(_)(?![[:alnum:]])|\\b([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])",
+ "captures": {
+ "1": { "name": "comment" },
+ "2": { "name": "support.type string.regexp" }
+ }
+ },
+ "type-expression-label": {
+ "begin": "\\b([_[:lower:]][[:word:]]*)\\b(::)",
+ "end": "(?<==>)",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ },
+ "2": { "name": "keyword.control" }
+ },
+ "patterns": [
+ { "include": "#type-expression" },
+ {
+ "match": "(\\?)",
+ "captures": {
+ "1": { "name": "keyword.control.less" }
+ }
+ }
+ ]
+ },
+ "type-expression-object": {
+ "comment": "FIXME: separate sub-rules",
+ "begin": "(<)",
+ "end": "(>)",
+ "captures": {
+ "1": { "name": "entity.name.function" }
+ },
+ "patterns": [
+ {
+ "begin": "(\\.\\.)",
+ "end": "(?=>)",
+ "beginCaptures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ }
+ },
+ {
+ "comment": "FIXME: method item",
+ "begin": "(?=[_[:lower:]])",
+ "end": "(,)|(?=>)",
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "comment": "FIXME: method name",
+ "begin": "(?=[_[:lower:]])",
+ "end": "(?=:)",
+ "patterns": [
+ {
+ "match": "\\b([_[:lower:]][[:word:]]*)\\b",
+ "captures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ }
+ }
+ }
+ ]
+ },
+ {
+ "comment": "FIXME: method type",
+ "begin": "(:)",
+ "end": "(?=[,>])",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#type-expression" }]
+ }
+ ]
+ }
+ ]
+ },
+ "type-expression-parens": {
+ "comment": "FIXME: proper tuple types",
+ "begin": "\\(",
+ "end": "\\)",
+ "patterns": [
+ {
+ "begin": "\\b(module)\\b",
+ "end": "(?=[\\)])",
+ "beginCaptures": {
+ "1": { "name": "keyword.other message.error" }
+ },
+ "patterns": [
+ { "include": "#module-path-extended" },
+ { "include": "#signature-expression-constraints" }
+ ]
+ },
+ {
+ "match": ",",
+ "name": "keyword.control.less"
+ },
+ { "include": "#type-expression" }
+ ]
+ },
+ "type-expression-polymorphic-variant": {
+ "comment": "FIXME: proper parsing",
+ "begin": "(\\[)([<>])?",
+ "end": "(\\])",
+ "captures": {
+ "1": { "name": "entity.name.function" },
+ "2": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ {
+ "begin": "(\\|)?(?![#\\-:!?.@*/&%^+<=>|~$\\\\])[[:space:]]*",
+ "end": "(?=[;)}\\]]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#value-expression-constructor" },
+ {
+ "match": "([:])|\\b(of)\\b|([&])",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "keyword.other" },
+ "3": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ }
+ },
+ { "include": "#value-expression-constructor-polymorphic" },
+ { "include": "#type-expression" }
+ ]
+ }
+ ]
+ },
+ "type-expression-record": {
+ "begin": "{",
+ "end": "}",
+ "patterns": [{ "include": "#type-expression-record-item" }]
+ },
+ "type-expression-record-field-sans-modifier": {
+ "begin": "\\b([_[:lower:]][[:word:]]*)\\b",
+ "end": "(,)|(?=[,}])",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "begin": "(:)",
+ "end": "(?=[,}])",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#type-expression" }]
+ }
+ ]
+ },
+ "type-expression-record-field": {
+ "patterns": [
+ {
+ "begin": "\\b(mutable)\\b",
+ "end": "(?<=[,])|(?=})",
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation storage.modifier message.error"
+ }
+ },
+ "patterns": [
+ { "include": "#type-expression-record-field-sans-modifier" }
+ ]
+ },
+ { "include": "#type-expression-record-field-sans-modifier" }
+ ]
+ },
+ "type-expression-record-item": {
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#type-expression-record-field" }
+ ]
+ },
+ "type-expression-variable": {
+ "match": "(')([_[:lower:]][[:word:]]*)\\b(?!\\.[[:upper:]])",
+ "captures": {
+ "1": { "name": "comment" },
+ "2": {
+ "name": "variable.parameter string.other.link variable.language"
+ }
+ }
+ },
+ "value-expression": {
+ "patterns": [
+ { "include": "#attribute" },
+ { "include": "#comment" },
+ { "include": "#extension-node" },
+ { "include": "#jsx" },
+ { "include": "#operator" },
+ { "include": "#value-expression-builtin" },
+ { "include": "#value-expression-if-then-else" },
+ { "include": "#value-expression-atomic" },
+ { "include": "#module-path-simple-prefix" },
+ {
+ "match": "[:?]",
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ { "include": "#record-path" }
+ ]
+ },
+ "value-expression-atomic": {
+ "patterns": [
+ { "include": "#value-expression-literal" },
+ { "include": "#value-expression-literal-list-or-array" },
+ { "include": "#value-expression-for" },
+ { "include": "#value-expression-fun" },
+ { "include": "#value-expression-block-or-record-or-object" },
+ { "include": "#value-expression-label" },
+ { "include": "#value-expression-parens" },
+ { "include": "#value-expression-switch" },
+ { "include": "#value-expression-try" },
+ { "include": "#value-expression-while" }
+ ]
+ },
+ "value-expression-atomic-with-paths": {
+ "patterns": [
+ { "include": "#value-expression-atomic" },
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#record-path-suffix" }
+ ]
+ },
+ "value-expression-block": {
+ "begin": "{",
+ "end": "}",
+ "patterns": [{ "include": "#value-expression-block-item" }]
+ },
+ "value-expression-block-item": {
+ "patterns": [
+ { "include": "#module-item-let" },
+ { "include": "#module-item-open" },
+ { "include": "#value-expression" }
+ ]
+ },
+ "value-expression-block-look": {
+ "begin": "(?![[:space:]]*($|\\.\\.\\.|([[:upper:]][[:word:]]*\\.)*([[:lower:]][[:word:]]*)[[:space:]]*(?:,|:(?![=]))))",
+ "end": "(?=})",
+ "patterns": [{ "include": "#value-expression-block-item" }]
+ },
+ "value-expression-block-or-record-or-object": {
+ "begin": "{",
+ "end": "}",
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#module-path-simple-prefix" },
+ { "include": "#value-expression-object-look" },
+ { "include": "#value-expression-record-look" },
+ { "include": "#value-expression-block-look" }
+ ]
+ },
+ "value-expression-builtin": {
+ "match": "\\b(assert|decr|failwith|fprintf|ignore|incr|land|lazy|lor|lsl|lsr|lxor|mod|new|not|printf|ref)\\b|\\b(raise)\\b",
+ "captures": {
+ "1": { "name": "keyword.control message.error" },
+ "2": { "name": "keyword.control.trycatch" }
+ }
+ },
+ "value-expression-constructor": {
+ "match": "\\b([[:upper:]][[:word:]]*)\\b(?![[:space:]]*[\\.])",
+ "captures": {
+ "1": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ }
+ },
+ "value-expression-constructor-polymorphic": {
+ "match": "(`)([[:alpha:]][[:word:]]*)\\b(?!\\.)",
+ "captures": {
+ "1": {
+ "name": "constant.other.symbol keyword.control.less variable.parameter"
+ },
+ "2": {
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ }
+ }
+ },
+ "value-expression-for": {
+ "begin": "(?=\\b(for)\\b)",
+ "end": "(?<=})|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ { "include": "#value-expression-for-head" },
+ { "include": "#value-expression-block" }
+ ]
+ },
+ "value-expression-for-head": {
+ "begin": "(?=\\b(for)\\b)",
+ "end": "(?={)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "patterns": [
+ {
+ "begin": "\\b(for)\\b",
+ "end": "(?=\\b(in)\\b)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.loop" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#pattern-variable" }
+ ]
+ },
+ {
+ "begin": "\\b(in)\\b",
+ "end": "(?=\\b(to)\\b)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.loop" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#value-expression-atomic-with-paths" }
+ ]
+ },
+ {
+ "begin": "\\b(to)\\b",
+ "end": "(?={)|(?=[;]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.loop" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ { "include": "#value-expression-atomic-with-paths" }
+ ]
+ },
+ { "include": "#value-expression-block" }
+ ]
+ },
+ "value-expression-fun": {
+ "begin": "\\b(fun)\\b",
+ "end": "(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control" }
+ },
+ "patterns": [
+ { "include": "#value-expression-fun-pattern-match-rule-lhs" },
+ { "include": "#value-expression-fun-pattern-match-rule-rhs" }
+ ]
+ },
+ "value-expression-fun-pattern-match-rule-lhs": {
+ "begin": "(?=\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|(?<=fun)",
+ "end": "(\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))|(?==>)|(?=[;\\)}]|\\b(and|class|constraint|exception|external|include|inherit|let|method|module|nonrec|open|private|rec|type|val|with)\\b)",
+ "applyEndPatternLast": true,
+ "beginCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "endCaptures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ }
+ },
+ "patterns": [{ "include": "#module-item-let-value-param" }]
+ },
+ "value-expression-fun-pattern-match-rule-rhs": {
+ "begin": "(=>)",
+ "end": "(?=[;\\)}]|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\])|\\b(and)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ "value-expression-if-then-else": {
+ "begin": "\\b(if)\\b",
+ "end": "(?=[;\\)\\]}])",
+ "applyEndPatternLast": true,
+ "beginCaptures": {
+ "1": { "name": "keyword.control.conditional" }
+ },
+ "patterns": [
+ { "include": "#comment" },
+ {
+ "begin": "\\b(else)\\b",
+ "end": "(?=[;\\)\\]}])",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.conditional" }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ { "include": "#value-expression-atomic-with-paths" }
+ ]
+ },
+ "value-expression-lazy": {
+ "comment": "FIXME",
+ "match": "\\b(lazy)\\b",
+ "captures": {
+ "1": { "name": "keyword.other" }
+ }
+ },
+ "value-expression-label": {
+ "begin": "\\b([_[:lower:]][[:word:]]*)\\b[[:space:]]*(::)(\\?)?",
+ "end": "(?![[:space:]])",
+ "beginCaptures": {
+ "1": {
+ "name": "markup.inserted constant.language support.property-value entity.name.filename"
+ },
+ "2": { "name": "keyword.control" },
+ "3": { "name": "storage.type" }
+ },
+ "patterns": [{ "include": "#value-expression" }]
+ },
+ "value-expression-literal": {
+ "patterns": [
+ { "include": "#value-expression-literal-boolean" },
+ { "include": "#value-expression-literal-character" },
+ { "include": "#value-expression-constructor" },
+ { "include": "#value-expression-constructor-polymorphic" },
+ { "include": "#value-expression-lazy" },
+ { "include": "#value-expression-literal-numeric" },
+ { "include": "#value-expression-literal-string" },
+ { "include": "#value-expression-literal-unit" }
+ ]
+ },
+ "value-expression-literal-boolean": {
+ "match": "\\b(false|true)\\b",
+ "name": "entity.other.attribute-name.css constant.language constant.numeric"
+ },
+ "value-expression-literal-character": {
+ "match": "(')([[:space:]]|[[:graph:]]|\\\\[\\\\\"'ntbr]|\\\\[[:digit:]][[:digit:]][[:digit:]]|\\\\x[[:xdigit:]][[:xdigit:]]|\\\\o[0-3][0-7][0-7])(')",
+ "name": "constant.character"
+ },
+ "value-expression-literal-list-or-array": {
+ "begin": "(\\[\\|?)(?![@%])",
+ "end": "(\\|?\\])",
+ "beginCaptures": {
+ "1": { "name": "constant.language.list" }
+ },
+ "endCaptures": {
+ "1": { "name": "constant.language.list" }
+ },
+ "patterns": [
+ { "include": "#value-expression-literal-list-or-array-separator" },
+ { "include": "#value-expression" },
+ { "include": "#value-expression-literal-list-or-array" }
+ ]
+ },
+ "value-expression-literal-list-or-array-separator": {
+ "match": "(,)|(\\.\\.\\.)",
+ "captures": {
+ "1": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "2": { "name": "keyword.control" }
+ }
+ },
+ "value-expression-literal-numeric": {
+ "patterns": [
+ {
+ "match": "([-])?([[:digit:]][_[:digit:]]*)(?:(\\.)([_[:digit:]]*))?(?:([eE])([\\-\\+])?([[:digit:]][_[:digit:]]*))?(?![bBoOxX])",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "constant.numeric" },
+ "3": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "4": { "name": "constant.numeric" },
+ "5": { "name": "keyword.control.less" },
+ "6": { "name": "keyword.control.less" },
+ "7": { "name": "constant.numeric" }
+ }
+ },
+ {
+ "match": "([-])?(0[xX])([[:xdigit:]][_[:xdigit:]]*)(?:(\\.)([_[:xdigit:]]*))?(?:([pP])([\\-\\+])?([[:digit:]][_[:digit:]]*))?",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "keyword.control.less" },
+ "3": { "name": "constant.numeric" },
+ "4": {
+ "name": "variable.other.class.js variable.interpolation keyword.operator keyword.control message.error"
+ },
+ "5": { "name": "constant.numeric" },
+ "6": { "name": "keyword.control.less" },
+ "7": { "name": "keyword.control.less" },
+ "8": { "name": "constant.numeric" }
+ }
+ },
+ {
+ "match": "([-])?(0[oO])([0-7][_0-7]*)",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "keyword.control.less" },
+ "3": { "name": "constant.numeric" }
+ }
+ },
+ {
+ "match": "([-])?(0[bB])([0-1][_0-1]*)",
+ "captures": {
+ "1": { "name": "keyword.control.less" },
+ "2": { "name": "keyword.control.less" },
+ "3": { "name": "constant.numeric" }
+ }
+ }
+ ]
+ },
+ "value-expression-literal-string": {
+ "patterns": [
+ {
+ "begin": "(?|~$\\\\]))",
+ "end": "(?==>|[;\\)}])",
+ "patterns": [{ "include": "#pattern-guard" }, { "include": "#pattern" }]
+ },
+ "value-expression-switch-pattern-match-rule-rhs": {
+ "begin": "(=>)",
+ "end": "(?=}|\\|(?![#\\-:!?.@*/&%^+<=>|~$\\\\]))",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.less" }
+ },
+ "patterns": [{ "include": "#value-expression-block-item" }]
+ },
+ "value-expression-try": {
+ "begin": "\\b(try)\\b",
+ "end": "(?<=})|(?=[;\\)]|\\b(and|as|class|constraint|exception|external|include|inherit|let|method|nonrec|open|private|rec|type|val|with)\\b)",
+ "beginCaptures": {
+ "1": { "name": "keyword.control.trycatch" }
+ },
+ "patterns": [
+ { "include": "#value-expression-try-head" },
+ { "include": "#value-expression-switch-body" }
+ ]
+ },
+ "value-expression-try-head": {
+ "begin": "(?<=try)",
+ "end": "(?
+import { useData } from "vitepress";
+import DefaultTheme from "vitepress/theme";
+import { nextTick, provide } from "vue";
+import Switch from "./Switch.vue";
+import './custom.css'
+
+const { Layout } = DefaultTheme;
+
+
+
+ Stdlib
-libraryStdlib
library
+the Stdlib
libraryStdlib
library
- Bindings to several browser and Node JavaScript APIs in the Js
libraryJs
library
+class="text-ocaml" target="_self" href="./api/ml/melange/Js">Js
+libraryJs
library
- Data structures and collection types in the Belt
libraryBelt
-library
+target="_self" href="./api/ml/melange/Belt">Belt
libraryBelt
library
Using one or the other will depend on your application requirements, how much
integration you need with existing JavaScript libraries, or other specific
diff --git a/docs/build-system.md b/docs/build-system.md
index 30e98a1bf..920fc933e 100644
--- a/docs/build-system.md
+++ b/docs/build-system.md
@@ -174,7 +174,8 @@ docs](https://dune.readthedocs.io/en/stable/melange.html#melange-emit).
The file structure of the app should look something like this:
-
project_name/
+
+project_name/
├── _opam
├── lib
│ ├── dune
@@ -182,7 +183,7 @@ The file structure of the app should look something like this:
├── dune-project
├── dune
└── app.ml
-project_name/
+project_name/
├── _opam
├── lib
│ ├── dune
@@ -190,6 +191,7 @@ The file structure of the app should look something like this:
├── dune-project
├── dune
└── app.re
+
#### Building the project
@@ -228,20 +230,22 @@ to know where to place the generated JavaScript artifacts.
As a more complex example, consider the following setup:
-project_name/
+
+project_name/
├── dune-project
├── lib
│ ├── dune
│ └── foo.ml
└── emit
└── dune
-project_name/
+project_name/
├── dune-project
├── lib
│ ├── dune
│ └── foo.re
└── emit
└── dune
+
With `emit/dune` being:
diff --git a/docs/communicate-with-javascript.md b/docs/communicate-with-javascript.md
index a6bbd01e5..71475fdd0 100644
--- a/docs/communicate-with-javascript.md
+++ b/docs/communicate-with-javascript.md
@@ -366,14 +366,16 @@ let sum_sq = [1, 2, 3] |> List.map(String.cat) |> sum;
The compiler would rightfully raise an error:
-4 | [ 1; 2; 3 ]
- ^
-Error: This expression has type int but an expression was expected of type
- string
-1 | [ 1, 2, 3 ]
- ^
-Error: This expression has type int but an expression was expected of type
- string
+
+ 4 | [ 1; 2; 3 ]
+ ^
+ Error: This expression has type int but an expression was expected of type
+ string
+ 1 | [ 1, 2, 3 ]
+ ^
+ Error: This expression has type int but an expression was expected of type
+ string
+
Note that instead of telling us that we are passing the wrong function in
`List.map` (`String.cat`), the error points to the list itself. This behavior
@@ -395,11 +397,12 @@ class="text-reasonml">\-\>
.
As its name suggests, the pipe first operator is better suited for functions
where the data is passed as the first argument.
-The functions in the Belt
libraryBelt
-library included with Melange have been designed with the data-first
-convention in mind, so they work best with the pipe first operator.
+The functions in the Belt
libraryBelt
library included with Melange
+have been designed with the data-first convention in mind, so they work best
+with the pipe first operator.
For example, we can rewrite the example above using `Belt.List.map` and the pipe
first operator:
@@ -429,16 +432,18 @@ let sum_sq = [1, 2, 3]->(Belt.List.map(String.cat))->sum;
The compiler will show this error message:
-4 | |. Belt.List.map String.cat
+
+4 | |. Belt.List.map String.cat
^^^^^^^^^^
Error: This expression has type string -> string -> string
but an expression was expected of type int -> 'a
Type string is not compatible with type int
-2 | let sum_sq = [1, 2, 3]->(Belt.List.map(String.cat))->sum;
+2 | let sum_sq = [1, 2, 3]->(Belt.List.map(String.cat))->sum;
^^^^^^^^^^
Error: This expression has type string -> string -> string
but an expression was expected of type int -> 'a
Type string is not compatible with type int
+
The error points now to the function passed to `Belt.List.map`, which is more
natural with the way the code is being written.
@@ -466,8 +471,8 @@ This is how each Melange type is converted into JavaScript values:
| array | array |
| tuple `(3, 4)` | array `[3, 4]` |
| bool | boolean |
-| Js.Nullable.tJs.Nullable.t | `null` / `undefined` |
-| Js.Re.tJs.Re.t | [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) |
+| Js.Nullable.tJs.Nullable.t | `null` / `undefined` |
+| Js.Re.tJs.Re.t | [`RegExp`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) |
| Option.t `None` | `undefined` |
| Option.t Some( Some .. Some (None))
Some(Some( .. Some(None)))
| internal representation |
| Option.t Some 2
Some(2)
| `2` |
@@ -582,14 +587,15 @@ You can surround the interpolation variable in parentheses too: `{j|你
好,$(world)|j}`.
To work with strings, the Melange standard library provides some utilities in
-the Stdlib.String
moduleStdlib.String
module.
-The bindings to the native JavaScript functions to work with strings are in the
-Js.String
-moduleJs.String
module.
+the Stdlib.String
moduleStdlib.String
module. The
+bindings to the native JavaScript functions to work with strings are in the Js.String
moduleJs.String
module.
#### Floating-point numbers
@@ -600,13 +606,14 @@ same encoding as [JavaScript
numbers](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number#number_encoding),
so values of these types can be used transparently between Melange code and
JavaScript code. The Melange standard library provides a Stdlib.Float
moduleStdlib.Float
module. The
+target="_self" href="./api/ml/melange/Stdlib/Float">Stdlib.Float
+moduleStdlib.Float
module. The
bindings to the JavaScript APIs that manipulate float values can be found in the
-Js.Float
-moduleJs.Float
module.
+Js.Float
moduleJs.Float
module.
#### Integers
@@ -622,14 +629,14 @@ allowing for a larger range of representable integers in JavaScript compared to
Melange. When dealing with large numbers, it is advisable to use floats instead.
For instance, floats are used in bindings like `Js.Date`.
-The Melange standard library provides a Stdlib.Int
moduleStdlib.Int
module. The
+The Melange standard library provides a Stdlib.Int
moduleStdlib.Int
module. The
bindings to work with JavaScript integers are in the Js.Int
moduleJs.Int
-module.
+target="_self" href="./api/ml/melange/Js/Int">Js.Int
moduleJs.Int
module.
#### Arrays
@@ -639,15 +646,16 @@ arrays, all the values in a Melange array need to have the same type.
Another difference is that OCaml arrays are fixed-sized, but on Melange side
this constraint is relaxed. You can change an array’s length using functions
like `Js.Array.push`, available in the bindings to the JavaScript APIs in the Js.Array
-moduleJs.Array
module.
+class="text-ocaml" target="_self"
+href="./api/ml/melange/Js/Array">Js.Array
moduleJs.Array
module.
Melange standard library also has a module to work with arrays, available in the
-Stdlib.Array
moduleStdlib.Array
module.
+Stdlib.Array
moduleStdlib.Array
module.
#### Tuples
@@ -710,9 +718,10 @@ var r = /b/g;
```
A regular expression like the above is of type `Js.Re.t`. The Js.Re
-moduleJs.Re
module provides the
+class="text-ocaml" target="_self"
+href="./api/ml/melange/Js/Re">Js.Re
moduleJs.Re
module provides the
bindings to the JavaScript functions that operate over regular expressions.
## Non-shared data types
@@ -726,16 +735,16 @@ them before doing so.
[some helpers](#generate-getters-setters-and-constructors) to do so.
- Exceptions
- Option (a variant type): Better use the `Js.Nullable.fromOption` and
- `Js.Nullable.toOption` functions in the Js.Nullable
moduleJs.Nullable
module to
+ `Js.Nullable.toOption` functions in the Js.Nullable
moduleJs.Nullable
module to
transform them into either `null` or `undefined` values.
- List (also a variant type): use `Array.of_list` and `Array.to_list` in the Stdlib.Array
moduleStdlib.Array
module.
+ class="text-ocaml" target="_self"
+ href="./api/ml/melange/Stdlib/Array">Stdlib.Array
moduleStdlib.Array
module.
- Character
- Int64
- Lazy values
@@ -875,8 +884,8 @@ let f: unit => int = ([%mel.raw "function() {return 1}"]: unit => int);
```
Using two percentage signs (`[%%mel.raw
-]`) the extension name without square
-brackets (`%mel.raw `) is reserved for definitions in a
+"xxx"]`)the extension name without square
+brackets (`%mel.raw "xxx"`) is reserved for definitions in a
[structure](https://v2.ocaml.org/manual/moduleexamples.html#s:module:structures)
or [signature](https://v2.ocaml.org/manual/moduleexamples.html#s%3Asignature).
@@ -1384,10 +1393,11 @@ Sometimes JavaScript objects are used as dictionaries. In these cases:
For this particular use case of JavaScript objects, Melange exposes a specific
type `Js.Dict.t`. The values and functions to work with values of this type are
-defined in the Js.Dict
moduleJs.Dict
-module, with operations like `get`, `set`, etc.
+defined in the Js.Dict
moduleJs.Dict
module, with operations
+like `get`, `set`, etc.
Values of the type `Js.Dict.t` compile to JavaScript objects.
@@ -1462,9 +1472,9 @@ let () = clearTimeout(id);
> **_NOTE:_** The bindings to `setTimeout` and `clearTimeout` are shown here for
> learning purposes, but they are already available in the href="../api/ml/melange/Js/Global">Js.Global
module class="text-reasonml"
-> href="../api/re/melange/Js/Global">Js.Global
module.
+> target="_self" href="./api/ml/melange/Js/Global">Js.Global
+> module href="./api/re/melange/Js/Global">Js.Global
module.
Generates:
diff --git a/docs/css/extra.css b/docs/css/extra.css
deleted file mode 100644
index 71728c90c..000000000
--- a/docs/css/extra.css
+++ /dev/null
@@ -1,155 +0,0 @@
-div.col-md-9 h1:first-of-type {
- text-align: center;
- font-size: 60px;
- font-weight: 300;
-}
-
-#home-subtitle {
- text-align: center;
- font-size: 30px;
- font-weight: 300;
-}
-
-div.col-md-9 > p.centered {
- text-align: center;
-}
-
-div.col-md-9 p.admonition-title:first-of-type {
- text-align: left;
-}
-
-div.col-md-9 h1:first-of-type .headerlink {
- display: none;
-}
-
-div.admonition.block > .admonition-title {
- display: none;
-}
-
-.admonition.new,
-details.new {
- color: #15654a;
- background-color: #edfff9;
- border-color: #bcf1e8;
-}
-.admonition.example,
-details.example {
- color: #353579;
- background-color: #f0f1ff;
- border-color: #d8dcf0;
-}
-
-/* Definition List styles */
-
-dd {
- padding-left: 20px;
-}
-
-.card-body svg {
- width: 100%;
- padding: 0 50px;
- height: auto;
-}
-
-/* Homepage */
-
-body.homepage div.jumbotron {
- margin-top: 1.5rem;
- padding-top: 1rem;
- padding-bottom: 0;
-}
-
-body.homepage div.jumbotron div.card {
- margin-bottom: 2rem;
-}
-
-body.homepage > div.container > div.row > div.col-md-3 {
- display: none;
-}
-
-body.homepage > div.container > div.row > div.col-md-9 {
- margin-left: 0;
- flex: 0 0 100%;
- max-width: 100%;
-}
-
-/* mkdocstrings */
-
-.doc-object {
- padding-left: 10px;
- border-left: 4px solid rgba(230, 230, 230);
-}
-
-.doc-contents .field-body p:first-of-type {
- display: inline;
-}
-
-.doc-label-class-attribute {
- display: none;
-}
-
-h2.doc-heading {
- font-size: 1.5rem;
-}
-h3.doc-heading {
- font-size: 1.4rem;
-}
-h4.doc-heading {
- font-size: 1.3rem;
-}
-h5.doc-heading {
- font-size: 1.2rem;
-}
-
-.doc-contents {
- padding-left: 0;
-}
-
-blockquote {
- background: #f9f9f9;
- border-left: 10px solid #ccc;
- margin: 1.5em 10px;
- padding: 1em 10px 0.1em 10px;
- quotes: "\201C""\201D""\2018""\2019";
-}
-
-/* Needed for code spans like `{ abstract = light }` to render ok when they get broken into 2 lines in md */
-.rst-content code {
- white-space: nowrap;
-}
-
-/* Toggle syntax */
-
-.button.toggleSyntaxButton {
- display: flex;
- justify-content: center;
- cursor: pointer;
- font-size: 80%;
- color: #fff;
-}
-
-.toggleSyntaxButton span {
- padding: 10px;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
-}
-
-.syntax__ocaml .toggleSyntaxButton-ocaml,
-.syntax__reasonml .toggleSyntaxButton-reasonml {
- text-decoration: underline;
-}
-
-.syntax__ocaml .hljs.language-reasonml,
-.syntax__ocaml .text-reasonml,
-.syntax__reasonml .hljs.language-ocaml,
-.syntax__reasonml .text-ocaml {
- display: none;
-}
-
-#version-selector {
- border-radius: 6px;
- color: #404040;
- font-family: Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;;
-}
diff --git a/docs/getting-started.md b/docs/getting-started.md
index 1f408a789..bc2f10a6f 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -1,8 +1,6 @@
# Getting started
-Get up and running with Melange in no time!
-
----
+Get up and running with Melange in no time!
## Install a package manager
diff --git a/docs/index.md b/docs/index.md
index 885ed847b..2cb5efdd9 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,137 +1,28 @@
-# Melange
-
-OCaml for JavaScript developers
-
+---
+# https://vitepress.dev/reference/default-theme-home-page
+layout: home
+
+hero:
+ name: "Melange"
+ text: "OCaml for JavaScript developers."
+ tagline: Start building highly maintainable applications that can run on millions of devices.
+ actions:
+ - theme: brand
+ text: Get started
+ link: /getting-started
+ - theme: alt
+ text: Playground
+ link: /playground/
+ target: '_self'
+
+features:
+ - title: A Solid Type System
+ details: Melange leverages OCaml's powerful type system to catch more bugs at compile time. Large, complex codebases become easy to maintain and refactor.
+ - title: First-Class Editor and Tooling
+ details: Melange fully utilizes the power of the OCaml Platform to provide integrations with editors such as VSCode, Vim, or Emacs, with features like type inspection, autocomplete, and more. It also has first-class integration with Dune, OCaml's most used build system.
+ - title: JavaScript Integration
+ details: Use existing JavaScript packages from NPM, or your own JavaScript libraries in your projects. With an expressive bindings language, and an ergonomic compilation model, Melange can help you build robust applications that leverage functionality from the JavaScript ecosystem.
+ - title: Stable and Industry Backed
+ details: Melange builds on top of decades of type system research, compiler engineering and tooling development to provide a polished developer experience. Companies like Ahrefs use Melange daily to deploy web applications for their users.
---
-Melange is a backend for the OCaml compiler that emits JavaScript. Melange
-strives to provide the best integration with both the OCaml and JavaScript
-ecosystems. To know more about it start by reading the [introductory
-tutorial](getting-started.md), then check the [Learn](./new-to-ocaml.md) section
-for more information.
-
-
-
-
-Features
-
-
-
-
- A Solid Type System
-
- Melange leverages OCaml's powerful type system to catch more bugs at
- compile time. Large, complex codebases become easy to maintain and
- refactor.
-
-
-
-
-
-
-
- First-Class Editor and Tooling
-
- Melange fully utilizes the power of
- the OCaml Platform
- to provide integrations with editors such as VSCode, Vim, or Emacs,
- with features like type inspection, autocomplete, and more. It also
- has first-class integration with Dune, OCaml's most used build system.
-
-
-
-
-
-
-
-
-
-
- JavaScript Integration
-
- Whether you want to use existing JavaScript packages from NPM, or
- use your own JavaScript libraries in your projects, Melange has you
- covered. With an expressive bindings language, and an ergonomic
- compilation model, Melange can help you build robust applications
- that leverage functionality from the JavaScript ecosystem.
-
-
-
-
-
-
-
- Stable and Industry Backed
-
- Melange builds on top of decades of type system research, compiler
- engineering and tooling development to provide a polished
- developer experience. Companies like Ahrefs use Melange daily to
- deploy web applications for their users.
-
-
-
-
-
-
-
-## What is Melange
-
-Melange is a set of tools that come together to generate and interoperate with
-modern JavaScript:
-
-- The [compiler libraries](https://github.com/melange-re/melange-compiler-libs):
- These libraries are a fork of the [OCaml compiler
- libraries](https://v2.ocaml.org/api/compilerlibref/Compiler_libs.html) with
- adaptations for generating lean JavaScript code, as opposed to bytecode or
- assembly.
-
-- The compiler (`melc`): This executable takes OCaml code as input and is
- responsible for generating JavaScript. It relies on the Melange compiler
- libraries.
-
-- The
- [runtime](https://github.com/melange-re/melange/tree/c5bf086511ed4830018e67ca63df86045dbe356d/jscomp/runtime):
- This is a small code component essential for running JavaScript programs
- produced by the compiler.
-
-- The [standard libraries](./api.md): Melange includes a set of foundational
- elements such as data structures, functions, and bindings to JavaScript APIs,
- all aimed at helping developers accelerate app development.
-
-- The preprocessor (`melange.ppx`): This is a
- [meta-programming](https://ocaml.org/docs/metaprogramming) tool designed to
- preprocess Melange programs, simplifying code generation for common use cases
- like generating bindings or code from types.
-
-- The [playground](./playground): This is a browser-based version of the
- compiler, enabling users to experiment with and share Melange code snippets
- and small programs.
-
-In addition to these core components, there is an ongoing effort to integrate
-Melange into the broader OCaml Platform and other tools and libraries within the
-OCaml ecosystem:
-
-- A [build system](./build-system.md): [Dune](https://dune.readthedocs.io), a
- prominent OCaml build system, provides seamless support for Melange.
-
-- A [package manager](./package-management.md): Melange seamlessly integrates
- with [opam](https://opam.ocaml.org/), OCaml's default package manager.
-
-- A package repository: Melange libraries and tools are published in the [main
- public package repository](https://opam.ocaml.org/packages/) for opam.
-
-- Syntaxes: Melange empowers users to optionally write their applications using
- the [Reason syntax](https://reasonml.github.io/), with full support for React
- applications through the Melange bindings library
- [ReasonReact](https://reasonml.github.io/reason-react/).
-
-- Editor integration: Melange is fully compatible with the [OCaml editor
- tools](https://ocaml.org/docs/set-up-editor), and also with code formatters
- like [ocamlformat](https://github.com/ocaml-ppx/ocamlformat) and
- [refmt](https://github.com/reasonml/reason/tree/d47e613b736cc25629aabc1c8ef91795e265eacb/src/refmt).
diff --git a/docs/js/reasonml.js b/docs/js/reasonml.js
deleted file mode 100644
index 3f9818a91..000000000
--- a/docs/js/reasonml.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*! `reasonml` grammar compiled for Highlight.js 11.8.0 */
-(()=>{var e=(()=>{"use strict";return e=>({name:"ReasonML",aliases:["re"],
-keywords:{$pattern:"[a-z_]\\w*!?",
-keyword:"and as asr assert begin class constraint do done downto else end esfun exception external for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor mod module mutable new nonrec object of open or pri pub rec sig struct switch then to try type val virtual when while with",
-built_in:"array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 ref string unit ",
-literal:"true false"},illegal:"(:-|:=|\\$\\{|\\+=)",contains:[{
-className:"literal",begin:"\\[(\\|\\|)?\\]|\\(\\)",relevance:0
-},e.C_LINE_COMMENT_MODE,e.COMMENT("/\\*","\\*/",{illegal:"^(#,\\/\\/)"}),{
-className:"symbol",begin:"'[A-Za-z_](?!')[\\w']*"},{className:"type",
-begin:"`[A-Z][\\w']*"},{className:"type",begin:"\\b[A-Z][\\w']*",relevance:0},{
-begin:"[a-z_]\\w*'[\\w']*",relevance:0},e.inherit(e.APOS_STRING_MODE,{
-className:"string",relevance:0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null}),{
-className:"number",
-begin:"\\b(0[xX][a-fA-F0-9_]+[Lln]?|0[oO][0-7_]+[Lln]?|0[bB][01_]+[Lln]?|[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)",
-relevance:0}]})})();hljs.registerLanguage("reasonml",e)})();
diff --git a/docs/js/toggleSyntaxButton.js b/docs/js/toggleSyntaxButton.js
deleted file mode 100644
index 1020a60b9..000000000
--- a/docs/js/toggleSyntaxButton.js
+++ /dev/null
@@ -1,32 +0,0 @@
-document.addEventListener("DOMContentLoaded", () => {
- const SYNTAXES = ["reasonml", "ocaml"];
- const CLASS_PREFIX = "syntax__";
- const $toggleSyntaxButton = document.createElement("div");
-
- $toggleSyntaxButton.classList.add("button", "toggleSyntaxButton");
- $toggleSyntaxButton.innerHTML = `
- Syntax:
- OCaml
- Reason
- `;
- document
- .querySelector(".wy-side-scroll > .wy-side-nav-search > a")
- .insertAdjacentElement("afterend", $toggleSyntaxButton);
-
- let currentSyntax;
- let setCurrentSyntax = (syntax = SYNTAXES[0]) => {
- document.body.classList.remove(`${CLASS_PREFIX}${currentSyntax}`);
- document.body.classList.add(`${CLASS_PREFIX}${syntax}`);
-
- currentSyntax = syntax;
- localStorage.setItem("syntax", currentSyntax);
- };
-
- setCurrentSyntax(
- localStorage.getItem("syntax", currentSyntax) || SYNTAXES[0]
- );
-
- $toggleSyntaxButton.addEventListener("click", () => {
- setCurrentSyntax(currentSyntax == SYNTAXES[0] ? SYNTAXES[1] : SYNTAXES[0]);
- });
-});
diff --git a/docs/melange-for-x-developers.md b/docs/melange-for-x-developers.md
index 4de77f37e..3a30d688b 100644
--- a/docs/melange-for-x-developers.md
+++ b/docs/melange-for-x-developers.md
@@ -439,8 +439,8 @@ type email = string;
const a = 1;
type A = { readonly x: number };
-type ImmutableA = Readonly;
-const arr: ReadonlyArray = [1, 2, 3];
+type ImmutableA = Readonly<A>;
+const arr: ReadonlyArray<number> = [1, 2, 3];
type A = { readonly [x: string]: number };
diff --git a/docs/package-management.md b/docs/package-management.md
index d25fabac1..460563221 100644
--- a/docs/package-management.md
+++ b/docs/package-management.md
@@ -323,7 +323,8 @@ To use a library from the installed package, add the library name to the `dune`
file under the `libraries` field. For example, if our project structure looks
like:
-project_name/
+
+project_name/
├── _opam
├── src
│ ├── dune
@@ -336,7 +337,7 @@ like:
├── dune
├── package.json
└── ...
-project_name/
+project_name/
├── _opam
├── src
│ ├── dune
@@ -349,6 +350,7 @@ like:
├── dune
├── package.json
└── ...
+
then `reason-react` should be added to the `dune` file under the `src` folder:
diff --git a/docs/api/.gitkeep b/docs/public/api/.gitkeep
similarity index 100%
rename from docs/api/.gitkeep
rename to docs/public/api/.gitkeep
diff --git a/docs/what-is-melange.md b/docs/what-is-melange.md
new file mode 100644
index 000000000..cee247c68
--- /dev/null
+++ b/docs/what-is-melange.md
@@ -0,0 +1,55 @@
+# What is Melange
+
+Melange is a set of tools that come together to generate and interoperate with
+modern JavaScript:
+
+- The [compiler libraries](https://github.com/melange-re/melange-compiler-libs):
+ These libraries are a fork of the [OCaml compiler
+ libraries](https://v2.ocaml.org/api/compilerlibref/Compiler_libs.html) with
+ adaptations for generating lean JavaScript code, as opposed to bytecode or
+ assembly.
+
+- The compiler (`melc`): This executable takes OCaml code as input and is
+ responsible for generating JavaScript. It relies on the Melange compiler
+ libraries.
+
+- The
+ [runtime](https://github.com/melange-re/melange/tree/c5bf086511ed4830018e67ca63df86045dbe356d/jscomp/runtime):
+ This is a small code component essential for running JavaScript programs
+ produced by the compiler.
+
+- The [standard libraries](./api): Melange includes a set of foundational
+ elements such as data structures, functions, and bindings to JavaScript APIs,
+ all aimed at helping developers accelerate app development.
+
+- The preprocessor (`melange.ppx`): This is a
+ [meta-programming](https://ocaml.org/docs/metaprogramming) tool designed to
+ preprocess Melange programs, simplifying code generation for common use cases
+ like generating bindings or code from types.
+
+- The [playground](./playground/){target="_self"}: This is a browser-based version of the
+ compiler, enabling users to experiment with and share Melange code snippets
+ and small programs.
+
+In addition to these core components, there is an ongoing effort to integrate
+Melange into the broader OCaml Platform and other tools and libraries within the
+OCaml ecosystem:
+
+- A [build system](./build-system.md): [Dune](https://dune.readthedocs.io), a
+ prominent OCaml build system, provides seamless support for Melange.
+
+- A [package manager](./package-management.md): Melange seamlessly integrates
+ with [opam](https://opam.ocaml.org/), OCaml's default package manager.
+
+- A package repository: Melange libraries and tools are published in the [main
+ public package repository](https://opam.ocaml.org/packages/) for opam.
+
+- Syntaxes: Melange empowers users to optionally write their applications using
+ the [Reason syntax](https://reasonml.github.io/), with full support for React
+ applications through the Melange bindings library
+ [ReasonReact](https://reasonml.github.io/reason-react/).
+
+- Editor integration: Melange is fully compatible with the [OCaml editor
+ tools](https://ocaml.org/docs/set-up-editor), and also with code formatters
+ like [ocamlformat](https://github.com/ocaml-ppx/ocamlformat) and
+ [refmt](https://github.com/reasonml/reason/tree/d47e613b736cc25629aabc1c8ef91795e265eacb/src/refmt).
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index 2743a89d3..000000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-site_name: Melange
-
-repo_url: https://github.com/melange-re/melange-re.github.io/
-edit_uri: blob/master/docs/
-site_url: https://melange.re
-
-theme:
- name: readthedocs
- custom_dir: theme
- locale: en
- highlightjs: true
- hljs_languages:
- - ocaml
-
-plugins:
- - search
- - print-site
- - mike
-
-nav:
- - Home: index.md
- - Why: rationale.md
- - Getting Started: getting-started.md
- - Learn:
- - New to OCaml?: new-to-ocaml.md
- - Package management: package-management.md
- - Build system: build-system.md
- - Communicate with JavaScript: communicate-with-javascript.md
- - How-to guides: how-to-guides.md
- - Melange for X developers: melange-for-x-developers.md
- - Reference:
- - API: api.md
- - Try:
- - Playground: playground/index.html
- - About:
- - Community: community.md
- - Roadmap: roadmap.md
-
-extra_css:
- - css/extra.css
-
-extra_javascript:
- - js/toggleSyntaxButton.js
- - js/reasonml.js
diff --git a/package.json b/package.json
new file mode 100644
index 000000000..60090a1a7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "melange.re",
+ "version": "1.0.0",
+ "description": "This repository contains the source for Melange public documentation site.",
+ "main": "index.js",
+ "directories": {
+ "doc": "docs"
+ },
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1",
+ "docs:dev": "vitepress dev docs",
+ "docs:build": "vitepress build docs",
+ "docs:preview": "vitepress preview docs"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/melange-re/melange-re.github.io.git"
+ },
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/melange-re/melange-re.github.io/issues"
+ },
+ "homepage": "https://github.com/melange-re/melange-re.github.io#readme",
+ "devDependencies": {
+ "vitepress": "^1.0.0-rc.42"
+ }
+}
\ No newline at end of file
diff --git a/pip-requirements.txt b/pip-requirements.txt
deleted file mode 100644
index b2cd5342a..000000000
--- a/pip-requirements.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-mkdocs==1.4.3
-mkdocs-print-site-plugin==2.3.4
-mike @ git+https://github.com/jchavarri/mike@1.1.2-with-importlib
diff --git a/playground/vite.config.ts b/playground/vite.config.ts
index ce5217bae..7acb9f7fe 100644
--- a/playground/vite.config.ts
+++ b/playground/vite.config.ts
@@ -5,7 +5,7 @@ import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
build: {
- outDir: "../docs/playground",
+ outDir: "../docs/public/playground",
rollupOptions: {
treeshake: false
}
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 000000000..d7a6e198f
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,762 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@algolia/autocomplete-core@1.9.3":
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7"
+ integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==
+ dependencies:
+ "@algolia/autocomplete-plugin-algolia-insights" "1.9.3"
+ "@algolia/autocomplete-shared" "1.9.3"
+
+"@algolia/autocomplete-plugin-algolia-insights@1.9.3":
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587"
+ integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==
+ dependencies:
+ "@algolia/autocomplete-shared" "1.9.3"
+
+"@algolia/autocomplete-preset-algolia@1.9.3":
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da"
+ integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==
+ dependencies:
+ "@algolia/autocomplete-shared" "1.9.3"
+
+"@algolia/autocomplete-shared@1.9.3":
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa"
+ integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==
+
+"@algolia/cache-browser-local-storage@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz#14b6dc9abc9e3a304a5fffb063d15f30af1032d1"
+ integrity sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==
+ dependencies:
+ "@algolia/cache-common" "4.22.1"
+
+"@algolia/cache-common@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.22.1.tgz#c625dff4bc2a74e79f9aed67b4e053b0ef1b3ec1"
+ integrity sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==
+
+"@algolia/cache-in-memory@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz#858a3d887f521362e87d04f3943e2810226a0d71"
+ integrity sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==
+ dependencies:
+ "@algolia/cache-common" "4.22.1"
+
+"@algolia/client-account@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.22.1.tgz#a7fb8b66b9a4f0a428e1426b2561144267d76d43"
+ integrity sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==
+ dependencies:
+ "@algolia/client-common" "4.22.1"
+ "@algolia/client-search" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+"@algolia/client-analytics@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.22.1.tgz#506558740b4d49b1b1e3393861f729a8ce921851"
+ integrity sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==
+ dependencies:
+ "@algolia/client-common" "4.22.1"
+ "@algolia/client-search" "4.22.1"
+ "@algolia/requester-common" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+"@algolia/client-common@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.22.1.tgz#042b19c1b6157c485fa1b551349ab313944d2b05"
+ integrity sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==
+ dependencies:
+ "@algolia/requester-common" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+"@algolia/client-personalization@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.22.1.tgz#ff088d797648224fb582e9fe5828f8087835fa3d"
+ integrity sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==
+ dependencies:
+ "@algolia/client-common" "4.22.1"
+ "@algolia/requester-common" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+"@algolia/client-search@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.22.1.tgz#508cc6ab3d1f4e9c02735a630d4dff6fbb8514a2"
+ integrity sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==
+ dependencies:
+ "@algolia/client-common" "4.22.1"
+ "@algolia/requester-common" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+"@algolia/logger-common@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.22.1.tgz#79cf4cd295de0377a94582c6aaac59b1ded731d9"
+ integrity sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==
+
+"@algolia/logger-console@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.22.1.tgz#0355345f6940f67aaa78ae9b81c06e44e49f2336"
+ integrity sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==
+ dependencies:
+ "@algolia/logger-common" "4.22.1"
+
+"@algolia/requester-browser-xhr@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz#f04df6fe9690a071b267c77d26b83a3be9280361"
+ integrity sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==
+ dependencies:
+ "@algolia/requester-common" "4.22.1"
+
+"@algolia/requester-common@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.22.1.tgz#27be35f3718aafcb6b388ff9c3aa2defabd559ff"
+ integrity sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==
+
+"@algolia/requester-node-http@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz#589a6fa828ad0f325e727a6fcaf4e1a2343cc62b"
+ integrity sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==
+ dependencies:
+ "@algolia/requester-common" "4.22.1"
+
+"@algolia/transporter@4.22.1":
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.22.1.tgz#8843841b857dc021668f31647aa557ff19cd9cb1"
+ integrity sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==
+ dependencies:
+ "@algolia/cache-common" "4.22.1"
+ "@algolia/logger-common" "4.22.1"
+ "@algolia/requester-common" "4.22.1"
+
+"@babel/parser@^7.23.6":
+ version "7.23.9"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b"
+ integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==
+
+"@docsearch/css@3.5.2", "@docsearch/css@^3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac"
+ integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==
+
+"@docsearch/js@^3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.5.2.tgz#a11cb2e7e62890e9e940283fed6972ecf632629d"
+ integrity sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==
+ dependencies:
+ "@docsearch/react" "3.5.2"
+ preact "^10.0.0"
+
+"@docsearch/react@3.5.2":
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9"
+ integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==
+ dependencies:
+ "@algolia/autocomplete-core" "1.9.3"
+ "@algolia/autocomplete-preset-algolia" "1.9.3"
+ "@docsearch/css" "3.5.2"
+ algoliasearch "^4.19.1"
+
+"@esbuild/aix-ppc64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f"
+ integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==
+
+"@esbuild/android-arm64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4"
+ integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==
+
+"@esbuild/android-arm@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824"
+ integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==
+
+"@esbuild/android-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d"
+ integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==
+
+"@esbuild/darwin-arm64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e"
+ integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==
+
+"@esbuild/darwin-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd"
+ integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==
+
+"@esbuild/freebsd-arm64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487"
+ integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==
+
+"@esbuild/freebsd-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c"
+ integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==
+
+"@esbuild/linux-arm64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b"
+ integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==
+
+"@esbuild/linux-arm@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef"
+ integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==
+
+"@esbuild/linux-ia32@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601"
+ integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==
+
+"@esbuild/linux-loong64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299"
+ integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==
+
+"@esbuild/linux-mips64el@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec"
+ integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==
+
+"@esbuild/linux-ppc64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8"
+ integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==
+
+"@esbuild/linux-riscv64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf"
+ integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==
+
+"@esbuild/linux-s390x@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8"
+ integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==
+
+"@esbuild/linux-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78"
+ integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==
+
+"@esbuild/netbsd-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b"
+ integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==
+
+"@esbuild/openbsd-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0"
+ integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==
+
+"@esbuild/sunos-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30"
+ integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==
+
+"@esbuild/win32-arm64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae"
+ integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==
+
+"@esbuild/win32-ia32@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67"
+ integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==
+
+"@esbuild/win32-x64@0.19.12":
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae"
+ integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==
+
+"@jridgewell/sourcemap-codec@^1.4.15":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@rollup/rollup-android-arm-eabi@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.6.tgz#66b8d9cb2b3a474d115500f9ebaf43e2126fe496"
+ integrity sha512-MVNXSSYN6QXOulbHpLMKYi60ppyO13W9my1qogeiAqtjb2yR4LSmfU2+POvDkLzhjYLXz9Rf9+9a3zFHW1Lecg==
+
+"@rollup/rollup-android-arm64@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.6.tgz#46327d5b86420d2307946bec1535fdf00356e47d"
+ integrity sha512-T14aNLpqJ5wzKNf5jEDpv5zgyIqcpn1MlwCrUXLrwoADr2RkWA0vOWP4XxbO9aiO3dvMCQICZdKeDrFl7UMClw==
+
+"@rollup/rollup-darwin-arm64@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.6.tgz#166987224d2f8b1e2fd28ee90c447d52271d5e90"
+ integrity sha512-CqNNAyhRkTbo8VVZ5R85X73H3R5NX9ONnKbXuHisGWC0qRbTTxnF1U4V9NafzJbgGM0sHZpdO83pLPzq8uOZFw==
+
+"@rollup/rollup-darwin-x64@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.6.tgz#a2e6e096f74ccea6e2f174454c26aef6bcdd1274"
+ integrity sha512-zRDtdJuRvA1dc9Mp6BWYqAsU5oeLixdfUvkTHuiYOHwqYuQ4YgSmi6+/lPvSsqc/I0Omw3DdICx4Tfacdzmhog==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.6.tgz#09fcd4c55a2d6160c5865fec708a8e5287f30515"
+ integrity sha512-oNk8YXDDnNyG4qlNb6is1ojTOGL/tRhbbKeE/YuccItzerEZT68Z9gHrY3ROh7axDc974+zYAPxK5SH0j/G+QQ==
+
+"@rollup/rollup-linux-arm64-gnu@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.6.tgz#19a3c0b6315c747ca9acf86e9b710cc2440f83c9"
+ integrity sha512-Z3O60yxPtuCYobrtzjo0wlmvDdx2qZfeAWTyfOjEDqd08kthDKexLpV97KfAeUXPosENKd8uyJMRDfFMxcYkDQ==
+
+"@rollup/rollup-linux-arm64-musl@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.6.tgz#94aaf95fdaf2ad9335983a4552759f98e6b2e850"
+ integrity sha512-gpiG0qQJNdYEVad+1iAsGAbgAnZ8j07FapmnIAQgODKcOTjLEWM9sRb+MbQyVsYCnA0Im6M6QIq6ax7liws6eQ==
+
+"@rollup/rollup-linux-riscv64-gnu@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.6.tgz#160510e63f4b12618af4013bddf1761cf9fc9880"
+ integrity sha512-+uCOcvVmFUYvVDr27aiyun9WgZk0tXe7ThuzoUTAukZJOwS5MrGbmSlNOhx1j80GdpqbOty05XqSl5w4dQvcOA==
+
+"@rollup/rollup-linux-x64-gnu@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.6.tgz#5ac5d068ce0726bd0a96ca260d5bd93721c0cb98"
+ integrity sha512-HUNqM32dGzfBKuaDUBqFB7tP6VMN74eLZ33Q9Y1TBqRDn+qDonkAUyKWwF9BR9unV7QUzffLnz9GrnKvMqC/fw==
+
+"@rollup/rollup-linux-x64-musl@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.6.tgz#bafa759ab43e8eab9edf242a8259ffb4f2a57a5d"
+ integrity sha512-ch7M+9Tr5R4FK40FHQk8VnML0Szi2KRujUgHXd/HjuH9ifH72GUmw6lStZBo3c3GB82vHa0ZoUfjfcM7JiiMrQ==
+
+"@rollup/rollup-win32-arm64-msvc@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.6.tgz#1cc3416682e5a20d8f088f26657e6e47f8db468e"
+ integrity sha512-VD6qnR99dhmTQ1mJhIzXsRcTBvTjbfbGGwKAHcu+52cVl15AC/kplkhxzW/uT0Xl62Y/meBKDZvoJSJN+vTeGA==
+
+"@rollup/rollup-win32-ia32-msvc@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.6.tgz#7d2251e1aa5e8a1e47c86891fe4547a939503461"
+ integrity sha512-J9AFDq/xiRI58eR2NIDfyVmTYGyIZmRcvcAoJ48oDld/NTR8wyiPUu2X/v1navJ+N/FGg68LEbX3Ejd6l8B7MQ==
+
+"@rollup/rollup-win32-x64-msvc@4.9.6":
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.6.tgz#2c1fb69e02a3f1506f52698cfdc3a8b6386df9a6"
+ integrity sha512-jqzNLhNDvIZOrt69Ce4UjGRpXJBzhUBzawMwnaDAwyHriki3XollsewxWzOzz+4yOFDkuJHtTsZFwMxhYJWmLQ==
+
+"@shikijs/core@1.0.0", "@shikijs/core@^1.0.0-rc.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.0.0.tgz#8d4ae36bae6bd60d5d40116125bcca9b947b40e5"
+ integrity sha512-UMKGMZ+8b88N0/n6DWwWth1PHsOaxjW+R2u+hzSiargZWTv+l3s1l8dhuIxUSsEUPlBDKLs2CSMiFZeviKQM1w==
+
+"@shikijs/transformers@^1.0.0-rc.0":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@shikijs/transformers/-/transformers-1.0.0.tgz#d07e8b193f05d9ad463d73306be6fb9e316e0250"
+ integrity sha512-US0Sc0OdH7eGL64BtfvX3XezPfqhqF5mPyBFLlbZqSpFt2/emnv9GveAWzELGsIuvXoJ6N1RjeAdmQx5Xni6BQ==
+ dependencies:
+ shiki "1.0.0"
+
+"@types/estree@1.0.5":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
+ integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
+
+"@types/linkify-it@*":
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.5.tgz#1e78a3ac2428e6d7e6c05c1665c242023a4601d8"
+ integrity sha512-yg6E+u0/+Zjva+buc3EIb+29XEg4wltq7cSmd4Uc2EE/1nUVmxyzpX6gUXD0V8jIrG0r7YeOGVIbYRkxeooCtw==
+
+"@types/markdown-it@^13.0.7":
+ version "13.0.7"
+ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-13.0.7.tgz#4a495115f470075bd4434a0438ac477a49c2e152"
+ integrity sha512-U/CBi2YUUcTHBt5tjO2r5QV/x0Po6nsYwQU4Y04fBS6vfoImaiZ6f8bi3CjTCxBPQSO1LMyUqkByzi8AidyxfA==
+ dependencies:
+ "@types/linkify-it" "*"
+ "@types/mdurl" "*"
+
+"@types/mdurl@*":
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.5.tgz#3e0d2db570e9fb6ccb2dc8fde0be1d79ac810d39"
+ integrity sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==
+
+"@types/web-bluetooth@^0.0.20":
+ version "0.0.20"
+ resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz#f066abfcd1cbe66267cdbbf0de010d8a41b41597"
+ integrity sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==
+
+"@vitejs/plugin-vue@^5.0.3":
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-5.0.3.tgz#164b36653910d27c130cf6c945b4bd9bde5bcbee"
+ integrity sha512-b8S5dVS40rgHdDrw+DQi/xOM9ed+kSRZzfm1T74bMmBDCd8XO87NKlFYInzCtwvtWwXZvo1QxE2OSspTATWrbA==
+
+"@vue/compiler-core@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.15.tgz#be20d1bbe19626052500b48969302cb6f396d36e"
+ integrity sha512-XcJQVOaxTKCnth1vCxEChteGuwG6wqnUHxAm1DO3gCz0+uXKaJNx8/digSz4dLALCy8n2lKq24jSUs8segoqIw==
+ dependencies:
+ "@babel/parser" "^7.23.6"
+ "@vue/shared" "3.4.15"
+ entities "^4.5.0"
+ estree-walker "^2.0.2"
+ source-map-js "^1.0.2"
+
+"@vue/compiler-dom@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.15.tgz#753f5ed55f78d33dff04701fad4d76ff0cf81ee5"
+ integrity sha512-wox0aasVV74zoXyblarOM3AZQz/Z+OunYcIHe1OsGclCHt8RsRm04DObjefaI82u6XDzv+qGWZ24tIsRAIi5MQ==
+ dependencies:
+ "@vue/compiler-core" "3.4.15"
+ "@vue/shared" "3.4.15"
+
+"@vue/compiler-sfc@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.15.tgz#4e5811e681955fcec886cebbec483f6ae463a64b"
+ integrity sha512-LCn5M6QpkpFsh3GQvs2mJUOAlBQcCco8D60Bcqmf3O3w5a+KWS5GvYbrrJBkgvL1BDnTp+e8q0lXCLgHhKguBA==
+ dependencies:
+ "@babel/parser" "^7.23.6"
+ "@vue/compiler-core" "3.4.15"
+ "@vue/compiler-dom" "3.4.15"
+ "@vue/compiler-ssr" "3.4.15"
+ "@vue/shared" "3.4.15"
+ estree-walker "^2.0.2"
+ magic-string "^0.30.5"
+ postcss "^8.4.33"
+ source-map-js "^1.0.2"
+
+"@vue/compiler-ssr@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.15.tgz#a910a5b89ba4f0a776e40b63d69bdae2f50616cf"
+ integrity sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==
+ dependencies:
+ "@vue/compiler-dom" "3.4.15"
+ "@vue/shared" "3.4.15"
+
+"@vue/devtools-api@^7.0.14":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-7.0.14.tgz#27eedda650f09d991718741268b7cef823dd08a6"
+ integrity sha512-TluWR9qZ6aO11bwtYK8+fzXxBqLfsE0mWZz1q/EQBmO9k82Cm6deieLwNNXjNFJz7xutazoia5Qa+zTYkPPOfw==
+ dependencies:
+ "@vue/devtools-kit" "^7.0.14"
+
+"@vue/devtools-kit@^7.0.14":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-kit/-/devtools-kit-7.0.14.tgz#39635f3478f0048d97df9b3dcceeae27a7ae3eec"
+ integrity sha512-wAAJazr4hI0aVRpgWOCVPw+NzMQdthhnprHHIg4njp1MkKrpCNGQ7MtQbZF1AltAA7xpMCGyyt+0kYH0FqTiPg==
+ dependencies:
+ "@vue/devtools-schema" "^7.0.14"
+ "@vue/devtools-shared" "^7.0.14"
+ hookable "^5.5.3"
+ mitt "^3.0.1"
+ perfect-debounce "^1.0.0"
+ speakingurl "^14.0.1"
+
+"@vue/devtools-schema@^7.0.14":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-schema/-/devtools-schema-7.0.14.tgz#5b638859918a71c218108d0e8b39000e2813f1f2"
+ integrity sha512-tpUeCLVrdHX+KzWMLTAwx/vAPFbo6jAUi7sr6Q+0mBIqIVSSIxNr5wEhegiFvYva+OtDeM2OrT+f7/X/5bvZNg==
+
+"@vue/devtools-shared@^7.0.14":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@vue/devtools-shared/-/devtools-shared-7.0.14.tgz#7f2aee9c25a027d59962da90689d231a73a0e589"
+ integrity sha512-79RP1NDakBVWou9rDpVnT1WMjTbL1lJKm6YEOodjQ0dq5ehf0wsRbeYDhgAlnjehWRzTq5GAYFBFUPYBs0/QpA==
+ dependencies:
+ rfdc "^1.3.1"
+
+"@vue/reactivity@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.15.tgz#ad9d9b83f5398d2e8660ad5cfc0f171e7679a9a1"
+ integrity sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==
+ dependencies:
+ "@vue/shared" "3.4.15"
+
+"@vue/runtime-core@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.15.tgz#f81e2fd2108ea41a6d5c61c2462b11dfb754fdf0"
+ integrity sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==
+ dependencies:
+ "@vue/reactivity" "3.4.15"
+ "@vue/shared" "3.4.15"
+
+"@vue/runtime-dom@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.15.tgz#108ef86aa7334ead5d6b9c56a7d93679e1e45406"
+ integrity sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==
+ dependencies:
+ "@vue/runtime-core" "3.4.15"
+ "@vue/shared" "3.4.15"
+ csstype "^3.1.3"
+
+"@vue/server-renderer@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.15.tgz#34438f998e6f6370fac78883a75efe136631957f"
+ integrity sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==
+ dependencies:
+ "@vue/compiler-ssr" "3.4.15"
+ "@vue/shared" "3.4.15"
+
+"@vue/shared@3.4.15":
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.15.tgz#e7d2ea050c667480cb5e1a6df2ac13bcd03a8f30"
+ integrity sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==
+
+"@vueuse/core@10.7.2", "@vueuse/core@^10.7.2":
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.7.2.tgz#78917803a29a0bca1803a6521fdf7ff873f6e72c"
+ integrity sha512-AOyAL2rK0By62Hm+iqQn6Rbu8bfmbgaIMXcE3TSr7BdQ42wnSFlwIdPjInO62onYsEMK/yDMU8C6oGfDAtZ2qQ==
+ dependencies:
+ "@types/web-bluetooth" "^0.0.20"
+ "@vueuse/metadata" "10.7.2"
+ "@vueuse/shared" "10.7.2"
+ vue-demi ">=0.14.6"
+
+"@vueuse/integrations@^10.7.2":
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/@vueuse/integrations/-/integrations-10.7.2.tgz#763de1337d3925be9097aac9a725eec39d4c8e69"
+ integrity sha512-+u3RLPFedjASs5EKPc69Ge49WNgqeMfSxFn+qrQTzblPXZg6+EFzhjarS5edj2qAf6xQ93f95TUxRwKStXj/sQ==
+ dependencies:
+ "@vueuse/core" "10.7.2"
+ "@vueuse/shared" "10.7.2"
+ vue-demi ">=0.14.6"
+
+"@vueuse/metadata@10.7.2":
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.7.2.tgz#ba0187ce138c287fd80301afc5b0d6a97e563633"
+ integrity sha512-kCWPb4J2KGrwLtn1eJwaJD742u1k5h6v/St5wFe8Quih90+k2a0JP8BS4Zp34XUuJqS2AxFYMb1wjUL8HfhWsQ==
+
+"@vueuse/shared@10.7.2":
+ version "10.7.2"
+ resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.7.2.tgz#746441fbc08072371dd600a55883422c83fd0cab"
+ integrity sha512-qFbXoxS44pi2FkgFjPvF4h7c9oMDutpyBdcJdMYIMg9XyXli2meFMuaKn+UMgsClo//Th6+beeCgqweT/79BVA==
+ dependencies:
+ vue-demi ">=0.14.6"
+
+algoliasearch@^4.19.1:
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.22.1.tgz#f10fbecdc7654639ec20d62f109c1b3a46bc6afc"
+ integrity sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==
+ dependencies:
+ "@algolia/cache-browser-local-storage" "4.22.1"
+ "@algolia/cache-common" "4.22.1"
+ "@algolia/cache-in-memory" "4.22.1"
+ "@algolia/client-account" "4.22.1"
+ "@algolia/client-analytics" "4.22.1"
+ "@algolia/client-common" "4.22.1"
+ "@algolia/client-personalization" "4.22.1"
+ "@algolia/client-search" "4.22.1"
+ "@algolia/logger-common" "4.22.1"
+ "@algolia/logger-console" "4.22.1"
+ "@algolia/requester-browser-xhr" "4.22.1"
+ "@algolia/requester-common" "4.22.1"
+ "@algolia/requester-node-http" "4.22.1"
+ "@algolia/transporter" "4.22.1"
+
+csstype@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
+ integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
+
+entities@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+esbuild@^0.19.3:
+ version "0.19.12"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04"
+ integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.19.12"
+ "@esbuild/android-arm" "0.19.12"
+ "@esbuild/android-arm64" "0.19.12"
+ "@esbuild/android-x64" "0.19.12"
+ "@esbuild/darwin-arm64" "0.19.12"
+ "@esbuild/darwin-x64" "0.19.12"
+ "@esbuild/freebsd-arm64" "0.19.12"
+ "@esbuild/freebsd-x64" "0.19.12"
+ "@esbuild/linux-arm" "0.19.12"
+ "@esbuild/linux-arm64" "0.19.12"
+ "@esbuild/linux-ia32" "0.19.12"
+ "@esbuild/linux-loong64" "0.19.12"
+ "@esbuild/linux-mips64el" "0.19.12"
+ "@esbuild/linux-ppc64" "0.19.12"
+ "@esbuild/linux-riscv64" "0.19.12"
+ "@esbuild/linux-s390x" "0.19.12"
+ "@esbuild/linux-x64" "0.19.12"
+ "@esbuild/netbsd-x64" "0.19.12"
+ "@esbuild/openbsd-x64" "0.19.12"
+ "@esbuild/sunos-x64" "0.19.12"
+ "@esbuild/win32-arm64" "0.19.12"
+ "@esbuild/win32-ia32" "0.19.12"
+ "@esbuild/win32-x64" "0.19.12"
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+focus-trap@^7.5.4:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.4.tgz#6c4e342fe1dae6add9c2aa332a6e7a0bbd495ba2"
+ integrity sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==
+ dependencies:
+ tabbable "^6.2.0"
+
+fsevents@~2.3.2, fsevents@~2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+hookable@^5.5.3:
+ version "5.5.3"
+ resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d"
+ integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==
+
+magic-string@^0.30.5:
+ version "0.30.7"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.7.tgz#0cecd0527d473298679da95a2d7aeb8c64048505"
+ integrity sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.15"
+
+mark.js@8.11.1:
+ version "8.11.1"
+ resolved "https://registry.yarnpkg.com/mark.js/-/mark.js-8.11.1.tgz#180f1f9ebef8b0e638e4166ad52db879beb2ffc5"
+ integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==
+
+minisearch@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/minisearch/-/minisearch-6.3.0.tgz#985a2f1ca3c73c2d65af94f0616bfe57164b0b6b"
+ integrity sha512-ihFnidEeU8iXzcVHy74dhkxh/dn8Dc08ERl0xwoMMGqp4+LvRSCgicb+zGqWthVokQKvCSxITlh3P08OzdTYCQ==
+
+mitt@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
+ integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+
+nanoid@^3.3.7:
+ version "3.3.7"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
+ integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
+
+perfect-debounce@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz#9c2e8bc30b169cc984a58b7d5b28049839591d2a"
+ integrity sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.4.32, postcss@^8.4.33:
+ version "8.4.34"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.34.tgz#563276e86b4ff20dfa5eed0d394d4c53853b2051"
+ integrity sha512-4eLTO36woPSocqZ1zIrFD2K1v6wH7pY1uBh0JIM2KKfrVtGvPFiAku6aNOP0W1Wr9qwnaCsF0Z+CrVnryB2A8Q==
+ dependencies:
+ nanoid "^3.3.7"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+preact@^10.0.0:
+ version "10.19.3"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.19.3.tgz#7a7107ed2598a60676c943709ea3efb8aaafa899"
+ integrity sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==
+
+rfdc@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.1.tgz#2b6d4df52dffe8bb346992a10ea9451f24373a8f"
+ integrity sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==
+
+rollup@^4.2.0:
+ version "4.9.6"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.9.6.tgz#4515facb0318ecca254a2ee1315e22e09efc50a0"
+ integrity sha512-05lzkCS2uASX0CiLFybYfVkwNbKZG5NFQ6Go0VWyogFTXXbR039UVsegViTntkk4OglHBdF54ccApXRRuXRbsg==
+ dependencies:
+ "@types/estree" "1.0.5"
+ optionalDependencies:
+ "@rollup/rollup-android-arm-eabi" "4.9.6"
+ "@rollup/rollup-android-arm64" "4.9.6"
+ "@rollup/rollup-darwin-arm64" "4.9.6"
+ "@rollup/rollup-darwin-x64" "4.9.6"
+ "@rollup/rollup-linux-arm-gnueabihf" "4.9.6"
+ "@rollup/rollup-linux-arm64-gnu" "4.9.6"
+ "@rollup/rollup-linux-arm64-musl" "4.9.6"
+ "@rollup/rollup-linux-riscv64-gnu" "4.9.6"
+ "@rollup/rollup-linux-x64-gnu" "4.9.6"
+ "@rollup/rollup-linux-x64-musl" "4.9.6"
+ "@rollup/rollup-win32-arm64-msvc" "4.9.6"
+ "@rollup/rollup-win32-ia32-msvc" "4.9.6"
+ "@rollup/rollup-win32-x64-msvc" "4.9.6"
+ fsevents "~2.3.2"
+
+shiki@1.0.0, shiki@^1.0.0-rc.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.0.0.tgz#963059ec0df11cca75e2e95054a33289679b239d"
+ integrity sha512-rOUGJa3yFGgOrEoiELYxraoBbag3ZWf9bpodlr05Wjm85Scx8OIX+otdSefq9Pk7L47TKEzGodSQb4L38jka6A==
+ dependencies:
+ "@shikijs/core" "1.0.0"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+speakingurl@^14.0.1:
+ version "14.0.1"
+ resolved "https://registry.yarnpkg.com/speakingurl/-/speakingurl-14.0.1.tgz#f37ec8ddc4ab98e9600c1c9ec324a8c48d772a53"
+ integrity sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==
+
+tabbable@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
+ integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
+
+vite@^5.0.12:
+ version "5.0.12"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-5.0.12.tgz#8a2ffd4da36c132aec4adafe05d7adde38333c47"
+ integrity sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==
+ dependencies:
+ esbuild "^0.19.3"
+ postcss "^8.4.32"
+ rollup "^4.2.0"
+ optionalDependencies:
+ fsevents "~2.3.3"
+
+vitepress@^1.0.0-rc.42:
+ version "1.0.0-rc.42"
+ resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-1.0.0-rc.42.tgz#cdb822223136d642107254b5576de8b79b18c0a8"
+ integrity sha512-VeiVVXFblt/sjruFSJBNChMWwlztMrRMe8UXdNpf4e05mKtTYEY38MF5qoP90KxPTCfMQiKqwEGwXAGuOTK8HQ==
+ dependencies:
+ "@docsearch/css" "^3.5.2"
+ "@docsearch/js" "^3.5.2"
+ "@shikijs/core" "^1.0.0-rc.0"
+ "@shikijs/transformers" "^1.0.0-rc.0"
+ "@types/markdown-it" "^13.0.7"
+ "@vitejs/plugin-vue" "^5.0.3"
+ "@vue/devtools-api" "^7.0.14"
+ "@vueuse/core" "^10.7.2"
+ "@vueuse/integrations" "^10.7.2"
+ focus-trap "^7.5.4"
+ mark.js "8.11.1"
+ minisearch "^6.3.0"
+ shiki "^1.0.0-rc.0"
+ vite "^5.0.12"
+ vue "^3.4.15"
+
+vue-demi@>=0.14.6:
+ version "0.14.7"
+ resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.7.tgz#8317536b3ef74c5b09f268f7782e70194567d8f2"
+ integrity sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==
+
+vue@^3.4.15:
+ version "3.4.15"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.15.tgz#91f979844ffca9239dff622ba4c79c5d5524b88c"
+ integrity sha512-jC0GH4KkWLWJOEQjOpkqU1bQsBwf4R1rsFtw5GQJbjHVKWDzO6P0nWWBTmjp1xSemAioDFj1jdaK1qa3DnMQoQ==
+ dependencies:
+ "@vue/compiler-dom" "3.4.15"
+ "@vue/compiler-sfc" "3.4.15"
+ "@vue/runtime-dom" "3.4.15"
+ "@vue/server-renderer" "3.4.15"
+ "@vue/shared" "3.4.15"