Compare commits

...

13 Commits

Author SHA1 Message Date
github-actions[bot] 7fc334ad85 Bump version to 3.0.0 (#1363)
Automated changes by
[create-pull-request](https://github.com/peter-evans/create-pull-request)
GitHub action

---------

Co-authored-by: HarelM <3269297+HarelM@users.noreply.github.com>
Co-authored-by: Harel M <harel.mazor@gmail.com>
2025-09-09 14:32:28 +00:00
Harel M 42a040e91a Use desktop build inside docker (#1350)
## Launch Checklist

This PR uses the maputnik CLI inside the docker container to allow
loading of files into the container and watch for changes.

 - [x] Briefly describe the changes in this PR.
 - [x] Write tests for all new functionality.
 - [x] Add an entry to `CHANGELOG.md` under the `## main` section.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-09 17:15:38 +03:00
dependabot[bot] f5757dd8a2 chore(deps-dev): Bump typescript-eslint from 8.42.0 to 8.43.0 (#1361)
Bumps
[typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint)
from 8.42.0 to 8.43.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/releases">typescript-eslint's
releases</a>.</em></p>
<blockquote>
<h2>v8.43.0</h2>
<h2>8.43.0 (2025-09-08)</h2>
<h3>🚀 Features</h3>
<ul>
<li><strong>typescript-estree:</strong> disallow empty type
parameter/argument lists (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11563">#11563</a>)</li>
</ul>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-non-null-assertion] do not
suggest optional chain on LHS of assignment (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11489">#11489</a>)</li>
<li><strong>eslint-plugin:</strong> [no-unnecessary-type-conversion]
only report ~~ on integer literal types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11517">#11517</a>)</li>
<li><strong>eslint-plugin:</strong> [consistent-type-exports] fix
declaration shadowing (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11457">#11457</a>)</li>
<li><strong>eslint-plugin:</strong> [no-floating-promises]
allowForKnownSafeCalls now supports function names (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11423">#11423</a>,
<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11430">#11430</a>)</li>
<li><strong>eslint-plugin:</strong> [no-deprecated] should report
deprecated exports and reexports (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11359">#11359</a>)</li>
<li><strong>eslint-plugin:</strong> [prefer-return-this-type] don't
report an error when returning a union type that includes a classType
(<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11432">#11432</a>)</li>
<li><strong>rule-tester:</strong> normalize paths before checking if
they escape cwd (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11525">#11525</a>)</li>
<li><strong>scope-manager:</strong> exclude Program from DefinitionBase
node types (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11469">#11469</a>)</li>
<li><strong>type-utils:</strong> add union type support to
TypeOrValueSpecifier (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11526">#11526</a>)</li>
<li><strong>typescript-estree:</strong> match filenames starting with a
period when using glob in allowDefaultProject / (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11537">#11537</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Dima <a
href="https://github.com/dbarabashh"><code>@​dbarabashh</code></a></li>
<li>Kirk Waiblinger <a
href="https://github.com/kirkwaiblinger"><code>@​kirkwaiblinger</code></a></li>
<li>mdm317</li>
<li>Nicolas Le Cam</li>
<li>tao</li>
<li>Victor Genaev <a
href="https://github.com/mainframev"><code>@​mainframev</code></a></li>
<li>Yukihiro Hasegawa <a
href="https://github.com/y-hsgw"><code>@​y-hsgw</code></a></li>
<li>민감자(Minji Kim) <a
href="https://github.com/mouse0429"><code>@​mouse0429</code></a></li>
<li>송재욱</li>
</ul>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md">typescript-eslint's
changelog</a>.</em></p>
<blockquote>
<h2>8.43.0 (2025-09-08)</h2>
<h3>🩹 Fixes</h3>
<ul>
<li><strong>eslint-plugin:</strong> [no-deprecated] should report
deprecated exports and reexports (<a
href="https://redirect.github.com/typescript-eslint/typescript-eslint/pull/11359">#11359</a>)</li>
</ul>
<h3>❤️ Thank You</h3>
<ul>
<li>Victor Genaev <a
href="https://github.com/mainframev"><code>@​mainframev</code></a></li>
</ul>
<p>You can read about our <a
href="https://typescript-eslint.io/users/versioning">versioning
strategy</a> and <a
href="https://typescript-eslint.io/users/releases">releases</a> on our
website.</p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/ef9173c56fa488737bff9ab463338ea65cb83373"><code>ef9173c</code></a>
chore(release): publish 8.43.0</li>
<li><a
href="https://github.com/typescript-eslint/typescript-eslint/commit/d8ca5ef54aa7fa4d14004dd1084eac9546b1f71e"><code>d8ca5ef</code></a>
fix(eslint-plugin): [no-deprecated] should report deprecated exports and
reex...</li>
<li>See full diff in <a
href="https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=typescript-eslint&package-manager=npm_and_yarn&previous-version=8.42.0&new-version=8.43.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 13:22:58 +00:00
dependabot[bot] 3b79303f83 chore(deps-dev): Bump uuid from 12.0.0 to 13.0.0 (#1362)
Bumps [uuid](https://github.com/uuidjs/uuid) from 12.0.0 to 13.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/uuidjs/uuid/releases">uuid's
releases</a>.</em></p>
<blockquote>
<h2>v13.0.0</h2>
<h2><a
href="https://github.com/uuidjs/uuid/compare/v12.0.0...v13.0.0">13.0.0</a>
(2025-09-08)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>make browser exports the default (<a
href="https://redirect.github.com/uuidjs/uuid/issues/901">#901</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>make browser exports the default (<a
href="https://redirect.github.com/uuidjs/uuid/issues/901">#901</a>) (<a
href="https://github.com/uuidjs/uuid/commit/bce9d72a3ae5b9a3dcd8eb21ef6d1820288a427a">bce9d72</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md">uuid's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/uuidjs/uuid/compare/v12.0.0...v13.0.0">13.0.0</a>
(2025-09-08)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>make browser exports the default (<a
href="https://redirect.github.com/uuidjs/uuid/issues/901">#901</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>make browser exports the default (<a
href="https://redirect.github.com/uuidjs/uuid/issues/901">#901</a>) (<a
href="https://github.com/uuidjs/uuid/commit/bce9d72a3ae5b9a3dcd8eb21ef6d1820288a427a">bce9d72</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/uuidjs/uuid/commit/24c123841fdd1cd66edf11cb4b9b49c9c0e1fc12"><code>24c1238</code></a>
chore(main): release 13.0.0 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/902">#902</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/bce9d72a3ae5b9a3dcd8eb21ef6d1820288a427a"><code>bce9d72</code></a>
fix!: make browser exports the default (<a
href="https://redirect.github.com/uuidjs/uuid/issues/901">#901</a>)</li>
<li>See full diff in <a
href="https://github.com/uuidjs/uuid/compare/v12.0.0...v13.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=uuid&package-manager=npm_and_yarn&previous-version=12.0.0&new-version=13.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 13:16:26 +00:00
Harel M 55a487d0c8 Replacing react-sortable-hoc with dnd-kit (#1359)
## Launch Checklist

This PR replace react-sortable-hoc which is unmaintained with dnd-kit

- Resolves #1016
- Replaces the following PR: #1259

I've tested it locally to make sure it does what it should.
I'll see if I can add a test...

 - [x] Briefly describe the changes in this PR.
 - [x] Link to related issues.
 - [x] Write tests for all new functionality.
 - [x] Add an entry to `CHANGELOG.md` under the `## main` section.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
2025-09-08 22:08:32 +03:00
dependabot[bot] 03f3c5c032 chore(deps-dev): Bump sass from 1.92.0 to 1.92.1 (#1357)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [sass](https://github.com/sass/dart-sass) from 1.92.0 to 1.92.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/sass/dart-sass/releases">sass's
releases</a>.</em></p>
<blockquote>
<h2>Dart Sass 1.92.1</h2>
<p>To install Sass 1.92.1, download one of the packages below and <a
href="https://katiek2.github.io/path-doc/">add it to your PATH</a>, or
see <a href="https://sass-lang.com/install">the Sass website</a> for
full installation instructions.</p>
<h1>Changes</h1>
<ul>
<li>Fix a bug where variable definitions from one imported, forwarded
module would not be passed as implicit configuration to a later
imported, forwarded module.</li>
</ul>
<p>See the <a
href="https://github.com/sass/dart-sass/blob/master/CHANGELOG.md#1921">full
changelog</a> for changes in earlier releases.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/sass/dart-sass/blob/main/CHANGELOG.md">sass's
changelog</a>.</em></p>
<blockquote>
<h2>1.92.1</h2>
<ul>
<li>Fix a bug where variable definitions from one imported, forwarded
module
would not be passed as implicit configuration to a later imported,
forwarded
module.</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/sass/dart-sass/commit/f7f03421f994a476d056aef371489200dde8c20a"><code>f7f0342</code></a>
Fix bug with implicit configuration (<a
href="https://redirect.github.com/sass/dart-sass/issues/2642">#2642</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/ea9f7be9e44a998709b3f41ada98218926d74578"><code>ea9f7be</code></a>
Bump postcss from 8.5.5 to 8.5.6 in /pkg/sass-parser (<a
href="https://redirect.github.com/sass/dart-sass/issues/2607">#2607</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/ff1847b275ae553a667b589fa2761a2d0a32ce11"><code>ff1847b</code></a>
Bump browser-actions/setup-chrome from 1 to 2 (<a
href="https://redirect.github.com/sass/dart-sass/issues/2604">#2604</a>)</li>
<li><a
href="https://github.com/sass/dart-sass/commit/fc5d6e3a89a0e9f3732212b07c2cc3f71a5b2629"><code>fc5d6e3</code></a>
Bump actions/download-artifact from 4 to 5 (<a
href="https://redirect.github.com/sass/dart-sass/issues/2617">#2617</a>)</li>
<li>See full diff in <a
href="https://github.com/sass/dart-sass/compare/1.92.0...1.92.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=sass&package-manager=npm_and_yarn&previous-version=1.92.0&new-version=1.92.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:41:06 +00:00
dependabot[bot] 02efeec96d chore(deps-dev): Bump vite from 7.1.4 to 7.1.5 (#1354)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite)
from 7.1.4 to 7.1.5.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>v7.1.5</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v7.1.5/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><!-- raw HTML omitted --><a
href="https://github.com/vitejs/vite/compare/v7.1.4...v7.1.5">7.1.5</a>
(2025-09-08)<!-- raw HTML omitted --></h2>
<h3>Bug Fixes</h3>
<ul>
<li>apply <code>fs.strict</code> check to HTML files (<a
href="https://redirect.github.com/vitejs/vite/issues/20736">#20736</a>)
(<a
href="https://github.com/vitejs/vite/commit/14015d794f69accba68798bd0e15135bc51c9c1e">14015d7</a>)</li>
<li><strong>deps:</strong> update all non-major dependencies (<a
href="https://redirect.github.com/vitejs/vite/issues/20732">#20732</a>)
(<a
href="https://github.com/vitejs/vite/commit/122bfbabeb1f095ce7cabd30893e5531e9a007c4">122bfba</a>)</li>
<li>upgrade sirv to 3.0.2 (<a
href="https://redirect.github.com/vitejs/vite/issues/20735">#20735</a>)
(<a
href="https://github.com/vitejs/vite/commit/09f2b52e8d5907f26602653caf41b3a56692600d">09f2b52</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/vitejs/vite/commit/564754061e9494f355370e31ee9d7ea5abef6037"><code>5647540</code></a>
release: v7.1.5</li>
<li><a
href="https://github.com/vitejs/vite/commit/09f2b52e8d5907f26602653caf41b3a56692600d"><code>09f2b52</code></a>
fix: upgrade sirv to 3.0.2 (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20735">#20735</a>)</li>
<li><a
href="https://github.com/vitejs/vite/commit/14015d794f69accba68798bd0e15135bc51c9c1e"><code>14015d7</code></a>
fix: apply <code>fs.strict</code> check to HTML files (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20736">#20736</a>)</li>
<li><a
href="https://github.com/vitejs/vite/commit/122bfbabeb1f095ce7cabd30893e5531e9a007c4"><code>122bfba</code></a>
fix(deps): update all non-major dependencies (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20732">#20732</a>)</li>
<li>See full diff in <a
href="https://github.com/vitejs/vite/commits/v7.1.5/packages/vite">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=7.1.4&new-version=7.1.5)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:31:48 +00:00
dependabot[bot] 4896c40554 chore(deps-dev): Bump eslint from 9.34.0 to 9.35.0 (#1358)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [eslint](https://github.com/eslint/eslint) from 9.34.0 to 9.35.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/eslint/eslint/releases">eslint's
releases</a>.</em></p>
<blockquote>
<h2>v9.35.0</h2>
<h2>Features</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/42761fa7c872fb9e14c144b692af6967b3662082"><code>42761fa</code></a>
feat: implement suggestions for no-empty-function (<a
href="https://redirect.github.com/eslint/eslint/issues/20057">#20057</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/102f44442ac9bf1fcd4ba6ab9fae43ce09199df6"><code>102f444</code></a>
feat: implement suggestions for no-empty-static-block (<a
href="https://redirect.github.com/eslint/eslint/issues/20056">#20056</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/e51ffff737ca245b3a1d115cb11e1c99737249a3"><code>e51ffff</code></a>
feat: add <code>preserve-caught-error</code> rule (<a
href="https://redirect.github.com/eslint/eslint/issues/19913">#19913</a>)
(Amnish Singh Arora)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/10e7ae23e30ea0834d9fdeb3a2a1db8103c36cd2"><code>10e7ae2</code></a>
fix: update uncloneable options error message (<a
href="https://redirect.github.com/eslint/eslint/issues/20059">#20059</a>)
(soda-sorcery)</li>
<li><a
href="https://github.com/eslint/eslint/commit/bfa46013e7ea9a522c02f72250fa07160f96a6b8"><code>bfa4601</code></a>
fix: ignore empty switch statements with comments in no-empty rule (<a
href="https://redirect.github.com/eslint/eslint/issues/20045">#20045</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dfd11deb24fc733faa5db751a2f615eb04e48b15"><code>dfd11de</code></a>
fix: add <code>before</code> and <code>after</code> to test case types
(<a
href="https://redirect.github.com/eslint/eslint/issues/20049">#20049</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dabbe95c39671c5fa272da012ee1432aa088650f"><code>dabbe95</code></a>
fix: correct types for <code>no-restricted-imports</code> rule (<a
href="https://redirect.github.com/eslint/eslint/issues/20034">#20034</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/ea789c7dd234c1a6be499a4644dd0f5c97615972"><code>ea789c7</code></a>
fix: no-loss-of-precision false positive with uppercase exponent (<a
href="https://redirect.github.com/eslint/eslint/issues/20032">#20032</a>)
(sethamus)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/d265515642f65246bcd45c17979f67c2afb12f95"><code>d265515</code></a>
docs: improve phrasing - &quot;if&quot; → &quot;even if&quot; from
getting-started section (<a
href="https://redirect.github.com/eslint/eslint/issues/20074">#20074</a>)
(jjangga0214)</li>
<li><a
href="https://github.com/eslint/eslint/commit/a355a0e5b2e6a47cda099b31dc7d112cfb5c4315"><code>a355a0e</code></a>
docs: invert comparison logic for example in <code>no-var</code> doc
page (<a
href="https://redirect.github.com/eslint/eslint/issues/20064">#20064</a>)
(OTonGitHub)</li>
<li><a
href="https://github.com/eslint/eslint/commit/5082fc206de6946d9d4c20e57301f78839b3b9f2"><code>5082fc2</code></a>
docs: Update README (GitHub Actions Bot)</li>
<li><a
href="https://github.com/eslint/eslint/commit/99cfd7e056e1703941c9eb8ca1ae7fdb1987ba9d"><code>99cfd7e</code></a>
docs: add missing &quot;the&quot; in rule deprecation docs (<a
href="https://redirect.github.com/eslint/eslint/issues/20050">#20050</a>)
(Josh Goldberg )</li>
<li><a
href="https://github.com/eslint/eslint/commit/6ad8973e5d3c94b8e100b7266f55f8eb0757eb00"><code>6ad8973</code></a>
docs: update <code>--no-ignore</code> and <code>--ignore-pattern</code>
documentation (<a
href="https://redirect.github.com/eslint/eslint/issues/20036">#20036</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/8033b195299a1eaa4a0ed6553d9e034a457bb577"><code>8033b19</code></a>
docs: add documentation for <code>--no-config-lookup</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20033">#20033</a>)
(Francesco Trotta)</li>
</ul>
<h2>Chores</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/da87f2fe792cab5b69b62bf5c15e69ab4f433087"><code>da87f2f</code></a>
chore: upgrade <code>@​eslint/js</code><a
href="https://github.com/9"><code>@​9</code></a>.35.0 (<a
href="https://redirect.github.com/eslint/eslint/issues/20077">#20077</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release
(Jenkins)</li>
<li><a
href="https://github.com/eslint/eslint/commit/70557649e3111c55d8cddf678b6c4079aa6f0ccc"><code>7055764</code></a>
test: remove <code>tests/lib/eslint/eslint.config.js</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20065">#20065</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20069">#20069</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d5ef9397150cc178e1f9891c3ff49ac4871ec786"><code>d5ef939</code></a>
refactor: remove deprecated <code>context.parserOptions</code> usage
across rules (<a
href="https://redirect.github.com/eslint/eslint/issues/20060">#20060</a>)
(sethamus)</li>
<li><a
href="https://github.com/eslint/eslint/commit/1b3881d7e859bec9589e39888656c33c914a8302"><code>1b3881d</code></a>
chore: remove redundant word (<a
href="https://redirect.github.com/eslint/eslint/issues/20058">#20058</a>)
(pxwanglu)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/eslint/eslint/blob/main/CHANGELOG.md">eslint's
changelog</a>.</em></p>
<blockquote>
<p>v9.35.0 - September 5, 2025</p>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/da87f2fe792cab5b69b62bf5c15e69ab4f433087"><code>da87f2f</code></a>
chore: upgrade <code>@​eslint/js</code><a
href="https://github.com/9"><code>@​9</code></a>.35.0 (<a
href="https://redirect.github.com/eslint/eslint/issues/20077">#20077</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release
(Jenkins)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d265515642f65246bcd45c17979f67c2afb12f95"><code>d265515</code></a>
docs: improve phrasing - &quot;if&quot; → &quot;even if&quot; from
getting-started section (<a
href="https://redirect.github.com/eslint/eslint/issues/20074">#20074</a>)
(jjangga0214)</li>
<li><a
href="https://github.com/eslint/eslint/commit/70557649e3111c55d8cddf678b6c4079aa6f0ccc"><code>7055764</code></a>
test: remove <code>tests/lib/eslint/eslint.config.js</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20065">#20065</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/10e7ae23e30ea0834d9fdeb3a2a1db8103c36cd2"><code>10e7ae2</code></a>
fix: update uncloneable options error message (<a
href="https://redirect.github.com/eslint/eslint/issues/20059">#20059</a>)
(soda-sorcery)</li>
<li><a
href="https://github.com/eslint/eslint/commit/42761fa7c872fb9e14c144b692af6967b3662082"><code>42761fa</code></a>
feat: implement suggestions for no-empty-function (<a
href="https://redirect.github.com/eslint/eslint/issues/20057">#20057</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/102f44442ac9bf1fcd4ba6ab9fae43ce09199df6"><code>102f444</code></a>
feat: implement suggestions for no-empty-static-block (<a
href="https://redirect.github.com/eslint/eslint/issues/20056">#20056</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20069">#20069</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/a355a0e5b2e6a47cda099b31dc7d112cfb5c4315"><code>a355a0e</code></a>
docs: invert comparison logic for example in <code>no-var</code> doc
page (<a
href="https://redirect.github.com/eslint/eslint/issues/20064">#20064</a>)
(OTonGitHub)</li>
<li><a
href="https://github.com/eslint/eslint/commit/e51ffff737ca245b3a1d115cb11e1c99737249a3"><code>e51ffff</code></a>
feat: add <code>preserve-caught-error</code> rule (<a
href="https://redirect.github.com/eslint/eslint/issues/19913">#19913</a>)
(Amnish Singh Arora)</li>
<li><a
href="https://github.com/eslint/eslint/commit/5082fc206de6946d9d4c20e57301f78839b3b9f2"><code>5082fc2</code></a>
docs: Update README (GitHub Actions Bot)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d5ef9397150cc178e1f9891c3ff49ac4871ec786"><code>d5ef939</code></a>
refactor: remove deprecated <code>context.parserOptions</code> usage
across rules (<a
href="https://redirect.github.com/eslint/eslint/issues/20060">#20060</a>)
(sethamus)</li>
<li><a
href="https://github.com/eslint/eslint/commit/1b3881d7e859bec9589e39888656c33c914a8302"><code>1b3881d</code></a>
chore: remove redundant word (<a
href="https://redirect.github.com/eslint/eslint/issues/20058">#20058</a>)
(pxwanglu)</li>
<li><a
href="https://github.com/eslint/eslint/commit/99cfd7e056e1703941c9eb8ca1ae7fdb1987ba9d"><code>99cfd7e</code></a>
docs: add missing &quot;the&quot; in rule deprecation docs (<a
href="https://redirect.github.com/eslint/eslint/issues/20050">#20050</a>)
(Josh Goldberg )</li>
<li><a
href="https://github.com/eslint/eslint/commit/bfa46013e7ea9a522c02f72250fa07160f96a6b8"><code>bfa4601</code></a>
fix: ignore empty switch statements with comments in no-empty rule (<a
href="https://redirect.github.com/eslint/eslint/issues/20045">#20045</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dfd11deb24fc733faa5db751a2f615eb04e48b15"><code>dfd11de</code></a>
fix: add <code>before</code> and <code>after</code> to test case types
(<a
href="https://redirect.github.com/eslint/eslint/issues/20049">#20049</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/6ad8973e5d3c94b8e100b7266f55f8eb0757eb00"><code>6ad8973</code></a>
docs: update <code>--no-ignore</code> and <code>--ignore-pattern</code>
documentation (<a
href="https://redirect.github.com/eslint/eslint/issues/20036">#20036</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dabbe95c39671c5fa272da012ee1432aa088650f"><code>dabbe95</code></a>
fix: correct types for <code>no-restricted-imports</code> rule (<a
href="https://redirect.github.com/eslint/eslint/issues/20034">#20034</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/8033b195299a1eaa4a0ed6553d9e034a457bb577"><code>8033b19</code></a>
docs: add documentation for <code>--no-config-lookup</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20033">#20033</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/ea789c7dd234c1a6be499a4644dd0f5c97615972"><code>ea789c7</code></a>
fix: no-loss-of-precision false positive with uppercase exponent (<a
href="https://redirect.github.com/eslint/eslint/issues/20032">#20032</a>)
(sethamus)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/8401101d1e3e3e4e1edc2a9e59cafc9956bf2610"><code>8401101</code></a>
9.35.0</li>
<li><a
href="https://github.com/eslint/eslint/commit/b80f0254f357ad6b1d8d9b4ded0892b8826ba8f4"><code>b80f025</code></a>
Build: changelog update for 9.35.0</li>
<li><a
href="https://github.com/eslint/eslint/commit/da87f2fe792cab5b69b62bf5c15e69ab4f433087"><code>da87f2f</code></a>
chore: upgrade <code>@​eslint/js</code><a
href="https://github.com/9"><code>@​9</code></a>.35.0 (<a
href="https://redirect.github.com/eslint/eslint/issues/20077">#20077</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release</li>
<li><a
href="https://github.com/eslint/eslint/commit/d265515642f65246bcd45c17979f67c2afb12f95"><code>d265515</code></a>
docs: improve phrasing - &quot;if&quot; → &quot;even if&quot; from
getting-started section (<a
href="https://redirect.github.com/eslint/eslint/issues/20074">#20074</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/70557649e3111c55d8cddf678b6c4079aa6f0ccc"><code>7055764</code></a>
test: remove <code>tests/lib/eslint/eslint.config.js</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20065">#20065</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/10e7ae23e30ea0834d9fdeb3a2a1db8103c36cd2"><code>10e7ae2</code></a>
fix: update uncloneable options error message (<a
href="https://redirect.github.com/eslint/eslint/issues/20059">#20059</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/42761fa7c872fb9e14c144b692af6967b3662082"><code>42761fa</code></a>
feat: implement suggestions for no-empty-function (<a
href="https://redirect.github.com/eslint/eslint/issues/20057">#20057</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/102f44442ac9bf1fcd4ba6ab9fae43ce09199df6"><code>102f444</code></a>
feat: implement suggestions for no-empty-static-block (<a
href="https://redirect.github.com/eslint/eslint/issues/20056">#20056</a>)</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://redirect.github.com/eslint/eslint/issues/20069">#20069</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/eslint/eslint/compare/v9.34.0...v9.35.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=eslint&package-manager=npm_and_yarn&previous-version=9.34.0&new-version=9.35.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:25:04 +00:00
dependabot[bot] 40f1837835 chore(deps-dev): Bump stylelint from 16.23.1 to 16.24.0 (#1356)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps [stylelint](https://github.com/stylelint/stylelint) from 16.23.1
to 16.24.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/stylelint/stylelint/releases">stylelint's
releases</a>.</em></p>
<blockquote>
<h2>16.24.0</h2>
<p>It adds 1 new rule, adds 1 option to a rule and fixes 2 bugs.</p>
<ul>
<li>Added: <code>rule-nesting-at-rule-required-list</code> rule (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8680">#8680</a>)
(<a
href="https://github.com/sw1tch3roo"><code>@​sw1tch3roo</code></a>).</li>
<li>Added: <code>ignoreAtRules: []</code> to
<code>nesting-selector-no-missing-scoping-root</code> (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8743">#8743</a>)
(<a
href="https://github.com/karlhorky"><code>@​karlhorky</code></a>).</li>
<li>Fixed: <code>function-no-unknown</code> false positives for
<code>contrast-color()</code> and <code>sibling-*()</code> (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8729">#8729</a>)
(<a
href="https://github.com/Mouvedia"><code>@​Mouvedia</code></a>).</li>
<li>Fixed: <code>selector-pseudo-class-no-unknown</code> false positives
for <code>:heading</code> (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8749">#8749</a>)
(<a
href="https://github.com/Mouvedia"><code>@​Mouvedia</code></a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/stylelint/stylelint/blob/main/CHANGELOG.md">stylelint's
changelog</a>.</em></p>
<blockquote>
<h2>16.24.0 - 2025-09-07</h2>
<p>It adds 1 new rule, adds 1 option to a rule and fixes 2 bugs.</p>
<ul>
<li>Added: <code>rule-nesting-at-rule-required-list</code> rule (<a
href="https://redirect.github.com/stylelint/stylelint/pull/8680">#8680</a>)
(<a
href="https://github.com/sw1tch3roo"><code>@​sw1tch3roo</code></a>).</li>
<li>Added: <code>ignoreAtRules: []</code> to
<code>nesting-selector-no-missing-scoping-root</code> (<a
href="https://redirect.github.com/stylelint/stylelint/pull/8743">#8743</a>)
(<a
href="https://github.com/karlhorky"><code>@​karlhorky</code></a>).</li>
<li>Fixed: <code>function-no-unknown</code> false positives for
<code>contrast-color()</code> and <code>sibling-*()</code> (<a
href="https://redirect.github.com/stylelint/stylelint/pull/8729">#8729</a>)
(<a
href="https://github.com/Mouvedia"><code>@​Mouvedia</code></a>).</li>
<li>Fixed: <code>selector-pseudo-class-no-unknown</code> false positives
for <code>:heading</code> (<a
href="https://redirect.github.com/stylelint/stylelint/pull/8749">#8749</a>)
(<a
href="https://github.com/Mouvedia"><code>@​Mouvedia</code></a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/stylelint/stylelint/commit/34ec717b7f167f66a9015f85206e9c6214fdbc0a"><code>34ec717</code></a>
16.24.0</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/a55744455046a0626a6a2f07a0a41bfd582ebc57"><code>a557444</code></a>
Document changelog summary (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8751">#8751</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/6f37f764a3cefac956e08249b426125694ede54f"><code>6f37f76</code></a>
Document using latest version of create script (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8750">#8750</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/6567514d74d9182d5b3d93122deff1f36cb28fee"><code>6567514</code></a>
Prepare 16.24.0 (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8725">#8725</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/57b454298ccb5e7d604d812c1ab64b8772e179ed"><code>57b4542</code></a>
Document getting started with alternative package managers (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8726">#8726</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/55377c7452bca7e678e6f5788032a7ea0b7cd90f"><code>55377c7</code></a>
Fix <code>selector-pseudo-class-no-unknown</code> false positives for
<code>:heading</code> (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8749">#8749</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/cfbe7720b53be99a1e75cbaa01fade21351e43d3"><code>cfbe772</code></a>
Add <code>ignoreAtRules: []</code> to
<code>nesting-selector-no-missing-scoping-root</code> (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8743">#8743</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/5d642e9c9b6b8c7a453903350f112f991cdd9430"><code>5d642e9</code></a>
Bump the jest group with 2 updates (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8742">#8742</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/e4eac5632c77c17aa72f251eacf3dff461c50c92"><code>e4eac56</code></a>
Bump rollup from 4.48.0 to 4.50.0 (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8741">#8741</a>)</li>
<li><a
href="https://github.com/stylelint/stylelint/commit/e98952d2436f55319ab4a7d93d85c5310610e54b"><code>e98952d</code></a>
Bump rollup from 4.46.2 to 4.48.0 (<a
href="https://redirect.github.com/stylelint/stylelint/issues/8738">#8738</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/stylelint/stylelint/compare/16.23.1...16.24.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=stylelint&package-manager=npm_and_yarn&previous-version=16.23.1&new-version=16.24.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:21:27 +00:00
dependabot[bot] 3f94ab2f3b chore(deps): Bump maplibre-gl from 5.6.2 to 5.7.1 (#1355)
Bumps [maplibre-gl](https://github.com/maplibre/maplibre-gl-js) from
5.6.2 to 5.7.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/maplibre/maplibre-gl-js/releases">maplibre-gl's
releases</a>.</em></p>
<blockquote>
<h2>v5.7.1</h2>
<p><a
href="https://github.com/maplibre/maplibre-gl-js">https://github.com/maplibre/maplibre-gl-js</a>
<a
href="https://github.com/maplibre/maplibre-gl-js/compare/v5.7.0...v5.7.1">Changes</a>
since <a
href="https://github.com/maplibre/maplibre-gl-js/releases/tag/v5.7.0">MapLibre
GL JS v5.7.0</a>:</p>
<h3>🐞 Bug fixes</h3>
<ul>
<li>Fix accuracy circle on locate user control (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/5432">#5432</a>)</li>
<li>Fix evaluating <code>global-state</code> in paint
<code>...-pattern</code> properties (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6301">6301</a>)</li>
<li>Fix pan moving in the wrong direction when map is pitched (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6111">#6111</a>)</li>
<li>Fix evaluation of <code>text-color</code> when using
<code>format</code> within <code>step</code> (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/5432">#5833</a>)</li>
<li>Fix regression in <code>mergeSourceDiffs</code>: handle
add/remove/removeAll (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6342">#6342</a>)</li>
<li>Fix evaluating <code>global-state</code> in layout properties
<code>icon-size</code> and <code>text-size</code> (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6308">#6308</a>)</li>
</ul>
<h2>v5.7.0</h2>
<p><a
href="https://github.com/maplibre/maplibre-gl-js">https://github.com/maplibre/maplibre-gl-js</a>
<a
href="https://github.com/maplibre/maplibre-gl-js/compare/v5.6.2...v5.7.0">Changes</a>
since <a
href="https://github.com/maplibre/maplibre-gl-js/releases/tag/v5.6.2">MapLibre
GL JS v5.6.2</a>:</p>
<h3> Features and improvements</h3>
<ul>
<li>Pass document's <code>lang</code> to Tiny-SDF to render Simplified
and Traditional Chinese characters (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6223">#6223</a>)</li>
<li>Enable <code>global-state</code> expressions in layout properties
(<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6209">#6209</a>)</li>
<li>Align typescript types generation with docs generation and avoid
exporting non-exported types (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6217">#6217</a>)</li>
<li>Add <code>coveringTiles</code> method to the public API of the map
object (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6292">#6292</a>)</li>
</ul>
<h3>🐞 Bug fixes</h3>
<ul>
<li>Prevent original input style JSON from being mutated by
<code>Style.set*</code> methods (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6216">#6216</a>)</li>
<li>Fix evaluating <code>global-state</code> in paint properties with
other subexpressions (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6048">#6048</a>)</li>
<li>Fix enabling terrain while transitioning (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6011">#6011</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/maplibre/maplibre-gl-js/blob/main/CHANGELOG.md">maplibre-gl's
changelog</a>.</em></p>
<blockquote>
<h2>5.7.1</h2>
<h3>🐞 Bug fixes</h3>
<ul>
<li>Fix accuracy circle on locate user control (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/5432">#5432</a>)</li>
<li>Fix evaluating <code>global-state</code> in paint
<code>...-pattern</code> properties (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6301">6301</a>)</li>
<li>Fix pan moving in the wrong direction when map is pitched (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6111">#6111</a>)</li>
<li>Fix evaluation of <code>text-color</code> when using
<code>format</code> within <code>step</code> (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/5833">#5833</a>)</li>
<li>Fix regression in <code>mergeSourceDiffs</code>: handle
add/remove/removeAll (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6342">#6342</a>)</li>
<li>Fix evaluating <code>global-state</code> in layout properties
<code>icon-size</code> and <code>text-size</code> (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6308">#6308</a>)</li>
</ul>
<h2>5.7.0</h2>
<h3> Features and improvements</h3>
<ul>
<li>Pass document's <code>lang</code> to Tiny-SDF to render Simplified
and Traditional Chinese characters (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6223">#6223</a>)</li>
<li>Enable <code>global-state</code> expressions in layout properties
(<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6209">#6209</a>)</li>
<li>Align typescript types generation with docs generation and avoid
exporting non-exported types (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6217">#6217</a>)</li>
<li>Add <code>coveringTiles</code> method to the public API of the map
object (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6292">#6292</a>)</li>
</ul>
<h3>🐞 Bug fixes</h3>
<ul>
<li>Prevent original input style JSON from being mutated by
<code>Style.set*</code> methods (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/pull/6216">#6216</a>)</li>
<li>Fix evaluating <code>global-state</code> in paint properties with
other subexpressions (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6048">#6048</a>)</li>
<li>Fix enabling terrain while transitioning (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6011">#6011</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/11ef4f7eab6f9ac9de0d3601f9028f116b1e18d5"><code>11ef4f7</code></a>
Bump version to 5.7.1 (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6354">#6354</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/8f8795fd79a74f957bf0a2e04906eb2f57ca81e3"><code>8f8795f</code></a>
Fixes wrong movement when inertia crosses the horizon (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6345">#6345</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/64f727e79115e6cf769fcaa63f50f4140b20eafe"><code>64f727e</code></a>
chore(deps-dev): bump <code>@​vitest/eslint-plugin</code> in the vitest
group (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6353">#6353</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/a6e4a2353ca73f6be297dfbda5fac979876b1e96"><code>a6e4a23</code></a>
Fix for <code>global-state</code> doesn't work with icon-size/text-size
layout property ...</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/51edebf576724430e1fe65b4cfc5532344ff3867"><code>51edebf</code></a>
Remove coverage upload that was left out (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6351">#6351</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/df7ec4aae7d47204d3033100e760050a776679bd"><code>df7ec4a</code></a>
Fix regression in mergeSourceDiffs: handle add/remove/removeAll (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6342">#6342</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/17f8b576e477da2beb382c1854d34425b8de49cc"><code>17f8b57</code></a>
chore(deps-dev): bump <code>@​typescript-eslint/eslint-plugin</code> (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6350">#6350</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/96f3805f51ea922f804377a74ceb13d0ee3b55be"><code>96f3805</code></a>
chore(deps-dev): bump devtools-protocol from 0.0.1508733 to 0.0.1510016
(<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6346">#6346</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/a0b54a4b3465657f452ad32835b03804083ec7fd"><code>a0b54a4</code></a>
chore(deps): bump ncipollo/release-action from 1.18.0 to 1.20.0 (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6347">#6347</a>)</li>
<li><a
href="https://github.com/maplibre/maplibre-gl-js/commit/ff82f4cd986f109b0c68d155cd3d1a95eab54fff"><code>ff82f4c</code></a>
chore(deps-dev): bump <code>@​typescript-eslint/parser</code> from
8.41.0 to 8.42.0 (<a
href="https://redirect.github.com/maplibre/maplibre-gl-js/issues/6349">#6349</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/maplibre/maplibre-gl-js/compare/v5.6.2...v5.7.1">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=maplibre-gl&package-manager=npm_and_yarn&previous-version=5.6.2&new-version=5.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:20:31 +00:00
dependabot[bot] 0cd4ab6e0a chore(deps-dev): Bump @eslint/js from 9.34.0 to 9.35.0 (#1353)
Bumps
[@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js)
from 9.34.0 to 9.35.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/eslint/eslint/releases"><code>@​eslint/js</code>'s
releases</a>.</em></p>
<blockquote>
<h2>v9.35.0</h2>
<h2>Features</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/42761fa7c872fb9e14c144b692af6967b3662082"><code>42761fa</code></a>
feat: implement suggestions for no-empty-function (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20057">#20057</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/102f44442ac9bf1fcd4ba6ab9fae43ce09199df6"><code>102f444</code></a>
feat: implement suggestions for no-empty-static-block (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20056">#20056</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/e51ffff737ca245b3a1d115cb11e1c99737249a3"><code>e51ffff</code></a>
feat: add <code>preserve-caught-error</code> rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19913">#19913</a>)
(Amnish Singh Arora)</li>
</ul>
<h2>Bug Fixes</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/10e7ae23e30ea0834d9fdeb3a2a1db8103c36cd2"><code>10e7ae2</code></a>
fix: update uncloneable options error message (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20059">#20059</a>)
(soda-sorcery)</li>
<li><a
href="https://github.com/eslint/eslint/commit/bfa46013e7ea9a522c02f72250fa07160f96a6b8"><code>bfa4601</code></a>
fix: ignore empty switch statements with comments in no-empty rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20045">#20045</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dfd11deb24fc733faa5db751a2f615eb04e48b15"><code>dfd11de</code></a>
fix: add <code>before</code> and <code>after</code> to test case types
(<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20049">#20049</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dabbe95c39671c5fa272da012ee1432aa088650f"><code>dabbe95</code></a>
fix: correct types for <code>no-restricted-imports</code> rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20034">#20034</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/ea789c7dd234c1a6be499a4644dd0f5c97615972"><code>ea789c7</code></a>
fix: no-loss-of-precision false positive with uppercase exponent (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20032">#20032</a>)
(sethamus)</li>
</ul>
<h2>Documentation</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/d265515642f65246bcd45c17979f67c2afb12f95"><code>d265515</code></a>
docs: improve phrasing - &quot;if&quot; → &quot;even if&quot; from
getting-started section (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20074">#20074</a>)
(jjangga0214)</li>
<li><a
href="https://github.com/eslint/eslint/commit/a355a0e5b2e6a47cda099b31dc7d112cfb5c4315"><code>a355a0e</code></a>
docs: invert comparison logic for example in <code>no-var</code> doc
page (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20064">#20064</a>)
(OTonGitHub)</li>
<li><a
href="https://github.com/eslint/eslint/commit/5082fc206de6946d9d4c20e57301f78839b3b9f2"><code>5082fc2</code></a>
docs: Update README (GitHub Actions Bot)</li>
<li><a
href="https://github.com/eslint/eslint/commit/99cfd7e056e1703941c9eb8ca1ae7fdb1987ba9d"><code>99cfd7e</code></a>
docs: add missing &quot;the&quot; in rule deprecation docs (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20050">#20050</a>)
(Josh Goldberg )</li>
<li><a
href="https://github.com/eslint/eslint/commit/6ad8973e5d3c94b8e100b7266f55f8eb0757eb00"><code>6ad8973</code></a>
docs: update <code>--no-ignore</code> and <code>--ignore-pattern</code>
documentation (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20036">#20036</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/8033b195299a1eaa4a0ed6553d9e034a457bb577"><code>8033b19</code></a>
docs: add documentation for <code>--no-config-lookup</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20033">#20033</a>)
(Francesco Trotta)</li>
</ul>
<h2>Chores</h2>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/da87f2fe792cab5b69b62bf5c15e69ab4f433087"><code>da87f2f</code></a>
chore: upgrade <code>@​eslint/js</code><a
href="https://github.com/9"><code>@​9</code></a>.35.0 (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20077">#20077</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release
(Jenkins)</li>
<li><a
href="https://github.com/eslint/eslint/commit/70557649e3111c55d8cddf678b6c4079aa6f0ccc"><code>7055764</code></a>
test: remove <code>tests/lib/eslint/eslint.config.js</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20065">#20065</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20069">#20069</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d5ef9397150cc178e1f9891c3ff49ac4871ec786"><code>d5ef939</code></a>
refactor: remove deprecated <code>context.parserOptions</code> usage
across rules (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20060">#20060</a>)
(sethamus)</li>
<li><a
href="https://github.com/eslint/eslint/commit/1b3881d7e859bec9589e39888656c33c914a8302"><code>1b3881d</code></a>
chore: remove redundant word (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20058">#20058</a>)
(pxwanglu)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/eslint/eslint/blob/main/CHANGELOG.md"><code>@​eslint/js</code>'s
changelog</a>.</em></p>
<blockquote>
<p>v9.35.0 - September 5, 2025</p>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/da87f2fe792cab5b69b62bf5c15e69ab4f433087"><code>da87f2f</code></a>
chore: upgrade <code>@​eslint/js</code><a
href="https://github.com/9"><code>@​9</code></a>.35.0 (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20077">#20077</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release
(Jenkins)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d265515642f65246bcd45c17979f67c2afb12f95"><code>d265515</code></a>
docs: improve phrasing - &quot;if&quot; → &quot;even if&quot; from
getting-started section (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20074">#20074</a>)
(jjangga0214)</li>
<li><a
href="https://github.com/eslint/eslint/commit/70557649e3111c55d8cddf678b6c4079aa6f0ccc"><code>7055764</code></a>
test: remove <code>tests/lib/eslint/eslint.config.js</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20065">#20065</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/10e7ae23e30ea0834d9fdeb3a2a1db8103c36cd2"><code>10e7ae2</code></a>
fix: update uncloneable options error message (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20059">#20059</a>)
(soda-sorcery)</li>
<li><a
href="https://github.com/eslint/eslint/commit/42761fa7c872fb9e14c144b692af6967b3662082"><code>42761fa</code></a>
feat: implement suggestions for no-empty-function (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20057">#20057</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/102f44442ac9bf1fcd4ba6ab9fae43ce09199df6"><code>102f444</code></a>
feat: implement suggestions for no-empty-static-block (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20056">#20056</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20069">#20069</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/a355a0e5b2e6a47cda099b31dc7d112cfb5c4315"><code>a355a0e</code></a>
docs: invert comparison logic for example in <code>no-var</code> doc
page (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20064">#20064</a>)
(OTonGitHub)</li>
<li><a
href="https://github.com/eslint/eslint/commit/e51ffff737ca245b3a1d115cb11e1c99737249a3"><code>e51ffff</code></a>
feat: add <code>preserve-caught-error</code> rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/19913">#19913</a>)
(Amnish Singh Arora)</li>
<li><a
href="https://github.com/eslint/eslint/commit/5082fc206de6946d9d4c20e57301f78839b3b9f2"><code>5082fc2</code></a>
docs: Update README (GitHub Actions Bot)</li>
<li><a
href="https://github.com/eslint/eslint/commit/d5ef9397150cc178e1f9891c3ff49ac4871ec786"><code>d5ef939</code></a>
refactor: remove deprecated <code>context.parserOptions</code> usage
across rules (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20060">#20060</a>)
(sethamus)</li>
<li><a
href="https://github.com/eslint/eslint/commit/1b3881d7e859bec9589e39888656c33c914a8302"><code>1b3881d</code></a>
chore: remove redundant word (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20058">#20058</a>)
(pxwanglu)</li>
<li><a
href="https://github.com/eslint/eslint/commit/99cfd7e056e1703941c9eb8ca1ae7fdb1987ba9d"><code>99cfd7e</code></a>
docs: add missing &quot;the&quot; in rule deprecation docs (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20050">#20050</a>)
(Josh Goldberg )</li>
<li><a
href="https://github.com/eslint/eslint/commit/bfa46013e7ea9a522c02f72250fa07160f96a6b8"><code>bfa4601</code></a>
fix: ignore empty switch statements with comments in no-empty rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20045">#20045</a>)
(jaymarvelz)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dfd11deb24fc733faa5db751a2f615eb04e48b15"><code>dfd11de</code></a>
fix: add <code>before</code> and <code>after</code> to test case types
(<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20049">#20049</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/6ad8973e5d3c94b8e100b7266f55f8eb0757eb00"><code>6ad8973</code></a>
docs: update <code>--no-ignore</code> and <code>--ignore-pattern</code>
documentation (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20036">#20036</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/dabbe95c39671c5fa272da012ee1432aa088650f"><code>dabbe95</code></a>
fix: correct types for <code>no-restricted-imports</code> rule (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20034">#20034</a>)
(Milos Djermanovic)</li>
<li><a
href="https://github.com/eslint/eslint/commit/8033b195299a1eaa4a0ed6553d9e034a457bb577"><code>8033b19</code></a>
docs: add documentation for <code>--no-config-lookup</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20033">#20033</a>)
(Francesco Trotta)</li>
<li><a
href="https://github.com/eslint/eslint/commit/ea789c7dd234c1a6be499a4644dd0f5c97615972"><code>ea789c7</code></a>
fix: no-loss-of-precision false positive with uppercase exponent (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20032">#20032</a>)
(sethamus)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/eslint/eslint/commit/af2a0870fdc646091d027516601888923e5bc202"><code>af2a087</code></a>
chore: package.json update for <code>@​eslint/js</code> release</li>
<li><a
href="https://github.com/eslint/eslint/commit/84ffb9680b15e45bfd8c8a5db4731576ddd16fc4"><code>84ffb96</code></a>
chore: update <code>@eslint-community/eslint-utils</code> (<a
href="https://github.com/eslint/eslint/tree/HEAD/packages/js/issues/20069">#20069</a>)</li>
<li>See full diff in <a
href="https://github.com/eslint/eslint/commits/v9.35.0/packages/js">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=@eslint/js&package-manager=npm_and_yarn&previous-version=9.34.0&new-version=9.35.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:19:36 +00:00
dependabot[bot] fce182050d chore(deps-dev): Bump uuid from 11.1.0 to 12.0.0 (#1352)
Bumps [uuid](https://github.com/uuidjs/uuid) from 11.1.0 to 12.0.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/uuidjs/uuid/releases">uuid's
releases</a>.</em></p>
<blockquote>
<h2>v12.0.0</h2>
<h2><a
href="https://github.com/uuidjs/uuid/compare/v11.1.0...v12.0.0">12.0.0</a>
(2025-09-05)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>update to typescript@5.2 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/887">#887</a>)</li>
<li>remove CommonJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/886">#886</a>)</li>
<li>drop node@16 support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/883">#883</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add node@24 to ci matrix (<a
href="https://redirect.github.com/uuidjs/uuid/issues/879">#879</a>) (<a
href="https://github.com/uuidjs/uuid/commit/42b6178aa21a593257f0a72abacd220f0b7b8a92">42b6178</a>)</li>
<li>drop node@16 support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/883">#883</a>) (<a
href="https://github.com/uuidjs/uuid/commit/0f38cf10366ab074f9328ae2021eea04d5f2e530">0f38cf1</a>)</li>
<li>remove CommonJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/886">#886</a>) (<a
href="https://github.com/uuidjs/uuid/commit/ae786e27265f50bcf7cead196c29f1869297c42f">ae786e2</a>)</li>
<li>update to typescript@5.2 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/887">#887</a>) (<a
href="https://github.com/uuidjs/uuid/commit/c7ee40598ed78584d81ab78dffded9fe5ff20b01">c7ee405</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>improve v4() performance (<a
href="https://redirect.github.com/uuidjs/uuid/issues/894">#894</a>) (<a
href="https://github.com/uuidjs/uuid/commit/5fd974c12718c8848035650b69b8948f12ace197">5fd974c</a>)</li>
<li>restore node: prefix (<a
href="https://redirect.github.com/uuidjs/uuid/issues/889">#889</a>) (<a
href="https://github.com/uuidjs/uuid/commit/e1f42a354593093ba0479f0b4047dae82d28c507">e1f42a3</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/uuidjs/uuid/blob/main/CHANGELOG.md">uuid's
changelog</a>.</em></p>
<blockquote>
<h2><a
href="https://github.com/uuidjs/uuid/compare/v11.1.0...v12.0.0">12.0.0</a>
(2025-09-05)</h2>
<h3>⚠ BREAKING CHANGES</h3>
<ul>
<li>update to typescript@5.2 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/887">#887</a>)</li>
<li>remove CommonJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/886">#886</a>)</li>
<li>drop node@16 support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/883">#883</a>)</li>
</ul>
<h3>Features</h3>
<ul>
<li>add node@24 to ci matrix (<a
href="https://redirect.github.com/uuidjs/uuid/issues/879">#879</a>) (<a
href="https://github.com/uuidjs/uuid/commit/42b6178aa21a593257f0a72abacd220f0b7b8a92">42b6178</a>)</li>
<li>drop node@16 support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/883">#883</a>) (<a
href="https://github.com/uuidjs/uuid/commit/0f38cf10366ab074f9328ae2021eea04d5f2e530">0f38cf1</a>)</li>
<li>remove CommonJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/886">#886</a>) (<a
href="https://github.com/uuidjs/uuid/commit/ae786e27265f50bcf7cead196c29f1869297c42f">ae786e2</a>)</li>
<li>update to typescript@5.2 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/887">#887</a>) (<a
href="https://github.com/uuidjs/uuid/commit/c7ee40598ed78584d81ab78dffded9fe5ff20b01">c7ee405</a>)</li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>improve v4() performance (<a
href="https://redirect.github.com/uuidjs/uuid/issues/894">#894</a>) (<a
href="https://github.com/uuidjs/uuid/commit/5fd974c12718c8848035650b69b8948f12ace197">5fd974c</a>)</li>
<li>restore node: prefix (<a
href="https://redirect.github.com/uuidjs/uuid/issues/889">#889</a>) (<a
href="https://github.com/uuidjs/uuid/commit/e1f42a354593093ba0479f0b4047dae82d28c507">e1f42a3</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/uuidjs/uuid/commit/7844bc2cd98d171bf631965047bb267505e25318"><code>7844bc2</code></a>
chore(main): release 12.0.0 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/880">#880</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/a2b46035d3f3149832e73c41bd8e34c88d8259c0"><code>a2b4603</code></a>
chore: npm run docs (<a
href="https://redirect.github.com/uuidjs/uuid/issues/898">#898</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/744a4a8c6c93beec6d60a0f36e7c5d609750e548"><code>744a4a8</code></a>
docs: add motivation for dropping CJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/897">#897</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/3c9acd5dbf6b21697bea1bc1dc7f91823ce9c439"><code>3c9acd5</code></a>
docs: fix CHANGELOG links. fixes <a
href="https://redirect.github.com/uuidjs/uuid/issues/871">#871</a> (<a
href="https://redirect.github.com/uuidjs/uuid/issues/896">#896</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/5fd974c12718c8848035650b69b8948f12ace197"><code>5fd974c</code></a>
fix: improve v4() performance (<a
href="https://redirect.github.com/uuidjs/uuid/issues/894">#894</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/330ee3b85c917b01feed7ed12a413ea5a6952139"><code>330ee3b</code></a>
chore: minor example and benchmark cleanup (<a
href="https://redirect.github.com/uuidjs/uuid/issues/893">#893</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/caea88991ca7bfe0bd5b1cc15b19782e7b6f456d"><code>caea889</code></a>
chore: fix bug report form</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/e1f42a354593093ba0479f0b4047dae82d28c507"><code>e1f42a3</code></a>
fix: restore node: prefix (<a
href="https://redirect.github.com/uuidjs/uuid/issues/889">#889</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/c7ee40598ed78584d81ab78dffded9fe5ff20b01"><code>c7ee405</code></a>
feat!: update to typescript@5.2 (<a
href="https://redirect.github.com/uuidjs/uuid/issues/887">#887</a>)</li>
<li><a
href="https://github.com/uuidjs/uuid/commit/ae786e27265f50bcf7cead196c29f1869297c42f"><code>ae786e2</code></a>
feat!: remove CommonJS support (<a
href="https://redirect.github.com/uuidjs/uuid/issues/886">#886</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/uuidjs/uuid/compare/v11.1.0...v12.0.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=uuid&package-manager=npm_and_yarn&previous-version=11.1.0&new-version=12.0.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-08 13:19:02 +00:00
Harel M abe6230932 Move style and store initialization to mount method (#1351)
This is in order to reduce warnings in the console for React 19 usage.
This removes the deprecated defaultProp and also move all the store
initialization logic out of the App.tsx file, keeping it a lot more
clean.
It removes the `debug` flag from the supported urls along with the
`localport` and `localhost`, which I'm not sure if and how they were
ever used.
The tests are using the `style` url, so I think it is covered in terms
of tests.
It also improves some typings along the project.
It removes some callbacks from the code and moves to use promises.

## Launch Checklist

 - [x] Briefly describe the changes in this PR.
- [x] Include before/after visuals or gifs if this PR includes visual
changes.
 - [x] Write tests for all new functionality.
 - [ ] Add an entry to `CHANGELOG.md` under the `## main` section.


Before:
<img width="1263" height="439" alt="image"
src="https://github.com/user-attachments/assets/1988c4f7-39de-4fd2-b6da-b4736abc0441"
/>

After:
<img width="1263" height="203" alt="image"
src="https://github.com/user-attachments/assets/28079e6d-9de7-40a1-9869-01a0876ca79f"
/>

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Bart Louwers <bart.louwers@gmail.com>
2025-09-08 15:22:29 +03:00
35 changed files with 738 additions and 586 deletions
+23 -17
View File
@@ -7,17 +7,7 @@ on:
branches: [ main ]
jobs:
build-docker:
name: build docker
runs-on: ubuntu-latest
if: ${{ github.event_name == 'push' || github.event_name == 'pull_request' }}
steps:
- uses: actions/checkout@v5
- run: docker build -t test-docker-image-build .
# build the editor
build-node:
name: "build on ${{ matrix.os }}"
runs-on: ${{ matrix.os }}
@@ -89,13 +79,9 @@ jobs:
path: ./desktop/bin/windows/
e2e-tests:
name: "E2E tests using ${{ matrix.browser }}"
strategy:
fail-fast: false
matrix:
browser: [ chrome ]
name: "E2E tests using chrome"
runs-on: ubuntu-22.04
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
@@ -105,7 +91,27 @@ jobs:
with:
build: npm run build
start: npm run start
browser: ${{ matrix.browser }}
browser: chrome
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
files: ${{ github.workspace }}/.nyc_output/out.json
verbose: true
e2e-tests-docker:
name: "E2E tests using chrome and docker"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v5
- run: npm ci
- name: Cypress run
uses: cypress-io/github-action@v6
with:
build: docker build -t maputnik .
start: docker run --rm --network host maputnik --port=8888
browser: chrome
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v5
with:
+12 -2
View File
@@ -1,5 +1,14 @@
## main
### ✨ Features and improvements
- _...Add new stuff here..._
### 🐞 Bug fixes
- _...Add new stuff here..._
## 3.0.0
### ✨ Features and improvements
- Fix radio/delete filter buttons styling regression
- Add german translation
@@ -17,7 +26,9 @@
- Refactor Field components to use arrow function syntax
- Replace react-autocomplete with Downshift in the autocomplete component
- Add LocationIQ as supported map provider with access token field and gallery style
- _...Add new stuff here..._
- Use maputnik go binary for the docker image to allow file watching
- Revmove support for `debug` and `localport` url parameters
- Replace react-sortable-hoc with dnd-kit to avoid react console warnings and also use a maintained library
### 🐞 Bug fixes
@@ -25,7 +36,6 @@
- Show an error when adding a layer with a duplicate ID
- Replace deprecated `ReactDOM.render` usage with `createRoot` and drop the
`DOMNodeRemoved` cleanup hack
- _...Add new stuff here..._
## 2.1.1
+8 -10
View File
@@ -1,16 +1,14 @@
FROM node:22 as builder
FROM golang:1.23-alpine AS builder
WORKDIR /maputnik
# Only copy package.json to prevent npm install from running on every build
COPY package.json package-lock.json .npmrc ./
RUN npm ci
RUN apk add --no-cache nodejs npm make git gcc g++ libc-dev
# Build maputnik
COPY . .
RUN npx vite build
RUN npm ci
RUN CGO_ENABLED=1 GOOS=linux npm run build-linux
#---------------------------------------------------------------------------
# Create a clean nginx-alpine slim image with just the build results
FROM nginx:alpine-slim
COPY --from=builder /maputnik/dist /usr/share/nginx/html/
FROM alpine:latest
WORKDIR /app
COPY --from=builder /maputnik/desktop/bin/linux ./
ENTRYPOINT ["/app/maputnik"]
+7 -1
View File
@@ -18,9 +18,15 @@ targeted at developers and map designers.
- In a Docker, run this command and browse to http://localhost:8888, Ctrl+C to stop the server.
```bash
docker run -it --rm -p 8888:80 ghcr.io/maplibre/maputnik:main
docker run -it --rm -p 8888:8000 ghcr.io/maplibre/maputnik:main
```
To see the CLI options (for example file watching or style serving) run:
```bash
docker run -it --rm -p 8888:8000 ghcr.io/maplibre/maputnik:main --help
```
You might need to mount a volume (`-v`) to be able to use these options.
## Documentation
The documentation can be found in the [Wiki](https://github.com/maplibre/maputnik/wiki). You are welcome to collaborate!
-1
View File
@@ -16,7 +16,6 @@ describe("history", () => {
it("undo/redo", () => {
when.setStyle("geojson");
when.modal.open();
then(get.styleFromLocalStorage()).shouldDeepNestedInclude({ layers: [] });
when.modal.fillLayers({
id: "step 1",
+89 -4
View File
@@ -378,8 +378,57 @@ describe("layers", () => {
});
it("groups", () => {
// TODO
// Click each of the layer groups.
when.modal.open();
const id1 = when.modal.fillLayers({
id: "aa",
type: "line",
layer: "example",
});
when.modal.open();
const id2 = when.modal.fillLayers({
id: "aa-2",
type: "line",
layer: "example",
});
when.modal.open();
const id3 = when.modal.fillLayers({
id: "b",
type: "line",
layer: "example",
});
then(get.elementByTestId("layer-list-item:" + id1)).shouldBeVisible();
then(get.elementByTestId("layer-list-item:" + id2)).shouldNotBeVisible();
then(get.elementByTestId("layer-list-item:" + id3)).shouldBeVisible();
when.click("layer-list-group:aa-0");
then(get.elementByTestId("layer-list-item:" + id1)).shouldBeVisible();
then(get.elementByTestId("layer-list-item:" + id2)).shouldBeVisible();
then(get.elementByTestId("layer-list-item:" + id3)).shouldBeVisible();
when.click("layer-list-item:" + id2);
when.click("skip-target-layer-editor");
when.click("menu-move-layer-down");
then(get.elementByTestId("layer-list-group:aa-0")).shouldNotExist();
then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
layers: [
{
id: "aa",
type: "line",
source: "example",
},
{
id: "b",
type: "line",
source: "example",
},
{
id: "aa-2",
type: "line",
source: "example",
},
],
});
});
});
@@ -495,9 +544,7 @@ describe("layers", () => {
});
});
describe("layereditor jsonlint should error", ()=>{
it("add", () => {
const id = when.modal.fillLayers({
type: "circle",
@@ -523,4 +570,42 @@ describe("layers", () => {
error.should('exist');
});
});
describe("drag and drop", () => {
it("move layer should update local storage", () => {
when.modal.open();
const firstId = when.modal.fillLayers({
id: "a",
type: "background",
});
when.modal.open();
const secondId = when.modal.fillLayers({
id: "b",
type: "background",
});
when.modal.open();
const thirdId = when.modal.fillLayers({
id: "c",
type: "background",
});
when.dragAndDrop(get.elementByTestId("layer-list-item:" + firstId), get.elementByTestId("layer-list-item:" + thirdId));
then(get.styleFromLocalStorage()).shouldDeepNestedInclude({
layers: [
{
id: secondId,
type: "background",
},
{
id: thirdId,
type: "background",
},
{
id: firstId,
type: "background",
},
],
});
});
});
});
+10 -10
View File
@@ -94,8 +94,8 @@ export class MaputnikDriver {
public when = {
...this.helper.when,
modal: this.modalDriver.when,
within: (selector: string, fn: () => void) => {
this.helper.when.within(fn, selector);
doWithin: (selector: string, fn: () => void) => {
this.helper.when.doWithin(fn, selector);
},
tab: () => this.helper.get.element("body").tab(),
waitForExampleFileResponse: () => {
@@ -110,25 +110,25 @@ export class MaputnikDriver {
styleProperties: "geojson" | "raster" | "both" | "layer" | "",
zoom?: number
) => {
let url = "?debug";
const url = new URL(baseUrl);
switch (styleProperties) {
case "geojson":
url += `&style=${baseUrl}geojson-style.json`;
url.searchParams.set("style", baseUrl + "geojson-style.json");
break;
case "raster":
url += `&style=${baseUrl}raster-style.json`;
url.searchParams.set("style", baseUrl + "raster-style.json");
break;
case "both":
url += `&style=${baseUrl}geojson-raster-style.json`;
url.searchParams.set("style", baseUrl + "geojson-raster-style.json");
break;
case "layer":
url += `&style=${baseUrl}/example-layer-style.json`;
url.searchParams.set("style", baseUrl + "example-layer-style.json");
break;
}
if (zoom) {
url += `#${zoom}/41.3805/2.1635`;
url.hash = `${zoom}/41.3805/2.1635`;
}
this.helper.when.visit(baseUrl + url);
this.helper.when.visit(url.toString());
if (styleProperties) {
this.helper.when.acceptConfirm();
}
@@ -145,7 +145,7 @@ export class MaputnikDriver {
},
selectWithin: (selector: string, value: string) => {
this.when.within(selector, () => {
this.when.doWithin(selector, () => {
this.helper.get.element("select").select(value);
});
},
+2 -2
View File
@@ -20,8 +20,8 @@ export default class ModalDriver {
this.helper.when.type("add-layer.layer-id.input", id);
if (layer) {
this.helper.when.within(() => {
this.helper.get.element("input").type(layer!);
this.helper.when.doWithin(() => {
this.helper.get.element("input").clear().type(layer!);
}, "add-layer.layer-source-block");
}
this.helper.when.click("add-layer");
+5 -2
View File
@@ -2,8 +2,7 @@ SOURCEDIR=.
SOURCES := $(shell find $(SOURCEDIR) -name '*.go')
BINARY=maputnik
VERSION := $(shell node -p "require('../package.json').version")
GOPATH := $(if $(GOPATH),$(GOPATH),$(HOME)/go)
GOBIN := $(if $(GOBIN),$(GOBIN),$(HOME)/go/bin)
GOBIN := $(or $(shell if [ -d /go/bin ]; then echo "/go/bin"; fi),$(HOME)/go/bin)
all: $(BINARY)
@@ -11,6 +10,10 @@ $(BINARY): $(GOBIN)/gox $(GOBIN)/go-winres $(SOURCES) version.go rice-box.go win
$(GOBIN)/go-winres make --product-version=$(VERSION)
$(GOBIN)/gox -osarch "windows/amd64 linux/amd64 darwin/amd64" -output "bin/{{.OS}}/${BINARY}"
bin/linux/$(BINARY): $(GOBIN)/gox $(GOBIN)/go-winres $(SOURCES) version.go rice-box.go winres/winres.json
$(GOBIN)/go-winres make --product-version=$(VERSION)
$(GOBIN)/gox -osarch "linux/amd64" -output "bin/{{.OS}}/${BINARY}"
winres/winres.json: winres/winres_template.json
sed 's/{{.Version}}/$(VERSION)/g' winres/winres_template.json > $@
+1 -2
View File
@@ -5,8 +5,7 @@ import (
"net/http"
"os"
"path/filepath"
"github.com/GeertJohan/go.rice"
"github.com/GeertJohan/go.rice"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"github.com/maputnik/desktop/filewatch"
+187 -153
View File
@@ -1,14 +1,17 @@
{
"name": "maputnik",
"version": "2.1.1",
"version": "3.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "maputnik",
"version": "2.1.1",
"version": "3.0.0",
"license": "MIT",
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@mapbox/mapbox-gl-rtl-text": "^0.3.0",
"@maplibre/maplibre-gl-geocoder": "^1.9.0",
"@maplibre/maplibre-gl-inspect": "^1.7.1",
@@ -37,7 +40,7 @@
"lodash.get": "^4.4.2",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"maplibre-gl": "^5.6.2",
"maplibre-gl": "^5.7.1",
"maputnik-design": "github:maputnik/design#172b06c",
"ol": "^10.6.1",
"ol-mapbox-style": "^13.1.0",
@@ -54,7 +57,6 @@
"react-i18next": "^15.7.3",
"react-icon-base": "^2.1.2",
"react-icons": "^5.5.0",
"react-sortable-hoc": "^2.0.0",
"reconnecting-websocket": "^4.4.0",
"slugify": "^1.6.6",
"string-hash": "^1.1.3",
@@ -62,7 +64,7 @@
},
"devDependencies": {
"@cypress/code-coverage": "^3.14.6",
"@eslint/js": "^9.34.0",
"@eslint/js": "^9.35.0",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@rollup/plugin-replace": "^6.0.2",
"@shellygo/cypress-test-utils": "^6.0.1",
@@ -94,7 +96,7 @@
"cors": "^2.8.5",
"cypress": "^15.1.0",
"cypress-plugin-tab": "^1.0.5",
"eslint": "^9.34.0",
"eslint": "^9.35.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
@@ -103,14 +105,14 @@
"istanbul-lib-coverage": "^3.2.2",
"postcss": "^8.5.6",
"react-hot-loader": "^4.13.1",
"sass": "^1.92.0",
"stylelint": "^16.23.1",
"sass": "^1.92.1",
"stylelint": "^16.24.0",
"stylelint-config-recommended-scss": "^16.0.0",
"stylelint-scss": "^6.12.1",
"typescript": "^5.8.3",
"typescript-eslint": "^8.42.0",
"uuid": "^11.1.0",
"vite": "^7.1.4",
"typescript-eslint": "^8.43.0",
"uuid": "^13.0.0",
"vite": "^7.1.5",
"vite-plugin-istanbul": "^7.1.0"
}
},
@@ -698,6 +700,59 @@
"ms": "^2.1.1"
}
},
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
"integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/core": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
"integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
"license": "MIT",
"dependencies": {
"@dnd-kit/accessibility": "^3.1.1",
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@dnd-kit/sortable": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
"integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==",
"license": "MIT",
"dependencies": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.3.0",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
"license": "MIT",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@dual-bundle/import-meta-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
@@ -1135,9 +1190,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.7.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz",
"integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==",
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1284,9 +1339,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.34.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.34.0.tgz",
"integrity": "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw==",
"version": "9.35.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
"integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3277,17 +3332,17 @@
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.42.0.tgz",
"integrity": "sha512-Aq2dPqsQkxHOLfb2OPv43RnIvfj05nw8v/6n3B2NABIPpHnjQnaLo9QGMTvml+tv4korl/Cjfrb/BYhoL8UUTQ==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.43.0.tgz",
"integrity": "sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.42.0",
"@typescript-eslint/type-utils": "8.42.0",
"@typescript-eslint/utils": "8.42.0",
"@typescript-eslint/visitor-keys": "8.42.0",
"@typescript-eslint/scope-manager": "8.43.0",
"@typescript-eslint/type-utils": "8.43.0",
"@typescript-eslint/utils": "8.43.0",
"@typescript-eslint/visitor-keys": "8.43.0",
"graphemer": "^1.4.0",
"ignore": "^7.0.0",
"natural-compare": "^1.4.0",
@@ -3301,7 +3356,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.42.0",
"@typescript-eslint/parser": "^8.43.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
@@ -3317,16 +3372,16 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.42.0.tgz",
"integrity": "sha512-r1XG74QgShUgXph1BYseJ+KZd17bKQib/yF3SR+demvytiRXrwd12Blnz5eYGm8tXaeRdd4x88MlfwldHoudGg==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.43.0.tgz",
"integrity": "sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/scope-manager": "8.42.0",
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/typescript-estree": "8.42.0",
"@typescript-eslint/visitor-keys": "8.42.0",
"@typescript-eslint/scope-manager": "8.43.0",
"@typescript-eslint/types": "8.43.0",
"@typescript-eslint/typescript-estree": "8.43.0",
"@typescript-eslint/visitor-keys": "8.43.0",
"debug": "^4.3.4"
},
"engines": {
@@ -3342,14 +3397,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.42.0.tgz",
"integrity": "sha512-vfVpLHAhbPjilrabtOSNcUDmBboQNrJUiNAGoImkZKnMjs2TIcWG33s4Ds0wY3/50aZmTMqJa6PiwkwezaAklg==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.43.0.tgz",
"integrity": "sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.42.0",
"@typescript-eslint/types": "^8.42.0",
"@typescript-eslint/tsconfig-utils": "^8.43.0",
"@typescript-eslint/types": "^8.43.0",
"debug": "^4.3.4"
},
"engines": {
@@ -3364,14 +3419,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.42.0.tgz",
"integrity": "sha512-51+x9o78NBAVgQzOPd17DkNTnIzJ8T/O2dmMBLoK9qbY0Gm52XJcdJcCl18ExBMiHo6jPMErUQWUv5RLE51zJw==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.43.0.tgz",
"integrity": "sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/visitor-keys": "8.42.0"
"@typescript-eslint/types": "8.43.0",
"@typescript-eslint/visitor-keys": "8.43.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3382,9 +3437,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.42.0.tgz",
"integrity": "sha512-kHeFUOdwAJfUmYKjR3CLgZSglGHjbNTi1H8sTYRYV2xX6eNz4RyJ2LIgsDLKf8Yi0/GL1WZAC/DgZBeBft8QAQ==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.43.0.tgz",
"integrity": "sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3399,15 +3454,15 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.42.0.tgz",
"integrity": "sha512-9KChw92sbPTYVFw3JLRH1ockhyR3zqqn9lQXol3/YbI6jVxzWoGcT3AsAW0mu1MY0gYtsXnUGV/AKpkAj5tVlQ==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.43.0.tgz",
"integrity": "sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/typescript-estree": "8.42.0",
"@typescript-eslint/utils": "8.42.0",
"@typescript-eslint/types": "8.43.0",
"@typescript-eslint/typescript-estree": "8.43.0",
"@typescript-eslint/utils": "8.43.0",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
},
@@ -3424,9 +3479,9 @@
}
},
"node_modules/@typescript-eslint/types": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.42.0.tgz",
"integrity": "sha512-LdtAWMiFmbRLNP7JNeY0SqEtJvGMYSzfiWBSmx+VSZ1CH+1zyl8Mmw1TT39OrtsRvIYShjJWzTDMPWZJCpwBlw==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.43.0.tgz",
"integrity": "sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3438,16 +3493,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.42.0.tgz",
"integrity": "sha512-ku/uYtT4QXY8sl9EDJETD27o3Ewdi72hcXg1ah/kkUgBvAYHLwj2ofswFFNXS+FL5G+AGkxBtvGt8pFBHKlHsQ==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.43.0.tgz",
"integrity": "sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.42.0",
"@typescript-eslint/tsconfig-utils": "8.42.0",
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/visitor-keys": "8.42.0",
"@typescript-eslint/project-service": "8.43.0",
"@typescript-eslint/tsconfig-utils": "8.43.0",
"@typescript-eslint/types": "8.43.0",
"@typescript-eslint/visitor-keys": "8.43.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -3467,16 +3522,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.42.0.tgz",
"integrity": "sha512-JnIzu7H3RH5BrKC4NoZqRfmjqCIS1u3hGZltDYJgkVdqAezl4L9d1ZLw+36huCujtSBSAirGINF/S4UxOcR+/g==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.43.0.tgz",
"integrity": "sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
"@typescript-eslint/scope-manager": "8.42.0",
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/typescript-estree": "8.42.0"
"@typescript-eslint/scope-manager": "8.43.0",
"@typescript-eslint/types": "8.43.0",
"@typescript-eslint/typescript-estree": "8.43.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3491,13 +3546,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.42.0.tgz",
"integrity": "sha512-3WbiuzoEowaEn8RSnhJBrxSwX8ULYE9CXaPepS2C2W3NSA5NNIvBaslpBSBElPq0UGr0xVJlXFWOAKIkyylydQ==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.43.0.tgz",
"integrity": "sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.42.0",
"@typescript-eslint/types": "8.43.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -3779,6 +3834,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/array-move/-/array-move-4.0.0.tgz",
"integrity": "sha512-+RY54S8OuVvg94THpneQvFRmqWdAHeqtMzgMW6JNurHxe8rsS07cHQdfGkXnTUXiBcyZ0j3SiDIxxj0RPiqCkQ==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
@@ -4246,20 +4302,20 @@
}
},
"node_modules/cacheable": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.3.tgz",
"integrity": "sha512-M6p10iJ/VT0wT7TLIGUnm958oVrU2cUK8pQAVU21Zu7h8rbk/PeRtRWrvHJBql97Bhzk3g1N6+2VKC+Rjxna9Q==",
"version": "1.10.4",
"resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz",
"integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==",
"dev": true,
"license": "MIT",
"dependencies": {
"hookified": "^1.10.0",
"keyv": "^5.4.0"
"hookified": "^1.11.0",
"keyv": "^5.5.0"
}
},
"node_modules/cacheable/node_modules/keyv": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.4.0.tgz",
"integrity": "sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==",
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz",
"integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5770,19 +5826,19 @@
}
},
"node_modules/eslint": {
"version": "9.34.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.34.0.tgz",
"integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==",
"version": "9.35.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
"integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.0",
"@eslint/config-helpers": "^0.3.1",
"@eslint/core": "^0.15.2",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.34.0",
"@eslint/js": "9.35.0",
"@eslint/plugin-kit": "^0.3.5",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
@@ -6811,9 +6867,10 @@
}
},
"node_modules/gl-matrix": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
"integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.4.tgz",
"integrity": "sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==",
"license": "MIT"
},
"node_modules/glob": {
"version": "5.0.15",
@@ -7235,9 +7292,9 @@
}
},
"node_modules/hookified": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.11.0.tgz",
"integrity": "sha512-aDdIN3GyU5I6wextPplYdfmWCo+aLmjjVbntmX6HLD5RCi/xKsivYEBhnRD+d9224zFf008ZpLMPlWF0ZodYZw==",
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz",
"integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==",
"dev": true,
"license": "MIT"
},
@@ -7568,14 +7625,6 @@
"node": ">= 0.4"
}
},
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/is-array-buffer": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -9058,9 +9107,9 @@
"license": "BSD-2-Clause"
},
"node_modules/maplibre-gl": {
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.6.2.tgz",
"integrity": "sha512-SEqYThhUCFf6Lm0TckpgpKnto5u4JsdPYdFJb6g12VtuaFsm3nYdBO+fOmnUYddc8dXihgoGnuXvPPooUcRv5w==",
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-5.7.1.tgz",
"integrity": "sha512-iCOQB6W/EGgQx8aU4SyfU5a5/GR2E+ELF92NMsqYfs3x+vnY+8mARmz4gor6XZHCz3tv19mnotVDRlRTMNKyGw==",
"license": "BSD-3-Clause",
"dependencies": {
"@mapbox/geojson-rewind": "^0.5.2",
@@ -9077,7 +9126,7 @@
"@types/supercluster": "^7.1.3",
"earcut": "^3.0.2",
"geojson-vt": "^4.0.2",
"gl-matrix": "^3.4.3",
"gl-matrix": "^3.4.4",
"kdbush": "^4.0.2",
"murmurhash-js": "^1.0.0",
"pbf": "^4.0.1",
@@ -10898,21 +10947,6 @@
"react-dom": ">=16.8"
}
},
"node_modules/react-sortable-hoc": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-2.0.0.tgz",
"integrity": "sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==",
"dependencies": {
"@babel/runtime": "^7.2.0",
"invariant": "^2.2.4",
"prop-types": "^15.5.7"
},
"peerDependencies": {
"prop-types": "^15.5.7",
"react": "^16.3.0 || ^17.0.0",
"react-dom": "^16.3.0 || ^17.0.0"
}
},
"node_modules/reactcss": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/reactcss/-/reactcss-1.2.3.tgz",
@@ -11355,9 +11389,9 @@
"dev": true
},
"node_modules/sass": {
"version": "1.92.0",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.92.0.tgz",
"integrity": "sha512-KDNI0BxgIRDAfJgzNm5wuy+4yOCIZyrUbjSpiU/JItfih+KGXAVefKL53MTml054MmBA3DDKIBMSI/7XLxZJ3A==",
"version": "1.92.1",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz",
"integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -11973,9 +12007,9 @@
}
},
"node_modules/stylelint": {
"version": "16.23.1",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz",
"integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==",
"version": "16.24.0",
"resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.24.0.tgz",
"integrity": "sha512-7ksgz3zJaSbTUGr/ujMXvLVKdDhLbGl3R/3arNudH7z88+XZZGNLMTepsY28WlnvEFcuOmUe7fg40Q3lfhOfSQ==",
"dev": true,
"funding": [
{
@@ -12002,7 +12036,7 @@
"debug": "^4.4.1",
"fast-glob": "^3.3.3",
"fastest-levenshtein": "^1.0.16",
"file-entry-cache": "^10.1.3",
"file-entry-cache": "^10.1.4",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
@@ -12137,25 +12171,25 @@
}
},
"node_modules/stylelint/node_modules/file-entry-cache": {
"version": "10.1.3",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.3.tgz",
"integrity": "sha512-D+w75Ub8T55yor7fPgN06rkCAUbAYw2vpxJmmjv/GDAcvCnv9g7IvHhIZoxzRZThrXPFI2maeY24pPbtyYU7Lg==",
"version": "10.1.4",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.4.tgz",
"integrity": "sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA==",
"dev": true,
"license": "MIT",
"dependencies": {
"flat-cache": "^6.1.12"
"flat-cache": "^6.1.13"
}
},
"node_modules/stylelint/node_modules/flat-cache": {
"version": "6.1.12",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.12.tgz",
"integrity": "sha512-U+HqqpZPPXP5d24bWuRzjGqVqUcw64k4nZAbruniDwdRg0H10tvN7H6ku1tjhA4rg5B9GS3siEvwO2qjJJ6f8Q==",
"version": "6.1.13",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.13.tgz",
"integrity": "sha512-gmtS2PaUjSPa4zjObEIn4WWliKyZzYljgxODBfxugpK6q6HU9ClXzgCJ+nlcPKY9Bt090ypTOLIFWkV0jbKFjw==",
"dev": true,
"license": "MIT",
"dependencies": {
"cacheable": "^1.10.3",
"cacheable": "^1.10.4",
"flatted": "^3.3.3",
"hookified": "^1.10.0"
"hookified": "^1.11.0"
}
},
"node_modules/stylelint/node_modules/ignore": {
@@ -12485,14 +12519,14 @@
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
},
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
"integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.4.4",
"picomatch": "^4.0.2"
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
@@ -12771,16 +12805,16 @@
}
},
"node_modules/typescript-eslint": {
"version": "8.42.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.42.0.tgz",
"integrity": "sha512-ozR/rQn+aQXQxh1YgbCzQWDFrsi9mcg+1PM3l/z5o1+20P7suOIaNg515bpr/OYt6FObz/NHcBstydDLHWeEKg==",
"version": "8.43.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.43.0.tgz",
"integrity": "sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.42.0",
"@typescript-eslint/parser": "8.42.0",
"@typescript-eslint/typescript-estree": "8.42.0",
"@typescript-eslint/utils": "8.42.0"
"@typescript-eslint/eslint-plugin": "8.43.0",
"@typescript-eslint/parser": "8.43.0",
"@typescript-eslint/typescript-estree": "8.43.0",
"@typescript-eslint/utils": "8.43.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -12945,9 +12979,9 @@
"dev": true
},
"node_modules/uuid": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
"integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
"version": "13.0.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
"integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==",
"dev": true,
"funding": [
"https://github.com/sponsors/broofa",
@@ -12955,7 +12989,7 @@
],
"license": "MIT",
"bin": {
"uuid": "dist/esm/bin/uuid"
"uuid": "dist-node/bin/uuid"
}
},
"node_modules/value-or-function": {
@@ -13063,9 +13097,9 @@
}
},
"node_modules/vite": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz",
"integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==",
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.5.tgz",
"integrity": "sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -13074,7 +13108,7 @@
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
"tinyglobby": "^0.2.14"
"tinyglobby": "^0.2.15"
},
"bin": {
"vite": "bin/vite.js"
+16 -13
View File
@@ -1,13 +1,14 @@
{
"name": "maputnik",
"version": "2.1.1",
"version": "3.0.0",
"description": "A MapLibre GL visual style editor",
"type": "module",
"main": "''",
"scripts": {
"start": "vite",
"build": "tsc && vite build --base=/maputnik/",
"build-desktop": "tsc && vite build --base=/ && cd desktop && make",
"build": "tsc && vite build --mode=production",
"build-desktop": "tsc && vite build --mode=desktop && cd desktop && make",
"build-linux": "tsc && vite build --mode=desktop && cd desktop && make bin/linux/maputnik",
"i18n:refresh": "i18next 'src/**/*.{ts,tsx,js,jsx}'",
"lint": "eslint",
"test": "cypress run",
@@ -23,6 +24,9 @@
"license": "MIT",
"homepage": "https://github.com/maplibre/maputnik#readme",
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@mapbox/mapbox-gl-rtl-text": "^0.3.0",
"@maplibre/maplibre-gl-geocoder": "^1.9.0",
"@maplibre/maplibre-gl-inspect": "^1.7.1",
@@ -36,6 +40,7 @@
"codemirror": "^5.65.20",
"color": "^5.0.0",
"detect-browser": "^5.3.0",
"downshift": "^9.0.10",
"events": "^3.3.0",
"file-saver": "^2.0.5",
"i18next": "^25.5.2",
@@ -50,7 +55,7 @@
"lodash.get": "^4.4.2",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"maplibre-gl": "^5.6.2",
"maplibre-gl": "^5.7.1",
"maputnik-design": "github:maputnik/design#172b06c",
"ol": "^10.6.1",
"ol-mapbox-style": "^13.1.0",
@@ -60,7 +65,6 @@
"react-accessible-accordion": "^5.0.1",
"react-aria-menubutton": "^7.0.3",
"react-aria-modal": "^5.0.2",
"downshift": "^9.0.10",
"react-collapse": "^5.1.1",
"react-color": "^2.19.3",
"react-dom": "^18.2.0",
@@ -68,7 +72,6 @@
"react-i18next": "^15.7.3",
"react-icon-base": "^2.1.2",
"react-icons": "^5.5.0",
"react-sortable-hoc": "^2.0.0",
"reconnecting-websocket": "^4.4.0",
"slugify": "^1.6.6",
"string-hash": "^1.1.3",
@@ -93,7 +96,7 @@
},
"devDependencies": {
"@cypress/code-coverage": "^3.14.6",
"@eslint/js": "^9.34.0",
"@eslint/js": "^9.35.0",
"@istanbuljs/nyc-config-typescript": "^1.0.2",
"@rollup/plugin-replace": "^6.0.2",
"@shellygo/cypress-test-utils": "^6.0.1",
@@ -125,7 +128,7 @@
"cors": "^2.8.5",
"cypress": "^15.1.0",
"cypress-plugin-tab": "^1.0.5",
"eslint": "^9.34.0",
"eslint": "^9.35.0",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.20",
@@ -134,14 +137,14 @@
"istanbul-lib-coverage": "^3.2.2",
"postcss": "^8.5.6",
"react-hot-loader": "^4.13.1",
"sass": "^1.92.0",
"stylelint": "^16.23.1",
"sass": "^1.92.1",
"stylelint": "^16.24.0",
"stylelint-config-recommended-scss": "^16.0.0",
"stylelint-scss": "^6.12.1",
"typescript": "^5.8.3",
"typescript-eslint": "^8.42.0",
"uuid": "^11.1.0",
"vite": "^7.1.4",
"typescript-eslint": "^8.43.0",
"uuid": "^13.0.0",
"vite": "^7.1.5",
"vite-plugin-istanbul": "^7.1.0"
}
}
+57 -102
View File
@@ -27,17 +27,14 @@ import ModalDebug from './ModalDebug'
import {downloadGlyphsMetadata, downloadSpriteMetadata} from '../libs/metadata'
import style from '../libs/style'
import { initialStyleUrl, loadStyleUrl, removeStyleQuerystring } from '../libs/urlopen'
import { undoMessages, redoMessages } from '../libs/diffmessage'
import { StyleStore } from '../libs/stylestore'
import { ApiStyleStore } from '../libs/apistore'
import { createStyleStore, type IStyleStore } from '../libs/store/style-store-factory'
import { RevisionStore } from '../libs/revisions'
import LayerWatcher from '../libs/layerwatcher'
import tokens from '../config/tokens.json'
import isEqual from 'lodash.isequal'
import Debug from '../libs/debug'
import { SortEnd } from 'react-sortable-hoc';
import { MapOptions } from 'maplibre-gl';
import { OnStyleChangedOpts, StyleSpecificationWithId } from '../libs/definitions'
// Buffer must be defined globally for @maplibre/maplibre-gl-style-spec validate() function to succeed.
window.Buffer = buffer.Buffer;
@@ -83,12 +80,6 @@ function updateRootSpec(spec: any, fieldName: string, newValues: any) {
}
}
type OnStyleChangedOpts = {
save?: boolean
addRevision?: boolean
initialLoad?: boolean
}
type MappedErrors = {
message: string
parsed?: {
@@ -104,7 +95,7 @@ type MappedErrors = {
type AppState = {
errors: MappedErrors[],
infos: string[],
mapStyle: StyleSpecification & {id: string},
mapStyle: StyleSpecificationWithId,
dirtyMapStyle?: StyleSpecification,
selectedLayerIndex: number,
selectedLayerOriginalId?: string,
@@ -140,25 +131,56 @@ type AppState = {
export default class App extends React.Component<any, AppState> {
revisionStore: RevisionStore;
styleStore: StyleStore | ApiStyleStore;
styleStore: IStyleStore | null = null;
layerWatcher: LayerWatcher;
constructor(props: any) {
super(props)
this.revisionStore = new RevisionStore()
const params = new URLSearchParams(window.location.search.substring(1))
let port = params.get("localport")
if (port == null && (window.location.port !== "80" && window.location.port !== "443")) {
port = window.location.port
this.revisionStore = new RevisionStore();
this.configureKeyboardShortcuts();
this.state = {
errors: [],
infos: [],
mapStyle: style.emptyStyle,
selectedLayerIndex: 0,
sources: {},
vectorLayers: {},
mapState: "map",
spec: latest,
mapView: {
zoom: 0,
center: {
lng: 0,
lat: 0,
},
},
isOpen: {
settings: false,
sources: false,
open: false,
shortcuts: false,
export: false,
debug: false,
},
maplibreGlDebugOptions: {
showTileBoundaries: false,
showCollisionBoxes: false,
showOverdrawInspector: false,
},
openlayersDebugOptions: {
debugToolbox: false,
},
fileHandle: null,
}
this.styleStore = new ApiStyleStore({
onLocalStyleChange: mapStyle => this.onStyleChanged(mapStyle, {save: false}),
port: port,
host: params.get("localhost")
this.layerWatcher = new LayerWatcher({
onVectorLayersChange: v => this.setState({ vectorLayers: v })
})
}
configureKeyboardShortcuts = () => {
const shortcuts = [
{
key: "?",
@@ -228,74 +250,6 @@ export default class App extends React.Component<any, AppState> {
}
}
})
const styleUrl = initialStyleUrl()
if(styleUrl && window.confirm("Load style from URL: " + styleUrl + " and discard current changes?")) {
this.styleStore = new StyleStore()
loadStyleUrl(styleUrl, mapStyle => this.onStyleChanged(mapStyle))
removeStyleQuerystring()
} else {
if(styleUrl) {
removeStyleQuerystring()
}
this.styleStore.init(err => {
if(err) {
console.log('Falling back to local storage for storing styles')
this.styleStore = new StyleStore()
}
this.styleStore.latestStyle(mapStyle => this.onStyleChanged(mapStyle, {initialLoad: true}))
if(Debug.enabled()) {
Debug.set("maputnik", "styleStore", this.styleStore);
Debug.set("maputnik", "revisionStore", this.revisionStore);
}
})
}
if(Debug.enabled()) {
Debug.set("maputnik", "revisionStore", this.revisionStore);
Debug.set("maputnik", "styleStore", this.styleStore);
}
this.state = {
errors: [],
infos: [],
mapStyle: style.emptyStyle,
selectedLayerIndex: 0,
sources: {},
vectorLayers: {},
mapState: "map",
spec: latest,
mapView: {
zoom: 0,
center: {
lng: 0,
lat: 0,
},
},
isOpen: {
settings: false,
sources: false,
open: false,
shortcuts: false,
export: false,
// TODO: Disabled for now, this should be opened on the Nth visit to the editor
debug: false,
},
maplibreGlDebugOptions: {
showTileBoundaries: false,
showCollisionBoxes: false,
showOverdrawInspector: false,
},
openlayersDebugOptions: {
debugToolbox: false,
},
fileHandle: null,
}
this.layerWatcher = new LayerWatcher({
onVectorLayersChange: v => this.setState({ vectorLayers: v })
})
}
handleKeyPress = (e: KeyboardEvent) => {
@@ -321,7 +275,8 @@ export default class App extends React.Component<any, AppState> {
}
}
componentDidMount() {
async componentDidMount() {
this.styleStore = await createStyleStore((mapStyle, opts) => this.onStyleChanged(mapStyle, opts));
window.addEventListener("keydown", this.handleKeyPress);
}
@@ -329,8 +284,8 @@ export default class App extends React.Component<any, AppState> {
window.removeEventListener("keydown", this.handleKeyPress);
}
saveStyle(snapshotStyle: StyleSpecification & {id: string}) {
this.styleStore.save(snapshotStyle)
saveStyle(snapshotStyle: StyleSpecificationWithId) {
this.styleStore?.save(snapshotStyle)
}
updateFonts(urlTemplate: string) {
@@ -371,7 +326,7 @@ export default class App extends React.Component<any, AppState> {
this.onStyleChanged(changedStyle)
}
onStyleChanged = (newStyle: StyleSpecification & {id: string}, opts: OnStyleChangedOpts={}) => {
onStyleChanged = (newStyle: StyleSpecificationWithId, opts: OnStyleChangedOpts={}): void => {
opts = {
save: true,
addRevision: true,
@@ -480,7 +435,7 @@ export default class App extends React.Component<any, AppState> {
if (errors.length > 0) {
dirtyMapStyle = cloneDeep(newStyle);
errors.forEach(error => {
for (const error of errors) {
const {message} = error;
if (message) {
try {
@@ -490,10 +445,10 @@ export default class App extends React.Component<any, AppState> {
unset(dirtyMapStyle, unsetPath);
}
catch (err) {
console.warn(err);
console.warn(message + " " + err);
}
}
});
}
}
if(newStyle.glyphs !== this.state.mapStyle.glyphs) {
@@ -507,7 +462,7 @@ export default class App extends React.Component<any, AppState> {
this.revisionStore.addRevision(newStyle);
}
if (opts.save) {
this.saveStyle(newStyle as StyleSpecification & {id: string});
this.saveStyle(newStyle);
}
this.setState({
@@ -540,7 +495,7 @@ export default class App extends React.Component<any, AppState> {
})
}
onMoveLayer = (move: SortEnd) => {
onMoveLayer = (move: {oldIndex: number; newIndex: number}) => {
let { oldIndex, newIndex } = move;
let layers = this.state.mapStyle.layers;
oldIndex = clamp(oldIndex, 0, layers.length-1);
@@ -620,7 +575,7 @@ export default class App extends React.Component<any, AppState> {
}, this.setStateInUrl);
}
setDefaultValues = (styleObj: StyleSpecification & {id: string}) => {
setDefaultValues = (styleObj: StyleSpecificationWithId) => {
const metadata: {[key: string]: string} = styleObj.metadata || {} as any
if(metadata['maputnik:renderer'] === undefined) {
const changedStyle = {
@@ -636,7 +591,7 @@ export default class App extends React.Component<any, AppState> {
}
}
openStyle = (styleObj: StyleSpecification & {id: string}, fileHandle: FileSystemFileHandle | null) => {
openStyle = (styleObj: StyleSpecificationWithId, fileHandle: FileSystemFileHandle | null) => {
this.setState({fileHandle: fileHandle});
styleObj = this.setDefaultValues(styleObj)
this.onStyleChanged(styleObj)
+3 -2
View File
@@ -16,6 +16,7 @@ import pkgJson from '../../package.json'
import maputnikLogo from 'maputnik-design/logos/logo-color.svg?inline'
import { withTranslation, WithTranslation } from 'react-i18next';
import { supportedLanguages } from '../i18n';
import type { OnStyleChangedCallback } from '../libs/definitions';
// This is required because of <https://stackoverflow.com/a/49846426>, there isn't another way to detect support that I'm aware of.
const browser = detect();
@@ -93,9 +94,9 @@ export type MapState = "map" | "inspect" | "filter-achromatopsia" | "filter-deut
type AppToolbarInternalProps = {
mapStyle: object
inspectModeEnabled: boolean
onStyleChanged(...args: unknown[]): unknown
onStyleChanged: OnStyleChangedCallback
// A new style has been uploaded
onStyleOpen(...args: unknown[]): unknown
onStyleOpen: OnStyleChangedCallback
// A dict of source id's and the available source layers
sources: object
children?: React.ReactNode
+13 -11
View File
@@ -13,28 +13,30 @@ type FieldSourceInternalProps = {
error?: {message: string}
} & WithTranslation;
const FieldSourceInternal: React.FC<FieldSourceInternalProps> = (props) => {
const t = props.t;
const FieldSourceInternal: React.FC<FieldSourceInternalProps> = ({
onChange = () => {},
sourceIds = [],
wdKey,
value,
error,
t
}) => {
return (
<Block
label={t('Source')}
fieldSpec={latest.layer.source}
error={props.error}
data-wd-key={props.wdKey}
error={error}
data-wd-key={wdKey}
>
<InputAutocomplete
value={props.value}
onChange={props.onChange}
options={props.sourceIds?.map((src) => [src, src])}
value={value}
onChange={onChange}
options={sourceIds?.map((src) => [src, src])}
/>
</Block>
);
};
FieldSourceInternal.defaultProps = {
onChange: () => {},
sourceIds: [],
};
const FieldSource = withTranslation()(FieldSourceInternal);
export default FieldSource;
+11 -13
View File
@@ -9,33 +9,31 @@ type FieldSourceLayerInternalProps = {
value?: string
onChange?(...args: unknown[]): unknown
sourceLayerIds?: unknown[]
isFixed?: boolean
error?: {message: string}
} & WithTranslation;
const FieldSourceLayerInternal: React.FC<FieldSourceLayerInternalProps> = (props) => {
const t = props.t;
const FieldSourceLayerInternal: React.FC<FieldSourceLayerInternalProps> = ({
onChange = () => {},
sourceLayerIds = [],
value,
error,
t
}) => {
return (
<Block
label={t('Source Layer')}
fieldSpec={latest.layer['source-layer']}
data-wd-key="layer-source-layer"
error={props.error}
error={error}
>
<InputAutocomplete
value={props.value}
onChange={props.onChange}
options={props.sourceLayerIds?.map((l) => [l, l])}
value={value}
onChange={onChange}
options={sourceLayerIds?.map((l) => [l, l])}
/>
</Block>
);
};
FieldSourceLayerInternal.defaultProps = {
onChange: () => {},
sourceLayerIds: [],
isFixed: false,
};
const FieldSourceLayer = withTranslation()(FieldSourceLayerInternal);
export default FieldSourceLayer;
+16 -14
View File
@@ -14,32 +14,34 @@ type FieldTypeInternalProps = {
disabled?: boolean
} & WithTranslation;
const FieldTypeInternal: React.FC<FieldTypeInternalProps> = (props) => {
const t = props.t;
const FieldTypeInternal: React.FC<FieldTypeInternalProps> = ({
t,
value,
wdKey,
onChange,
error,
disabled = false
}) => {
const layerstypes: [string, string][] = Object.keys(v8.layer.type.values || {}).map(v => [v, startCase(v.replace(/-/g, ' '))]);
return (
<Block label={t('Type')} fieldSpec={v8.layer.type}
data-wd-key={props.wdKey}
error={props.error}
data-wd-key={wdKey}
error={error}
>
{props.disabled && (
<InputString value={props.value} disabled={true} />
{disabled && (
<InputString value={value} disabled={true} />
)}
{!props.disabled && (
{!disabled && (
<InputSelect
options={layerstypes}
onChange={props.onChange}
value={props.value}
data-wd-key={props.wdKey + '.select'}
onChange={onChange}
value={value}
data-wd-key={wdKey + '.select'}
/>
)}
</Block>
);
};
FieldTypeInternal.defaultProps = {
disabled: false,
};
const FieldType = withTranslation()(FieldTypeInternal);
export default FieldType;
+3 -2
View File
@@ -1,7 +1,7 @@
import React from 'react'
import {mdiTableRowPlusAfter} from '@mdi/js';
import {isEqual} from 'lodash';
import {ExpressionSpecification, LegacyFilterSpecification, StyleSpecification} from 'maplibre-gl'
import {ExpressionSpecification, LegacyFilterSpecification} from 'maplibre-gl'
import {latest, migrate, convertFilter} from '@maplibre/maplibre-gl-style-spec'
import {mdiFunctionVariant} from '@mdi/js';
@@ -14,6 +14,7 @@ import InputButton from './InputButton'
import Doc from './Doc'
import ExpressionProperty from './_ExpressionProperty';
import { WithTranslation, withTranslation } from 'react-i18next';
import type { StyleSpecificationWithId } from '../libs/definitions';
function combiningFilter(props: FilterEditorInternalProps): LegacyFilterSpecification | ExpressionSpecification {
@@ -39,7 +40,7 @@ function migrateFilter(filter: LegacyFilterSpecification | ExpressionSpecificati
return (migrate(createStyleFromFilter(filter) as any).layers[0] as any).filter;
}
function createStyleFromFilter(filter: LegacyFilterSpecification | ExpressionSpecification): StyleSpecification & {id: string} {
function createStyleFromFilter(filter: LegacyFilterSpecification | ExpressionSpecification): StyleSpecificationWithId {
return {
"id": "tmp",
"version": 8,
+19 -10
View File
@@ -22,6 +22,7 @@ import {formatLayerId} from '../libs/format';
import { WithTranslation, withTranslation } from 'react-i18next';
import { TFunction } from 'i18next';
import { NON_SOURCE_LAYERS } from '../libs/non-source-layers';
import { OnMoveLayerCallback } from '../libs/definitions';
type MaputnikLayoutGroup = {
id: string;
@@ -120,7 +121,7 @@ type LayerEditorInternalProps = {
spec: object
onLayerChanged(...args: unknown[]): unknown
onLayerIdChange(...args: unknown[]): unknown
onMoveLayer(...args: unknown[]): unknown
onMoveLayer: OnMoveLayerCallback
onLayerDestroy(...args: unknown[]): unknown
onLayerCopy(...args: unknown[]): unknown
onLayerVisibilityToggle(...args: unknown[]): unknown
@@ -322,30 +323,38 @@ class LayerEditorInternal extends React.Component<LayerEditorInternalProps, Laye
const layout = this.props.layer.layout || {}
const items: {[key: string]: {text: string, handler: () => void, disabled?: boolean}} = {
const items: {[key: string]: {
text: string,
handler: () => void,
disabled?: boolean,
wdKey?: string
}} = {
delete: {
text: t("Delete"),
handler: () => this.props.onLayerDestroy(this.props.layerIndex)
handler: () => this.props.onLayerDestroy(this.props.layerIndex),
wdKey: "menu-delete-layer"
},
duplicate: {
text: t("Duplicate"),
handler: () => this.props.onLayerCopy(this.props.layerIndex)
handler: () => this.props.onLayerCopy(this.props.layerIndex),
wdKey: "menu-duplicate-layer"
},
hide: {
text: (layout.visibility === "none") ? t("Show") : t("Hide"),
handler: () => this.props.onLayerVisibilityToggle(this.props.layerIndex)
handler: () => this.props.onLayerVisibilityToggle(this.props.layerIndex),
wdKey: "menu-hide-layer"
},
moveLayerUp: {
text: t("Move layer up"),
// Not actually used...
disabled: this.props.isFirstLayer,
handler: () => this.moveLayer(-1)
handler: () => this.moveLayer(-1),
wdKey: "menu-move-layer-up"
},
moveLayerDown: {
text: t("Move layer down"),
// Not actually used...
disabled: this.props.isLastLayer,
handler: () => this.moveLayer(+1)
handler: () => this.moveLayer(+1),
wdKey: "menu-move-layer-down"
}
}
@@ -382,7 +391,7 @@ class LayerEditorInternal extends React.Component<LayerEditorInternalProps, Laye
{Object.keys(items).map((id) => {
const item = items[id];
return <li key={id}>
<MenuItem value={id} className='more-menu__menu__item'>
<MenuItem value={id} className='more-menu__menu__item' data-wd-key={item.wdKey}>
{item.text}
</MenuItem>
</li>
+40 -14
View File
@@ -1,16 +1,28 @@
import React, {type JSX} from 'react'
import classnames from 'classnames'
import lodash from 'lodash';
import {
DndContext,
PointerSensor,
useSensor,
useSensors,
closestCenter,
DragEndEvent,
} from '@dnd-kit/core';
import {
SortableContext,
verticalListSortingStrategy,
} from '@dnd-kit/sortable';
import LayerListGroup from './LayerListGroup'
import LayerListItem from './LayerListItem'
import ModalAdd from './ModalAdd'
import {SortEndHandler, SortableContainer} from 'react-sortable-hoc';
import type {LayerSpecification, SourceSpecification} from 'maplibre-gl';
import generateUniqueId from '../libs/document-uid';
import { findClosestCommonPrefix, layerPrefix } from '../libs/layer';
import { WithTranslation, withTranslation } from 'react-i18next';
import { OnMoveLayerCallback } from '../libs/definitions';
type LayerListContainerProps = {
layers: LayerSpecification[]
@@ -242,7 +254,6 @@ class LayerListContainerInternal extends React.Component<LayerListContainerInter
'maputnik-layer-list-item-group-last': idxInGroup == layers.length - 1 && layers.length > 1,
'maputnik-layer-list-item--error': !!layerError
})}
index={idx}
key={layer.key}
id={layer.key}
layerId={layer.id}
@@ -319,20 +330,35 @@ class LayerListContainerInternal extends React.Component<LayerListContainerInter
}
const LayerListContainer = withTranslation()(LayerListContainerInternal);
const LayerListContainerSortable = SortableContainer((props: LayerListContainerProps) => <LayerListContainer {...props} />)
type LayerListProps = LayerListContainerProps & {
onMoveLayer: SortEndHandler
onMoveLayer: OnMoveLayerCallback
};
export default class LayerList extends React.Component<LayerListProps> {
render() {
return <LayerListContainerSortable
{...this.props}
helperClass='sortableHelper'
onSortEnd={this.props.onMoveLayer.bind(this)}
useDragHandle={true}
shouldCancelStart={() => false}
/>
}
const LayerList: React.FC<LayerListProps> = (props) => {
const sensors = useSensors(useSensor(PointerSensor));
const handleDragEnd = (event: DragEndEvent) => {
const {active, over} = event;
if (!over) return;
const oldIndex = props.layers.findIndex(layer => layer.id === active.id);
const newIndex = props.layers.findIndex(layer => layer.id === over.id);
if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {
props.onMoveLayer({oldIndex, newIndex});
}
};
const layerIds = props.layers.map(layer => layer.id);
return (
<DndContext sensors={sensors} collisionDetection={closestCenter} onDragEnd={handleDragEnd}>
<SortableContext items={layerIds} strategy={verticalListSortingStrategy}>
<LayerListContainer {...props} />
</SortableContext>
</DndContext>
);
}
export default LayerList;
+81 -53
View File
@@ -1,20 +1,23 @@
import React from 'react'
import classnames from 'classnames'
import {MdContentCopy, MdVisibility, MdVisibilityOff, MdDelete} from 'react-icons/md'
import { IconContext } from 'react-icons'
import {useSortable} from '@dnd-kit/sortable'
import {CSS} from '@dnd-kit/utilities'
import IconLayer from './IconLayer'
import {SortableElement, SortableHandle} from 'react-sortable-hoc'
type DraggableLabelProps = {
layerId: string
layerType: string
dragAttributes?: React.HTMLAttributes<HTMLElement>
dragListeners?: React.HTMLAttributes<HTMLElement>
};
const DraggableLabel = SortableHandle((props: DraggableLabelProps) => {
return <div className="maputnik-layer-list-item-handle">
const DraggableLabel: React.FC<DraggableLabelProps> = (props) => {
const {dragAttributes, dragListeners} = props;
return <div className="maputnik-layer-list-item-handle" {...dragAttributes} {...dragListeners}>
<IconLayer
className="layer-handle__icon"
type={props.layerType}
@@ -23,7 +26,7 @@ const DraggableLabel = SortableHandle((props: DraggableLabelProps) => {
{props.layerId}
</button>
</div>
});
};
type IconActionProps = {
action: string
@@ -82,55 +85,80 @@ type LayerListItemProps = {
onLayerVisibilityToggle?(...args: unknown[]): unknown
};
class LayerListItem extends React.Component<LayerListItemProps> {
static defaultProps = {
isSelected: false,
visibility: 'visible',
onLayerCopy: () => {},
onLayerDestroy: () => {},
onLayerVisibilityToggle: () => {},
}
const LayerListItem = React.forwardRef<HTMLLIElement, LayerListItemProps>((props, ref) => {
const {
isSelected = false,
visibility = 'visible',
onLayerCopy = () => {},
onLayerDestroy = () => {},
onLayerVisibilityToggle = () => {},
} = props;
render() {
const visibilityAction = this.props.visibility === 'visible' ? 'show' : 'hide';
const {
attributes,
listeners,
setNodeRef,
transform,
transition,
isDragging,
} = useSortable({id: props.layerId});
return <IconContext.Provider value={{size: '14px'}}>
<li
id={this.props.id}
key={this.props.layerId}
onClick={_e => this.props.onLayerSelect(this.props.layerIndex)}
data-wd-key={"layer-list-item:"+this.props.layerId}
className={classnames({
"maputnik-layer-list-item": true,
"maputnik-layer-list-item-selected": this.props.isSelected,
[this.props.className!]: true,
})}>
<DraggableLabel {...this.props} />
<span style={{flexGrow: 1}} />
<IconAction
wdKey={"layer-list-item:"+this.props.layerId+":delete"}
action={'delete'}
classBlockName="delete"
onClick={_e => this.props.onLayerDestroy!(this.props.layerIndex)}
/>
<IconAction
wdKey={"layer-list-item:"+this.props.layerId+":copy"}
action={'duplicate'}
classBlockName="duplicate"
onClick={_e => this.props.onLayerCopy!(this.props.layerIndex)}
/>
<IconAction
wdKey={"layer-list-item:"+this.props.layerId+":toggle-visibility"}
action={visibilityAction}
classBlockName="visibility"
classBlockModifier={visibilityAction}
onClick={_e => this.props.onLayerVisibilityToggle!(this.props.layerIndex)}
/>
</li>
</IconContext.Provider>
}
}
const style = {
transform: CSS.Transform.toString(transform),
transition,
opacity: isDragging ? 0.5 : 1,
};
const LayerListItemSortable = SortableElement<LayerListItemProps>((props: LayerListItemProps) => <LayerListItem {...props} />);
const visibilityAction = visibility === 'visible' ? 'show' : 'hide';
export default LayerListItemSortable;
// Cast ref to MutableRefObject since we know from the codebase that's what's always passed
const refObject = ref as React.MutableRefObject<HTMLLIElement | null> | null;
return <IconContext.Provider value={{size: '14px'}}>
<li
ref={(node) => {
setNodeRef(node);
if (refObject) {
refObject.current = node;
}
}}
style={style}
id={props.id}
onClick={_e => props.onLayerSelect(props.layerIndex)}
data-wd-key={"layer-list-item:" + props.layerId}
className={classnames({
"maputnik-layer-list-item": true,
"maputnik-layer-list-item-selected": isSelected,
[props.className!]: true,
})}>
<DraggableLabel
layerId={props.layerId}
layerType={props.layerType}
dragAttributes={attributes}
dragListeners={listeners}
/>
<span style={{flexGrow: 1}} />
<IconAction
wdKey={"layer-list-item:" + props.layerId+":delete"}
action={'delete'}
classBlockName="delete"
onClick={_e => onLayerDestroy!(props.layerIndex)}
/>
<IconAction
wdKey={"layer-list-item:" + props.layerId+":copy"}
action={'duplicate'}
classBlockName="duplicate"
onClick={_e => onLayerCopy!(props.layerIndex)}
/>
<IconAction
wdKey={"layer-list-item:"+props.layerId+":toggle-visibility"}
action={visibilityAction}
classBlockName="visibility"
classBlockModifier={visibilityAction}
onClick={_e => onLayerVisibilityToggle!(props.layerIndex)}
/>
</li>
</IconContext.Provider>
});
export default LayerListItem;
-1
View File
@@ -175,7 +175,6 @@ class ModalAddInternal extends React.Component<ModalAddInternalProps, ModalAddSt
}
{!NON_SOURCE_LAYERS.includes(this.state.type) &&
<FieldSourceLayer
isFixed={true}
sourceLayerIds={layers}
value={this.state['source-layer']}
onChange={(v: string) => this.setState({ 'source-layer': v })}
+3 -3
View File
@@ -3,7 +3,6 @@ import Slugify from 'slugify'
import {saveAs} from 'file-saver'
import {version} from 'maplibre-gl/package.json'
import {format} from '@maplibre/maplibre-gl-style-spec'
import type {StyleSpecification} from 'maplibre-gl'
import {MdMap, MdSave} from 'react-icons/md'
import {WithTranslation, withTranslation} from 'react-i18next';
@@ -12,6 +11,7 @@ import InputButton from './InputButton'
import Modal from './Modal'
import style from '../libs/style'
import fieldSpecAdditional from '../libs/field-spec-additional'
import type {OnStyleChangedCallback, StyleSpecificationWithId} from '../libs/definitions'
const MAPLIBRE_GL_VERSION = version;
@@ -19,8 +19,8 @@ const showSaveFilePickerAvailable = typeof window.showSaveFilePicker === "functi
type ModalExportInternalProps = {
mapStyle: StyleSpecification & { id: string }
onStyleChanged(...args: unknown[]): unknown
mapStyle: StyleSpecificationWithId
onStyleChanged: OnStyleChangedCallback
isOpen: boolean
onOpenToggle(...args: unknown[]): unknown
onSetFileHandle(fileHandle: FileSystemFileHandle | null): unknown
+4 -3
View File
@@ -12,10 +12,11 @@ import FieldEnum from './FieldEnum'
import FieldColor from './FieldColor'
import Modal from './Modal'
import fieldSpecAdditional from '../libs/field-spec-additional'
import type {OnStyleChangedCallback, StyleSpecificationWithId} from '../libs/definitions';
type ModalSettingsInternalProps = {
mapStyle: StyleSpecification
onStyleChanged(...args: unknown[]): unknown
mapStyle: StyleSpecificationWithId
onStyleChanged: OnStyleChangedCallback
onChangeMetadataProperty(...args: unknown[]): unknown
isOpen: boolean
onOpenToggle(...args: unknown[]): unknown
@@ -62,7 +63,7 @@ class ModalSettingsInternal extends React.Component<ModalSettingsInternalProps>
changeTerrainProperty(property: keyof TerrainSpecification, value: any) {
const terrain = {
...this.props.mapStyle.terrain,
}
} as TerrainSpecification;
if (value === undefined) {
delete terrain[property];
+4 -3
View File
@@ -1,7 +1,7 @@
import React from 'react'
import {MdAddCircleOutline, MdDelete} from 'react-icons/md'
import latest from '@maplibre/maplibre-gl-style-spec/dist/latest.json'
import type {GeoJSONSourceSpecification, RasterDEMSourceSpecification, RasterSourceSpecification, SourceSpecification, StyleSpecification, VectorSourceSpecification} from 'maplibre-gl'
import type {GeoJSONSourceSpecification, RasterDEMSourceSpecification, RasterSourceSpecification, SourceSpecification, VectorSourceSpecification} from 'maplibre-gl'
import { WithTranslation, withTranslation } from 'react-i18next';
import Modal from './Modal'
@@ -13,6 +13,7 @@ import ModalSourcesTypeEditor, { EditorMode } from './ModalSourcesTypeEditor'
import style from '../libs/style'
import { deleteSource, addSource, changeSource } from '../libs/source'
import publicSources from '../config/tilesets.json'
import { OnStyleChangedCallback, StyleSpecificationWithId } from '../libs/definitions';
type PublicSourceProps = {
@@ -270,10 +271,10 @@ class AddSource extends React.Component<AddSourceProps, AddSourceState> {
}
type ModalSourcesInternalProps = {
mapStyle: StyleSpecification
mapStyle: StyleSpecificationWithId
isOpen: boolean
onOpenToggle(...args: unknown[]): unknown
onStyleChanged(...args: unknown[]): unknown
onStyleChanged: OnStyleChangedCallback
} & WithTranslation;
class ModalSourcesInternal extends React.Component<ModalSourcesInternalProps> {
-48
View File
@@ -1,48 +0,0 @@
interface DebugStore {
[namespace: string]: {
[key: string]: any
}
}
const debugStore: DebugStore = {};
function enabled() {
const qs = new URL(window.location.href).searchParams;
const debugQs = qs.get("debug");
if(debugQs) {
return !!debugQs.match(/^(|1|true)$/);
}
else {
return false;
}
}
function genErr() {
return new Error("Debug not enabled, enable by appending '?debug' to your query string");
}
function set(namespace: keyof DebugStore, key: string, value: any) {
if(!enabled()) {
throw genErr();
}
debugStore[namespace] = debugStore[namespace] || {};
debugStore[namespace][key] = value;
}
function get(namespace: keyof DebugStore, key: string) {
if(!enabled()) {
throw genErr();
}
if(Object.prototype.hasOwnProperty.call(debugStore, namespace)) {
return debugStore[namespace][key];
}
}
const mod = {
enabled,
get,
set
};
(window as any).debug = mod;
export default mod;
+18
View File
@@ -0,0 +1,18 @@
import type { StyleSpecification } from "maplibre-gl";
export type StyleSpecificationWithId = StyleSpecification & {id: string};
export type OnStyleChangedOpts = {
save?: boolean;
addRevision?: boolean;
initialLoad?: boolean;
}
export type OnStyleChangedCallback = (newStyle: StyleSpecificationWithId, opts: OnStyleChangedOpts={}) => void;
export type OnMoveLayerCallback = (move: {oldIndex: number; newIndex: number}) => void;
export interface IStyleStore {
getLatestStyle(): Promise<StyleSpecificationWithId>;
save(mapStyle: StyleSpecificationWithId): StyleSpecificationWithId;
}
+3 -3
View File
@@ -1,7 +1,7 @@
import type {StyleSpecification} from "maplibre-gl";
import { StyleSpecificationWithId } from "./definitions";
export class RevisionStore {
revisions: (StyleSpecification & {id: string})[];
revisions: StyleSpecificationWithId[];
currentIdx: number;
@@ -18,7 +18,7 @@ export class RevisionStore {
return this.revisions[this.currentIdx]
}
addRevision(revision: StyleSpecification & {id: string}) {
addRevision(revision: StyleSpecificationWithId) {
// clear any "redo" revisions once a change is made
// and ensure current index is at end of list
this.revisions = this.revisions.slice(0, this.currentIdx + 1);
+5 -4
View File
@@ -1,6 +1,7 @@
import type {StyleSpecification, SourceSpecification} from "maplibre-gl";
import type {SourceSpecification} from "maplibre-gl";
import type {StyleSpecificationWithId} from "./definitions";
export function deleteSource(mapStyle: StyleSpecification, sourceId: string) {
export function deleteSource(mapStyle: StyleSpecificationWithId, sourceId: string) {
const remainingSources = { ...mapStyle.sources}
delete remainingSources[sourceId]
return {
@@ -10,11 +11,11 @@ export function deleteSource(mapStyle: StyleSpecification, sourceId: string) {
}
export function addSource(mapStyle: StyleSpecification, sourceId: string, source: SourceSpecification) {
export function addSource(mapStyle: StyleSpecificationWithId, sourceId: string, source: SourceSpecification) {
return changeSource(mapStyle, sourceId, source)
}
export function changeSource(mapStyle: StyleSpecification, sourceId: string, source: SourceSpecification) {
export function changeSource(mapStyle: StyleSpecificationWithId, sourceId: string, source: SourceSpecification) {
const changedSources = {
...mapStyle.sources,
[sourceId]: source
@@ -1,46 +1,38 @@
import style from './style.js'
import style from '../style'
import {format} from '@maplibre/maplibre-gl-style-spec'
import type {StyleSpecification} from 'maplibre-gl'
import ReconnectingWebSocket from 'reconnecting-websocket'
import type {IStyleStore, OnStyleChangedCallback, StyleSpecificationWithId} from '../definitions'
export type ApiStyleStoreOptions = {
port: string | null
host: string | null
onLocalStyleChange?: (style: any) => void
onLocalStyleChange?: OnStyleChangedCallback
}
export class ApiStyleStore {
export class ApiStyleStore implements IStyleStore {
localUrl: string;
websocketUrl: string;
latestStyleId: string | undefined = undefined;
onLocalStyleChange: (style: any) => void;
onLocalStyleChange: OnStyleChangedCallback;
constructor(opts: ApiStyleStoreOptions) {
this.onLocalStyleChange = opts.onLocalStyleChange || (() => {})
const port = opts.port || '8000'
const host = opts.host || 'localhost'
const port = window.location.port
const host = 'localhost'
this.localUrl = `http://${host}:${port}`
this.websocketUrl = `ws://${host}:${port}/ws`
this.init = this.init.bind(this)
}
init(cb: (...args: any[]) => void) {
fetch(this.localUrl + '/styles', {
mode: 'cors',
})
.then((response) => {
return response.json();
})
.then((body) => {
const styleIds = body;
this.latestStyleId = styleIds[0]
this.notifyLocalChanges()
cb(null)
})
.catch(() => {
cb(new Error('Can not connect to style API'))
})
async init(): Promise<void> {
try {
const response = await fetch(this.localUrl + '/styles', {mode: 'cors'});
const body = await response.json();
const styleIds = body;
this.latestStyleId = styleIds[0]
this.notifyLocalChanges();
} catch {
throw new Error('Can not connect to style API');
}
}
notifyLocalChanges() {
@@ -59,24 +51,20 @@ export class ApiStyleStore {
}
}
latestStyle(cb: (...args: any[]) => void) {
async getLatestStyle(): Promise<StyleSpecificationWithId> {
if(this.latestStyleId) {
fetch(this.localUrl + '/styles/' + this.latestStyleId, {
const response = await fetch(this.localUrl + '/styles/' + this.latestStyleId, {
mode: 'cors',
})
.then(function(response) {
return response.json();
})
.then(function(body) {
cb(style.ensureStyleValidity(body))
})
});
const body = await response.json();
return style.ensureStyleValidity(body);
} else {
throw new Error('No latest style available. You need to init the api backend first.')
}
}
// Save current style replacing previous version
save(mapStyle: StyleSpecification & { id: string }) {
save(mapStyle: StyleSpecificationWithId) {
const styleJSON = format(
style.stripAccessTokens(
style.replaceAccessTokens(mapStyle)
+29
View File
@@ -0,0 +1,29 @@
/// <reference types="vite/client" />
import { IStyleStore, OnStyleChangedCallback } from "../definitions";
import { getStyleUrlFromAddressbarAndRemoveItIfNeeded, loadStyleUrl } from "../urlopen";
import { ApiStyleStore } from "./apistore";
import { StyleStore } from "./stylestore";
export async function createStyleStore(onStyleChanged: OnStyleChangedCallback): Promise<IStyleStore> {
const styleUrl = getStyleUrlFromAddressbarAndRemoveItIfNeeded();
const useStyleUrl = styleUrl && window.confirm("Load style from URL: " + styleUrl + " and discard current changes?");
let styleStore: IStyleStore;
if (import.meta.env.MODE === 'desktop' && !useStyleUrl) {
const apiStyleStore = new ApiStyleStore({
onLocalStyleChange: mapStyle => onStyleChanged(mapStyle, {save: false}),
});
try {
await apiStyleStore.init();
styleStore = apiStyleStore;
} catch {
styleStore = new StyleStore();
}
} else {
styleStore = new StyleStore();
}
const styleToLoad = useStyleUrl ? await loadStyleUrl(styleUrl) : await styleStore.getLatestStyle();
onStyleChanged(styleToLoad, {initialLoad: true, save: false});
return styleStore;
}
export type { IStyleStore };
@@ -1,7 +1,7 @@
import style from './style'
import {loadStyleUrl} from './urlopen'
import publicSources from '../config/styles.json'
import type {StyleSpecification} from 'maplibre-gl'
import style from '../style'
import {loadStyleUrl} from '../urlopen'
import publicSources from '../../config/styles.json'
import type {IStyleStore, StyleSpecificationWithId} from '../definitions'
const storagePrefix = "maputnik"
const stylePrefix = 'style'
@@ -13,8 +13,8 @@ const storageKeys = {
const defaultStyleUrl = publicSources[0].url
// Fetch a default style via URL and return it or a fallback style via callback
export function loadDefaultStyle(cb: (...args: any[]) => void) {
loadStyleUrl(defaultStyleUrl, cb)
export function loadDefaultStyle(): Promise<StyleSpecificationWithId> {
return loadStyleUrl(defaultStyleUrl);
}
// Return style ids and dates of all styles stored in local storage
@@ -51,7 +51,7 @@ function styleKey(styleId: string) {
}
// Manages many possible styles that are stored in the local storage
export class StyleStore {
export class StyleStore implements IStyleStore {
/**
* List of style ids
*/
@@ -63,10 +63,6 @@ export class StyleStore {
this.mapStyles = loadStoredStyles();
}
init(cb: (...args: any[]) => void) {
cb(null)
}
// Delete entire style history
purge() {
for (let i = 0; i < window.localStorage.length; i++) {
@@ -78,17 +74,21 @@ export class StyleStore {
}
// Find the last edited style
latestStyle(cb: (...args: any[]) => void) {
if(this.mapStyles.length === 0) return loadDefaultStyle(cb)
async getLatestStyle(): Promise<StyleSpecificationWithId> {
if(this.mapStyles.length === 0) {
return loadDefaultStyle();
}
const styleId = window.localStorage.getItem(storageKeys.latest) as string;
const styleItem = window.localStorage.getItem(styleKey(styleId))
if(styleItem) return cb(JSON.parse(styleItem))
loadDefaultStyle(cb)
if (styleItem) {
return JSON.parse(styleItem) as StyleSpecificationWithId;
}
return loadDefaultStyle();
}
// Save current style replacing previous version
save(mapStyle: StyleSpecification & { id: string }) {
save(mapStyle: StyleSpecificationWithId) {
mapStyle = style.ensureStyleValidity(mapStyle)
const key = styleKey(mapStyle.id)
+6 -6
View File
@@ -1,6 +1,7 @@
import {derefLayers} from '@maplibre/maplibre-gl-style-spec'
import type {StyleSpecification, LayerSpecification} from 'maplibre-gl'
import tokens from '../config/tokens.json'
import type {StyleSpecificationWithId} from './definitions'
// Empty style is always used if no style could be restored or fetched
const emptyStyle = ensureStyleValidity({
@@ -13,15 +14,14 @@ function generateId() {
return Math.random().toString(36).substring(2, 9)
}
function ensureHasId(style: StyleSpecification & { id?: string }): StyleSpecification & { id: string } {
function ensureHasId(style: StyleSpecification & { id?: string }): StyleSpecificationWithId {
if(!('id' in style) || !style.id) {
style.id = generateId();
return style as StyleSpecification & { id: string };
}
return style as StyleSpecification & { id: string };
return style as StyleSpecificationWithId;
}
function ensureHasNoInteractive(style: StyleSpecification & {id: string}) {
function ensureHasNoInteractive(style: StyleSpecificationWithId) {
const changedLayers = style.layers.map(layer => {
const changedLayer: LayerSpecification & { interactive?: any } = { ...layer }
delete changedLayer.interactive
@@ -34,14 +34,14 @@ function ensureHasNoInteractive(style: StyleSpecification & {id: string}) {
}
}
function ensureHasNoRefs(style: StyleSpecification & {id: string}) {
function ensureHasNoRefs(style: StyleSpecificationWithId) {
return {
...style,
layers: derefLayers(style.layers)
}
}
function ensureStyleValidity(style: StyleSpecification): StyleSpecification & { id: string } {
function ensureStyleValidity(style: StyleSpecification): StyleSpecificationWithId {
return ensureHasNoInteractive(ensureHasNoRefs(ensureHasId(style)))
}
+20 -23
View File
@@ -1,30 +1,27 @@
import style from './style'
import { StyleSpecificationWithId } from './definitions';
export function initialStyleUrl() {
export function getStyleUrlFromAddressbarAndRemoveItIfNeeded(): string | null {
const initialUrl = new URL(window.location.href);
return initialUrl.searchParams.get('style');
const styleUrl = initialUrl.searchParams.get('style');
if (styleUrl) {
initialUrl.searchParams.delete('style');
window.history.replaceState({}, document.title, initialUrl.toString())
}
return styleUrl;
}
export function loadStyleUrl(styleUrl: string, cb: (...args: any[]) => void) {
export async function loadStyleUrl(styleUrl: string): Promise<StyleSpecificationWithId> {
console.log('Loading style', styleUrl)
fetch(styleUrl, {
mode: 'cors',
credentials: "same-origin"
})
.then(function(response) {
return response.json();
})
.then(function(body) {
cb(style.ensureStyleValidity(body))
})
.catch(function() {
console.warn('Could not fetch default style', styleUrl)
cb(style.emptyStyle)
})
}
export function removeStyleQuerystring() {
const initialUrl = new URL(window.location.href);
initialUrl.searchParams.delete('style');
window.history.replaceState({}, document.title, initialUrl.toString())
try {
const response = await fetch(styleUrl, {
mode: 'cors',
credentials: "same-origin"
});
const body = await response.json();
return style.ensureStyleValidity(body);
} catch {
console.warn('Could not fetch default style: ' + styleUrl)
return style.emptyStyle
}
}
+4 -3
View File
@@ -3,7 +3,7 @@ import react from "@vitejs/plugin-react";
import { defineConfig } from "vite";
import istanbul from "vite-plugin-istanbul";
export default defineConfig({
export default defineConfig(({ mode }) => ({
server: {
port: 8888,
},
@@ -27,7 +27,8 @@ export default defineConfig({
forceBuildInstrument: true, //Instrument the source code for cypress runs
}),
],
base: mode === "desktop" ? "/" : "/maputnik/",
define: {
global: "window",
global: "window"
},
});
}));