Skip to content

Commit db036a5

Browse files
authored
Merge branch 'main' into perf/router-view-rerenders
2 parents 1191594 + 8c73877 commit db036a5

File tree

248 files changed

+16314
-7833
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

248 files changed

+16314
-7833
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ body:
99
id: reproduction
1010
attributes:
1111
label: Reproduction
12-
description: "If possible, provide a boiled down editable reproduction using a service like [JSFiddle](https://jsfiddle.net/posva/3yq6ojLv), Codepen, [CodeSandbox](https://codesandbox.io/s/vue-router-4-reproduction-s1sqc), or a GitHub repository. A failing unit test is even better! Otherwise provide as much information as possible to reproduce the problem. If we can't reproduce the problem, we won't be able to give it a look **and the issue will be converted into a question and moved to discussions**."
12+
description: "If possible, provide a boiled down editable reproduction with the [Vue.js Playground](https://play.vuejs.org/#eNqlVG1P2zAQ/iu3bFKLRuNSEB+yUMEQGpv2gti0L8s+pInbGhLbsp1SVPW/72znrVD4MlVp7Lvn7p67x/EmKFPGwzsdRAErpVAGNpApmhp6ISVsYa5ECYNVRQcJbwFKVIaq1hsSb+ggNrbxpVKGPj7hbeYhPgcJBwgrTYc+3O9LUXEzHLzFsMFBcBjU4cgvNrSUBcZPLTBeHk2vaVEIW+xNTHDrzNK9cKGNEnwxvayUotx4ziBTs4xiUvtgs4F3zhHOq6K4QSdsty4N8Xlinq6ahLeO5VfG78GIsyQgSTD9JHAN16KkMen8L0akM7S0YRd29ywuJk3N2Gqzm+s3ow9Aalztjkk7GJyXn2Vo9ij6jZZCPV4zbfB1WBt93r7So1bNVk/boCvdiNoYamUb2W1DO7jW0h4BunbQTHBdi6LgbIfLcGPbW3qa0T7uw4NDC3HROoI/fkQbry4MyACbE0iJo/BRR37rovpAp8cuuuvBw//i/xaPJo6237Q9jzpTTBrQ1FQSipQvUGKjUV6riXfiEjdPDu5k2mTCYzt5puDOzP6vTptqbyGv2qhMJV4AgmMpN/mkdmCFCJzF2rqDYc1JsDRG6oiQisv7RYgDJB3i/CQ8DsckR7V61pDqcjRT4kHj+g6z13IkwTmCSE5XRohCj1LJXirxDHh+Gp6GR6RgM4LZCeM5XbvcNjV+yVts02g8bHO2eNKk1ZwVVP2QhuFh3Gk2xXvl4YuzGVXRlmi2pNn9HvudXnvKN4pidyvaa86kakHxo7fuq5/f6RrXrbMUeVUg+hXnLdWiqCxHD/tY8Rxp93CO7WenGeOLX/pqbSjXTVOWqJuGwzshL19pvaN7HJ70pqjNY0F1mGl7seANdQj2+vFxM6FyqiKYyDUgWZbD2/F4/MG6SkzH+GgmjBFlBEdjuXZ2meY5km0tWCXhmBamkMJ7fFziOrqgc/wy+8jlpF+5S98RyLKsRyCCMf4mdYZg+w+goli8), or an **editable** and **up to date** [CodeSandbox](https://codesandbox.io/s/vue-router-4-reproduction-s1sqc), Stackblitz, or a GitHub repository. A failing unit test is even better! Otherwise provide as much information as possible to reproduce the problem. If we can't reproduce the problem, we won't be able to give it a look **and the issue will be converted into a question and moved to discussions**."
1313
placeholder: Reproduction
1414
validations:
1515
required: true

.github/contributing.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ If you want to start translating the docs in a _new_ language:
126126
1. Create the corresponding `<lang>` sub-folder for your translation.
127127
2. Modify the i18n configuration in the `.vitepress` sub-folder.
128128
3. Translate the docs and run the doc site to self-test locally.
129-
4. Create a checkpoint for your language by running `pnpm run docs:translation-status <lang> [<commit>]`. A checkpoint is the hash and date of the latest commit when you do the translation. The checkpoint information is stored in the status file `packages/docs/.vitepress/translation-status.json`. _It's crucial for long-term maintenance since all the further translation sync-ups are based on their previous checkpoints._ Usually, you can skip the commit argument because the default value is `main`.
129+
4. Create a checkpoint for your language by running `pnpm run docs:translation:update <lang> [<commit>]`. A checkpoint is the hash and date of the latest commit when you do the translation. The checkpoint information is stored in the status file `packages/docs/.vitepress/translation-status.json`. _It's crucial for long-term maintenance since all the further translation sync-ups are based on their previous checkpoints._ Usually, you can skip the commit argument because the default value is `main`.
130130
5. Commit all the changes and create a pull request to our GitHub repo.
131131

132132
We will have a paragraph at the top of each translation page that shows the translation status. That way, users can quickly determine if the translation is up-to-date or lags behind the English version.
@@ -135,9 +135,9 @@ Speaking of the up-to-date translation, we also need good long-term maintenance
135135

136136
1. See what translation you need to sync up with the original docs. There are two popular ways:
137137
1. Via the [GitHub Compare](https://github.com/vuejs/router/compare/) page, only see the changes in `packages/docs/*` from the checkpoint hash to `main` branch. You can find the checkpoint hash for your language via the translation status file `packages/docs/.vitepress/translation-status.json`. The compare page can be directly opened with the hash as part of the URL, e.g. https://github.com/vuejs/router/compare/e008551...main
138-
2. Via a local command: `pnpm run docs:compare-to-translate <lang> [<commit>]`.
138+
2. Via a local command: `pnpm run docs:translation:compare <lang> [<commit>]`.
139139
2. Create your own branch and start the translation update, following the previous comparison.
140-
3. Create a checkpoint for your language by running `pnpm run docs:translation-status <lang> [<commit>]`.
140+
3. Create a checkpoint for your language by running `pnpm run docs:translation:update <lang> [<commit>]`.
141141
4. Commit all the changes and create a pull request to our GitHub repo.
142142

143143
<!-- TODO: add an example once we have got one -->
@@ -149,18 +149,18 @@ You can also host the translation on your own. To create one, fork our GitHub re
149149
- Ensure you maintain the _checkpoint_ properly. Also, ensure the _translation status_ is well-displayed on the top of each translation page.
150150
- Utilize the diff result between the latest official repository and your own checkpoint to guide your translation.
151151

152-
Tip: you can add the official repo as a remote to your forked repo. This way, you can still run `pnpm run docs:translation-status <lang> [<commit>]` and `npm run docs:compare-to-translate <lang> [<commit>]` to get the checkpoint and diff result:
152+
Tip: you can add the official repo as a remote to your forked repo. This way, you can still run `pnpm run docs:translation:update <lang> [<commit>]` and `npm run docs:translation:compare <lang> [<commit>]` to get the checkpoint and diff result:
153153

154154
```bash
155155
# prepare the upstream remote
156156
git remote add upstream [email protected]:vuejs/router.git
157157
git fetch upstream main
158158

159159
# set the checkpoint
160-
pnpm run docs:translation-status <lang> upstream/main
160+
pnpm run docs:translation:update <lang> upstream/main
161161

162162
# get the diff result
163-
pnpm run docs:compare-to-translate <lang> upstream/main
163+
pnpm run docs:translation:compare <lang> upstream/main
164164
```
165165

166166
<!-- TODO: add an example once we have got one -->

.github/workflows/pkg.pr.new.yml

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
name: Publish Any Commit
2+
3+
on:
4+
pull_request:
5+
branches: main
6+
paths-ignore:
7+
- 'packages/docs/**'
8+
- 'packages/playground/**'
9+
10+
push:
11+
branches:
12+
- '**'
13+
tags:
14+
- '!**'
15+
paths-ignore:
16+
- 'packages/docs/**'
17+
- 'packages/playground/**'
18+
19+
jobs:
20+
build:
21+
runs-on: ubuntu-latest
22+
23+
steps:
24+
- name: Checkout code
25+
uses: actions/checkout@v4
26+
with:
27+
fetch-depth: 0
28+
- uses: pnpm/action-setup@v4
29+
- uses: actions/setup-node@v4
30+
with:
31+
node-version: lts/*
32+
cache: pnpm
33+
34+
- name: Install
35+
run: pnpm install --frozen-lockfile
36+
37+
- name: Build
38+
run: pnpm -C packages/router build
39+
40+
- name: Build DTS
41+
run: pnpm -C packages/router build:dts
42+
43+
- name: Release
44+
run: pnpm dlx pkg-pr-new publish --compact --pnpm './packages/*'

.github/workflows/test.yml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ name: test
22

33
on:
44
push:
5+
branches:
6+
- main
57
paths-ignore:
68
- 'packages/docs/**'
79
- 'packages/playground/**'
810
pull_request:
11+
branches:
12+
- main
913
paths-ignore:
1014
- 'packages/docs/**'
1115
- 'packages/playground/**'
@@ -15,14 +19,12 @@ jobs:
1519
runs-on: ubuntu-latest
1620

1721
steps:
18-
- uses: actions/checkout@v3
19-
- uses: pnpm/action-setup@v2
22+
- uses: actions/checkout@v4
23+
- uses: pnpm/action-setup@v4
24+
- uses: actions/setup-node@v4
2025
with:
21-
version: 8.5.0
22-
- uses: actions/setup-node@v3
23-
with:
24-
node-version: '18'
25-
cache: 'pnpm'
26+
node-version: 'lts/*'
27+
cache: pnpm
2628
- name: 'BrowserStack Env Setup'
2729
uses: 'browserstack/github-actions/setup-env@master'
2830
# forks do not have access to secrets so just skip this
@@ -33,16 +35,17 @@ jobs:
3335

3436
- run: pnpm install
3537
- run: pnpm run lint
36-
- run: pnpm run -r test:types
37-
- run: pnpm run -r test:unit
3838
- run: pnpm run -r build
3939
- run: pnpm run -r build:dts
40-
- run: pnpm run -r test:dts
40+
- run: pnpm run -r test:types
41+
- run: pnpm run -r test:unit
4142

4243
# e2e tests that that run locally
4344
- run: pnpm run -r test:e2e:ci
4445

45-
- uses: codecov/codecov-action@v2
46+
- uses: codecov/codecov-action@v4
47+
with:
48+
token: ${{ secrets.CODECOV_TOKEN }}
4649

4750
# - name: 'Start BrowserStackLocal Tunnel'
4851
# uses: 'browserstack/github-actions/setup-local@master'

README.md

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# vue-router [![release candidate](https://img.shields.io/npm/v/vue-router.svg)](https://www.npmjs.com/package/vue-router) [![test](https://github.com/vuejs/router/actions/workflows/test.yml/badge.svg)](https://github.com/vuejs/router/actions/workflows/test.yml)
1+
# vue-router [![release candidate](https://img.shields.io/npm/v/vue-router.svg)](https://www.npmjs.com/package/vue-router) [![test](https://github.com/vuejs/router/actions/workflows/test.yml/badge.svg)](https://github.com/vuejs/router/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/vuejs/router/graph/badge.svg?token=azNM3FI0d1)](https://codecov.io/gh/vuejs/router)
22

33
> - This is the repository for Vue Router 4 (for Vue 3)
44
> - For Vue Router 3 (for Vue 2) see [vuejs/vue-router](https://github.com/vuejs/vue-router).
@@ -14,10 +14,10 @@ Vue Router is part of the Vue Ecosystem and is an MIT-licensed open source proje
1414

1515
<h4 align="center">Silver Sponsors</h4>
1616
<p align="center">
17-
<a href="https://www.vuemastery.com/" target="_blank" rel="noopener noreferrer">
17+
<a href="https://route4me.com" target="_blank" rel="noopener noreferrer">
1818
<picture>
19-
<source srcset="https://posva-sponsors.pages.dev/logos/vuemastery-dark.png" media="(prefers-color-scheme: dark)" height="42px" alt="VueMastery" />
20-
<img src="https://posva-sponsors.pages.dev/logos/vuemastery-light.svg" height="42px" alt="VueMastery" />
19+
<source srcset="https://posva-sponsors.pages.dev/logos/route4me.png" media="(prefers-color-scheme: dark)" height="42px" alt="Route Optimizer and Route Planner Software" />
20+
<img src="https://posva-sponsors.pages.dev/logos/route4me.png" height="42px" alt="Route Optimizer and Route Planner Software" />
2121
</picture>
2222
</a>
2323
<a href="https://www.prefect.io/" target="_blank" rel="noopener noreferrer">
@@ -26,32 +26,38 @@ Vue Router is part of the Vue Ecosystem and is an MIT-licensed open source proje
2626
<img src="https://posva-sponsors.pages.dev/logos/prefectlogo-light.svg" height="42px" alt="Prefect" />
2727
</picture>
2828
</a>
29+
<a href="https://www.vuemastery.com/" target="_blank" rel="noopener noreferrer">
30+
<picture>
31+
<source srcset="https://posva-sponsors.pages.dev/logos/vuemastery-dark.png" media="(prefers-color-scheme: dark)" height="42px" alt="VueMastery" />
32+
<img src="https://posva-sponsors.pages.dev/logos/vuemastery-light.svg" height="42px" alt="VueMastery" />
33+
</picture>
34+
</a>
2935
</p>
3036

3137
<h4 align="center">Bronze Sponsors</h4>
3238
<p align="center">
33-
<a href="https://stormier.ninja" target="_blank" rel="noopener noreferrer">
39+
<a href="https://storyblok.com" target="_blank" rel="noopener noreferrer">
3440
<picture>
35-
<source srcset="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Stanislas Ormières" />
36-
<img src="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" height="26px" alt="Stanislas Ormières" />
41+
<source srcset="https://posva-sponsors.pages.dev/logos/storyblok.png" media="(prefers-color-scheme: dark)" height="26px" alt="Storyblok" />
42+
<img src="https://posva-sponsors.pages.dev/logos/storyblok.png" height="26px" alt="Storyblok" />
3743
</picture>
3844
</a>
39-
<a href="https://www.vuejs.de" target="_blank" rel="noopener noreferrer">
45+
<a href="https://ui.nuxt.com/pro" target="_blank" rel="noopener noreferrer">
4046
<picture>
41-
<source srcset="https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Antony Konstantinidis" />
42-
<img src="https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4" height="26px" alt="Antony Konstantinidis" />
47+
<source srcset="https://posva-sponsors.pages.dev/logos/nuxt-dark.svg" media="(prefers-color-scheme: dark)" height="26px" alt="Nuxt UI Pro Templates" />
48+
<img src="https://posva-sponsors.pages.dev/logos/nuxt-light.svg" height="26px" alt="Nuxt UI Pro Templates" />
4349
</picture>
4450
</a>
45-
<a href="https://storyblok.com" target="_blank" rel="noopener noreferrer">
51+
<a href="https://www.vuejs.de" target="_blank" rel="noopener noreferrer">
4652
<picture>
47-
<source srcset="https://posva-sponsors.pages.dev/logos/storyblok.png" media="(prefers-color-scheme: dark)" height="26px" alt="Storyblok" />
48-
<img src="https://posva-sponsors.pages.dev/logos/storyblok.png" height="26px" alt="Storyblok" />
53+
<source srcset="https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Antony Konstantinidis" />
54+
<img src="https://avatars.githubusercontent.com/u/4183726?u=6b50a8ea16de29d2982f43c5640b1db9299ebcd1&v=4" height="26px" alt="Antony Konstantinidis" />
4955
</picture>
5056
</a>
51-
<a href="https://ui.nuxt.com/pro" target="_blank" rel="noopener noreferrer">
57+
<a href="https://stormier.ninja" target="_blank" rel="noopener noreferrer">
5258
<picture>
53-
<source srcset="https://avatars.githubusercontent.com/u/81570812?v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Nuxt UI Pro Templates" />
54-
<img src="https://avatars.githubusercontent.com/u/81570812?v=4" height="26px" alt="Nuxt UI Pro Templates" />
59+
<source srcset="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" media="(prefers-color-scheme: dark)" height="26px" alt="Stanislas Ormières" />
60+
<img src="https://avatars.githubusercontent.com/u/2486424?u=7b0c73ae5d090ce53bf59473094e9606fe082c59&v=4" height="26px" alt="Stanislas Ormières" />
5561
</picture>
5662
</a>
5763
</p>

SECURITY.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Reporting a Vulnerability
2+
3+
To report a vulnerability, please email [email protected].
4+
5+
While the discovery of new vulnerabilities is rare, we also recommend always using the latest versions of Vue and its official companion libraries to ensure your application remains as secure as possible.

codecov.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
coverage:
2+
status:
3+
patch: off
4+
project:
5+
default:
6+
threshold: 2%

package.json

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
{
22
"name": "@vue/router-root",
33
"private": true,
4-
"packageManager": "pnpm@8.10.2",
4+
"packageManager": "pnpm@9.10.0",
55
"engines": {
6-
"node": ">=18.14.0"
6+
"node": ">=20.9.0"
77
},
88
"workspaces": [
99
"packages/*"
@@ -15,8 +15,9 @@
1515
"build:dts": "pnpm run -r build:dts",
1616
"docs": "pnpm run --filter ./packages/docs -r docs",
1717
"docs:api": "pnpm run --filter ./packages/docs -r docs:api",
18-
"docs:compare-to-translate": "pnpm run --filter ./packages/docs -r docs:compare-to-translate",
19-
"docs:translation-status": "pnpm run --filter ./packages/docs -r docs:translation-status",
18+
"docs:translation:compare": "pnpm run --filter ./packages/docs -r docs:translation:compare",
19+
"docs:translation:update": "pnpm run --filter ./packages/docs -r docs:translation:update",
20+
"docs:translation:status": "pnpm run --filter ./packages/docs -r docs:translation:status",
2021
"docs:build": "pnpm run docs:api && pnpm run --filter ./packages/docs -r docs:build",
2122
"docs:preview": "pnpm run --filter ./packages/docs -r docs:preview",
2223
"play": "pnpm run -r play",
@@ -31,16 +32,16 @@
3132
"brotli": "^1.3.3",
3233
"chalk": "^5.3.0",
3334
"enquirer": "^2.4.1",
34-
"execa": "^8.0.1",
35-
"globby": "^14.0.0",
36-
"lint-staged": "^15.2.0",
35+
"execa": "^9.3.1",
36+
"globby": "^14.0.2",
37+
"lint-staged": "^15.2.10",
3738
"minimist": "^1.2.8",
3839
"p-series": "^3.0.0",
3940
"prettier": "^2.8.8",
40-
"semver": "^7.5.4",
41-
"typedoc": "^0.25.3",
41+
"semver": "^7.6.3",
42+
"typedoc": "^0.25.8",
4243
"typedoc-plugin-markdown": "^3.17.1",
43-
"typescript": "~5.1.6",
44+
"typescript": "~5.3.3",
4445
"yorkie": "^2.0.0"
4546
},
4647
"gitHooks": {
@@ -65,6 +66,6 @@
6566
}
6667
},
6768
"volta": {
68-
"node": "18.16.0"
69+
"node": "20.11.1"
6970
}
7071
}

packages/docs/.vitepress/config/en.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
4646
},
4747
{
4848
text: 'Vue.js Certification',
49-
link: 'https://certification.vuejs.org/?friend=VUEROUTER',
49+
link: 'https://certificates.dev/vuejs/?friend=VUEROUTER&utm_source=router_vuejs&utm_medium=link&utm_campaign=router_vuejs_links&utm_content=navbar',
5050
},
5151
],
5252
},
@@ -70,7 +70,6 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
7070
},
7171
{
7272
text: 'Essentials',
73-
collapsible: false,
7473
items: [
7574
{
7675
text: 'Getting Started',
@@ -84,6 +83,10 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
8483
text: "Routes' Matching Syntax",
8584
link: '/guide/essentials/route-matching-syntax.html',
8685
},
86+
{
87+
text: 'Named Routes',
88+
link: '/guide/essentials/named-routes.html',
89+
},
8790
{
8891
text: 'Nested Routes',
8992
link: '/guide/essentials/nested-routes.html',
@@ -92,10 +95,6 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
9295
text: 'Programmatic Navigation',
9396
link: '/guide/essentials/navigation.html',
9497
},
95-
{
96-
text: 'Named Routes',
97-
link: '/guide/essentials/named-routes.html',
98-
},
9998
{
10099
text: 'Named Views',
101100
link: '/guide/essentials/named-views.html',
@@ -108,6 +107,10 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
108107
text: 'Passing Props to Route Components',
109108
link: '/guide/essentials/passing-props.html',
110109
},
110+
{
111+
text: 'Active links',
112+
link: '/guide/essentials/active-links.html',
113+
},
111114
{
112115
text: 'Different History modes',
113116
link: '/guide/essentials/history-mode.html',
@@ -116,7 +119,6 @@ export const enConfig: LocaleSpecificConfig<DefaultTheme.Config> = {
116119
},
117120
{
118121
text: 'Advanced',
119-
collapsible: false,
120122
items: [
121123
{
122124
text: 'Navigation guards',

packages/docs/.vitepress/config/shared.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { defineConfig, HeadConfig } from 'vitepress'
2+
import { zhSearch } from './zh'
23

34
// TODO:
45
// export const META_IMAGE = 'https://router.vuejs.org/social.png'
@@ -143,10 +144,14 @@ export const sharedConfig = defineConfig({
143144
text: 'Suggest changes',
144145
},
145146

146-
algolia: {
147-
appId: 'BTNTW3I1XP',
148-
apiKey: '771d10c8c5cc48f7922f15048b4d931c',
149-
indexName: 'next_router_vuejs',
147+
search: {
148+
provider: 'algolia',
149+
options: {
150+
appId: 'BTNTW3I1XP',
151+
apiKey: '771d10c8c5cc48f7922f15048b4d931c',
152+
indexName: 'next_router_vuejs',
153+
locales: { ...zhSearch },
154+
},
150155
},
151156

152157
carbonAds: {

0 commit comments

Comments
 (0)