122 Commits

Author SHA1 Message Date
Fabrice Lamant
7b89ab9ccd Merge pull request #167 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-70b575c51e
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump fs-extra from 11.3.3 to 11.3.4 in /scraper in the dependencies-patch-and-minor group
2026-03-04 00:25:26 +01:00
dependabot[bot]
4d3062351a npm(deps): bump fs-extra
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [fs-extra](https://github.com/jprichardson/node-fs-extra).


Updates `fs-extra` from 11.3.3 to 11.3.4
- [Changelog](https://github.com/jprichardson/node-fs-extra/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jprichardson/node-fs-extra/compare/11.3.3...11.3.4)

---
updated-dependencies:
- dependency-name: fs-extra
  dependency-version: 11.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-03 23:25:18 +00:00
Fabrice Lamant
49b478c21c Merge pull request #166 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-d100afd93f
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/node from 24.10.15 to 24.11.0 in /scraper in the dependencies-patch-and-minor group
2026-03-03 01:38:43 +01:00
dependabot[bot]
b605b0b6dc npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.15 to 24.11.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.11.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-03 00:38:36 +00:00
Fabrice Lamant
174b401522 Merge pull request #165 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-ea2e6f3351
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump axios from 1.13.5 to 1.13.6 in /scraper in the dependencies-patch-and-minor group
2026-02-28 00:25:06 +01:00
dependabot[bot]
bd7078654c npm(deps): bump axios
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [axios](https://github.com/axios/axios).


Updates `axios` from 1.13.5 to 1.13.6
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.5...v1.13.6)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-27 23:24:58 +00:00
Fabrice Lamant
8d11faba5d Merge pull request #164 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-5aec3daba0
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/node from 20.19.33 to 20.19.35 in /ui in the dependencies-patch-and-minor group
2026-02-27 02:00:07 +01:00
Fabrice Lamant
d54ae00f95 Merge pull request #163 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-c547b59165
npm(deps-dev): bump @types/node from 24.10.13 to 24.10.15 in /scraper in the dependencies-patch-and-minor group
2026-02-27 01:00:07 +01:00
dependabot[bot]
e9043e58f6 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 20.19.33 to 20.19.35
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.35
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-26 23:25:18 +00:00
dependabot[bot]
f50e317d3d npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.13 to 24.10.15
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-26 23:25:10 +00:00
Fabrice Lamant
5bdbe268cb Merge pull request #162 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-60db5e4afa
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump typescript-eslint from 8.56.0 to 8.56.1 in /scraper in the dependencies-patch-and-minor group
2026-02-24 04:00:09 +01:00
Fabrice Lamant
3208fd9e55 Merge pull request #161 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-13cb420751
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 2 updates
2026-02-24 02:00:07 +01:00
dependabot[bot]
1420c9f4b9 npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.56.0 to 8.56.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.56.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.56.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 00:16:34 +00:00
dependabot[bot]
576678e5e5 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 2 updates: [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/postcss` from 4.2.0 to 4.2.1
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/@tailwindcss-postcss)

Updates `tailwindcss` from 4.2.0 to 4.2.1
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.1/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.2.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: tailwindcss
  dependency-version: 4.2.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-24 00:16:32 +00:00
Fabrice Lamant
64edfb7e7d Merge pull request #159 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-ae9f313a12
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 2 updates
2026-02-21 00:25:36 +01:00
Fabrice Lamant
a31435ee6d Merge pull request #160 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-70f5fb8fec
npm(deps): bump the dependencies-patch-and-minor group in /scraper with 3 updates
2026-02-21 00:25:33 +01:00
dependabot[bot]
3f85fd46cc npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 3 updates: [nodemon](https://github.com/remy/nodemon), [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) and [eslint](https://github.com/eslint/eslint).


Updates `nodemon` from 3.1.13 to 3.1.14
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v3.1.13...v3.1.14)

Updates `@eslint/js` from 9.39.2 to 9.39.3
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/commits/v9.39.3/packages/js)

Updates `eslint` from 9.39.2 to 9.39.3
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.39.2...v9.39.3)

---
updated-dependencies:
- dependency-name: nodemon
  dependency-version: 3.1.14
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@eslint/js"
  dependency-version: 9.39.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint
  dependency-version: 9.39.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-20 23:25:22 +00:00
dependabot[bot]
2b3e5d0a84 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 2 updates: [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui) and [eslint](https://github.com/eslint/eslint).


Updates `daisyui` from 5.5.18 to 5.5.19
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.19/packages/daisyui)

Updates `eslint` from 9.39.2 to 9.39.3
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.39.2...v9.39.3)

---
updated-dependencies:
- dependency-name: daisyui
  dependency-version: 5.5.19
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint
  dependency-version: 9.39.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-20 23:25:21 +00:00
Fabrice Lamant
4b2c437478 Merge pull request #158 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-2ed8a92f69
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump nodemon from 3.1.11 to 3.1.13 in /scraper in the dependencies-patch-and-minor group
2026-02-20 00:25:44 +01:00
dependabot[bot]
665424eb32 npm(deps): bump nodemon
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [nodemon](https://github.com/remy/nodemon).


Updates `nodemon` from 3.1.11 to 3.1.13
- [Release notes](https://github.com/remy/nodemon/releases)
- [Commits](https://github.com/remy/nodemon/compare/v3.1.11...v3.1.13)

---
updated-dependencies:
- dependency-name: nodemon
  dependency-version: 3.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-19 23:25:37 +00:00
Fabrice Lamant
8cd086d5b2 Merge pull request #157 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-90af11599f
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 2 updates
2026-02-19 00:25:39 +01:00
dependabot[bot]
ae46b76bc6 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 2 updates: [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) and [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss).


Updates `@tailwindcss/postcss` from 4.1.18 to 4.2.0
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.0/packages/@tailwindcss-postcss)

Updates `tailwindcss` from 4.1.18 to 4.2.0
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.2.0/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
- dependency-name: tailwindcss
  dependency-version: 4.2.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-18 23:25:30 +00:00
Fabrice Lamant
ad410ff949 Merge pull request #156 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-1700d68603
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump typescript-eslint from 8.55.0 to 8.56.0 in /scraper in the dependencies-patch-and-minor group
2026-02-17 00:27:56 +01:00
dependabot[bot]
ecc30c8adb npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.55.0 to 8.56.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.56.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.56.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-16 23:27:49 +00:00
Fabrice LAMANT
839bb31316 fix mime type
Some checks failed
Build / Build (push) Has been cancelled
2026-02-16 10:46:31 +01:00
Fabrice LAMANT
27c2c871d7 fix unknown noc 2026-02-16 10:39:52 +01:00
Fabrice LAMANT
45de0c8a39 fix null noc
Some checks failed
Build / Build (push) Has been cancelled
2026-02-14 15:50:46 +01:00
Fabrice Lamant
7d4b574be4 Merge pull request #155 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-5aac21afc0
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/react from 19.2.13 to 19.2.14 in /ui in the dependencies-patch-and-minor group
2026-02-12 00:25:46 +01:00
dependabot[bot]
50da758886 npm(deps-dev): bump @types/react
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.2.13 to 19.2.14
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-11 23:25:36 +00:00
Fabrice Lamant
b3c766fe37 Merge pull request #154 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-df0b777b82
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/node from 24.10.12 to 24.10.13 in /scraper in the dependencies-patch-and-minor group
2026-02-11 00:25:33 +01:00
dependabot[bot]
441fbe37ac npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.12 to 24.10.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 23:25:26 +00:00
Fabrice Lamant
6d5273c0fd Merge pull request #153 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-b15111a814
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump the dependencies-patch-and-minor group in /scraper with 3 updates
2026-02-10 03:00:05 +01:00
Fabrice Lamant
425c932b9f Merge pull request #152 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-9297c953dc
npm(deps-dev): bump @types/node from 20.19.32 to 20.19.33 in /ui in the dependencies-patch-and-minor group
2026-02-10 02:40:56 +01:00
dependabot[bot]
927ad6bcd4 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 3 updates: [axios](https://github.com/axios/axios), [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `axios` from 1.13.4 to 1.13.5
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.4...v1.13.5)

Updates `@types/node` from 24.10.11 to 24.10.12
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.54.0 to 8.55.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.55.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@types/node"
  dependency-version: 24.10.12
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: typescript-eslint
  dependency-version: 8.55.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 01:40:51 +00:00
dependabot[bot]
12c825db8c npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 20.19.32 to 20.19.33
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.33
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-10 01:40:45 +00:00
Fabrice LAMANT
ce2d067999 set mime type and correct line returns
Some checks failed
Build / Build (push) Has been cancelled
2026-02-08 11:14:20 +01:00
Fabrice LAMANT
278383e4d0 set mime type and correct line returns 2026-02-08 11:14:11 +01:00
Fabrice LAMANT
23844d5417 set encoding on file forwarding
Some checks failed
Build / Build (push) Has been cancelled
2026-02-06 22:32:33 +01:00
Fabrice LAMANT
67554b78b2 remove sorting on event type filter 2026-02-06 22:25:27 +01:00
Fabrice LAMANT
282c855eeb filter by medal events only 2026-02-06 22:22:20 +01:00
Fabrice LAMANT
a98bc2178f use path instead of querystring for filters 2026-02-06 21:05:10 +01:00
Fabrice Lamant
aa7b55c320 Merge pull request #149 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-529e71a9e4
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 3 updates
2026-02-06 00:26:06 +01:00
dependabot[bot]
189448ae9a npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui).


Updates `@types/node` from 20.19.31 to 20.19.32
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/react` from 19.2.11 to 19.2.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `daisyui` from 5.5.17 to 5.5.18
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.18/packages/daisyui)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.32
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@types/react"
  dependency-version: 19.2.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: daisyui
  dependency-version: 5.5.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-05 23:25:58 +00:00
Fabrice Lamant
ca16a7a22b Merge pull request #148 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-715e77fcad
npm(deps-dev): bump @types/node from 24.10.10 to 24.10.11 in /scraper in the dependencies-patch-and-minor group
2026-02-06 00:25:57 +01:00
dependabot[bot]
eb1502ed01 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.10 to 24.10.11
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-05 23:25:49 +00:00
Fabrice LAMANT
740604b280 add nocs to live events page
Some checks failed
Build / Build (push) Has been cancelled
2026-02-05 16:59:58 +01:00
Fabrice Lamant
d01d063b17 Merge pull request #146 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-f2edba66eb
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/react from 19.2.10 to 19.2.11 in /ui in the dependencies-patch-and-minor group
2026-02-05 00:25:49 +01:00
dependabot[bot]
852663d7f9 npm(deps-dev): bump @types/react
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.2.10 to 19.2.11
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-04 23:25:42 +00:00
Fabrice LAMANT
d0afdc430a force encoding 2026-02-04 23:02:20 +01:00
Fabrice LAMANT
f77a37ca02 responsive 2026-02-04 23:02:06 +01:00
Fabrice LAMANT
e909a1fa23 responsive list of events
Some checks failed
Build / Build (push) Has been cancelled
2026-02-04 20:37:15 +01:00
Fabrice LAMANT
c54196c89e fix: wrong header date 2026-02-04 19:39:15 +01:00
Fabrice LAMANT
3b3db375b5 fix: cancelled event 2026-02-04 19:39:01 +01:00
Fabrice LAMANT
06fe12bee4 fix date format to utc 2026-02-04 15:59:29 +01:00
Fabrice LAMANT
57d8aa96e6 fix TBD teams 2026-02-04 15:46:03 +01:00
Fabrice LAMANT
d363c46c5a add proxy before url 2026-02-04 15:32:55 +01:00
Fabrice LAMANT
f910dd97da update cron to 10 minutes
Some checks failed
Build / Build (push) Has been cancelled
2026-02-04 09:33:12 +01:00
Fabrice LAMANT
fe5e902c4e fix ui build 2026-02-04 09:32:25 +01:00
Fabrice LAMANT
b7e4dc2ae4 official website update 2026-02-04 09:28:33 +01:00
Fabrice Lamant
d48d904f95 Merge pull request #142 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-a96bcd59ed
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump @types/node from 20.19.30 to 20.19.31 in /ui in the dependencies-patch-and-minor group
2026-02-04 00:26:09 +01:00
Fabrice Lamant
d084d63e6a Merge pull request #141 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-878108dc54
npm(deps-dev): bump @types/node from 24.10.9 to 24.10.10 in /scraper in the dependencies-patch-and-minor group
2026-02-04 00:26:03 +01:00
dependabot[bot]
4c882caa99 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 20.19.30 to 20.19.31
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.31
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 23:26:00 +00:00
dependabot[bot]
8e54d8568c npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.9 to 24.10.10
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 23:25:55 +00:00
Fabrice Lamant
b016588435 Merge pull request #139 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-742ffb669d
Some checks failed
Build / Build (push) Has been cancelled
npm(deps-dev): bump daisyui from 5.5.14 to 5.5.17 in /ui in the dependencies-patch-and-minor group
2026-02-03 05:25:33 +01:00
dependabot[bot]
ded62e31da npm(deps-dev): bump daisyui
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui).


Updates `daisyui` from 5.5.14 to 5.5.17
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.17/packages/daisyui)

---
updated-dependencies:
- dependency-name: daisyui
  dependency-version: 5.5.17
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-03 04:25:25 +00:00
Fabrice Lamant
7167ac2e7f Merge pull request #138 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-bd4a4a81fd
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump the dependencies-patch-and-minor group in /ui with 4 updates
2026-01-28 00:26:24 +01:00
dependabot[bot]
1afb44ddbb npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 4 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js), [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.1.5 to 16.1.6
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.6/packages/third-parties)

Updates `next` from 16.1.5 to 16.1.6
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.5...v16.1.6)

Updates `@types/react` from 19.2.9 to 19.2.10
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `eslint-config-next` from 16.1.5 to 16.1.6
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.6/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@types/react"
  dependency-version: 19.2.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 23:26:17 +00:00
Fabrice Lamant
ff766aa1b9 Merge pull request #137 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-4953ba4782
npm(deps): bump axios from 1.13.3 to 1.13.4 in /scraper in the dependencies-patch-and-minor group
2026-01-28 00:25:40 +01:00
dependabot[bot]
689dc28424 npm(deps): bump axios
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [axios](https://github.com/axios/axios).


Updates `axios` from 1.13.3 to 1.13.4
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.3...v1.13.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 23:25:32 +00:00
Fabrice Lamant
fca3d987d0 Merge pull request #136 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-d57acc8ecb
Some checks failed
Build / Build (push) Has been cancelled
npm(deps): bump the dependencies-patch-and-minor group in /ui with 5 updates
2026-01-27 01:34:20 +01:00
dependabot[bot]
ed09fc1c5b npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 5 updates:

| Package | From | To |
| --- | --- | --- |
| [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties) | `16.1.4` | `16.1.5` |
| [next](https://github.com/vercel/next.js) | `16.1.4` | `16.1.5` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.2.3` | `19.2.4` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.2.3` | `19.2.4` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `16.1.4` | `16.1.5` |


Updates `@next/third-parties` from 16.1.4 to 16.1.5
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.5/packages/third-parties)

Updates `next` from 16.1.4 to 16.1.5
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.4...v16.1.5)

Updates `react` from 19.2.3 to 19.2.4
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.4/packages/react)

Updates `react-dom` from 19.2.3 to 19.2.4
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/v19.2.4/packages/react-dom)

Updates `eslint-config-next` from 16.1.4 to 16.1.5
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.5/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: react
  dependency-version: 19.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: react-dom
  dependency-version: 19.2.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 00:34:12 +00:00
Fabrice Lamant
c04298d0ff Merge pull request #135 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-7cdb73432b
npm(deps): bump the dependencies-patch-and-minor group in /scraper with 2 updates
2026-01-27 01:33:45 +01:00
dependabot[bot]
c861199021 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 2 updates: [axios](https://github.com/axios/axios) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `axios` from 1.13.2 to 1.13.3
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.13.2...v1.13.3)

Updates `typescript-eslint` from 8.53.1 to 8.54.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.54.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.13.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: typescript-eslint
  dependency-version: 8.54.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-27 00:33:37 +00:00
Fabrice Lamant
896ef28cbb Update sonar project key
Some checks failed
Build / Build (push) Has been cancelled
2026-01-21 22:38:19 +01:00
Fabrice Lamant
d18abfc87a Add GitHub Actions workflow for build process 2026-01-21 21:19:51 +01:00
Fabrice Lamant
a5d8772e5b Add sonar project key to sonar-project.properties 2026-01-21 21:19:02 +01:00
Fabrice Lamant
3ed23ef17b Merge pull request #134 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-b4040c84cd
npm(deps-dev): bump @types/react from 19.2.8 to 19.2.9 in /ui in the dependencies-patch-and-minor group
2026-01-21 00:26:08 +01:00
dependabot[bot]
0daf9c27b9 npm(deps-dev): bump @types/react
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.2.8 to 19.2.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.2.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-20 23:26:00 +00:00
Fabrice Lamant
70cc168c8a Merge pull request #133 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-21271d0288
npm(deps): bump the dependencies-patch-and-minor group in /ui with 3 updates
2026-01-20 01:04:51 +01:00
dependabot[bot]
fd3376cfc5 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.1.3 to 16.1.4
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.4/packages/third-parties)

Updates `next` from 16.1.3 to 16.1.4
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.3...v16.1.4)

Updates `eslint-config-next` from 16.1.3 to 16.1.4
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.4/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-20 00:04:44 +00:00
Fabrice Lamant
0ccad89144 Merge pull request #132 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-e77337c9c9
npm(deps-dev): bump typescript-eslint from 8.53.0 to 8.53.1 in /scraper in the dependencies-patch-and-minor group
2026-01-20 01:04:38 +01:00
dependabot[bot]
05b9f6f88f npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.53.0 to 8.53.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.53.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.53.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-20 00:04:30 +00:00
Fabrice Lamant
0c83db61c0 Merge pull request #131 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-ff34ea3b66
npm(deps): bump the dependencies-patch-and-minor group in /ui with 3 updates
2026-01-17 00:26:43 +01:00
dependabot[bot]
e5e7bf43c3 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.1.2 to 16.1.3
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.3/packages/third-parties)

Updates `next` from 16.1.2 to 16.1.3
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.2...v16.1.3)

Updates `eslint-config-next` from 16.1.2 to 16.1.3
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.3/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-16 23:26:35 +00:00
Fabrice Lamant
22f12f9deb Merge pull request #130 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-79ba6e658c
npm(deps-dev): bump @types/node from 20.19.29 to 20.19.30 in /ui in the dependencies-patch-and-minor group
2026-01-16 01:00:05 +01:00
dependabot[bot]
e443947eb8 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 20.19.29 to 20.19.30
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.30
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-15 23:25:55 +00:00
Fabrice Lamant
102007d77e Merge pull request #129 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-3b199061c7
npm(deps-dev): bump @types/node from 24.10.8 to 24.10.9 in /scraper in the dependencies-patch-and-minor group
2026-01-16 00:25:51 +01:00
dependabot[bot]
e5460be3fa npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.8 to 24.10.9
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-15 23:25:44 +00:00
Fabrice Lamant
68b20bfb3c Merge pull request #128 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-a15dcf4280
npm(deps): bump the dependencies-patch-and-minor group in /ui with 3 updates
2026-01-15 00:27:08 +01:00
dependabot[bot]
f0408761e6 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.1.1 to 16.1.2
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.2/packages/third-parties)

Updates `next` from 16.1.1 to 16.1.2
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.1...v16.1.2)

Updates `eslint-config-next` from 16.1.1 to 16.1.2
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.2/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-14 23:27:00 +00:00
Fabrice Lamant
21523355bc Merge pull request #127 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-8f3abdc1a4
npm(deps-dev): bump @types/node from 20.19.28 to 20.19.29 in /ui in the dependencies-patch-and-minor group
2026-01-14 00:26:45 +01:00
dependabot[bot]
fe61accdd2 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 20.19.28 to 20.19.29
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.29
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 23:26:37 +00:00
Fabrice Lamant
3d0ee4d1b0 Merge pull request #126 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-cbc9cf69f0
npm(deps-dev): bump @types/node from 24.10.7 to 24.10.8 in /scraper in the dependencies-patch-and-minor group
2026-01-14 00:26:35 +01:00
dependabot[bot]
cdd8448125 npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.7 to 24.10.8
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 23:26:28 +00:00
Fabrice Lamant
510ab1654f Merge pull request #125 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-a42d34ab6c
npm(deps-dev): bump the dependencies-patch-and-minor group in /scraper with 2 updates
2026-01-13 04:45:13 +01:00
Fabrice Lamant
70895ba903 Merge pull request #124 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-c49837b0c4
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 2 updates
2026-01-13 04:45:10 +01:00
dependabot[bot]
08ba6cbba4 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 24.10.4 to 24.10.7
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.52.0 to 8.53.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.53.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.7
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: typescript-eslint
  dependency-version: 8.53.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 03:45:00 +00:00
dependabot[bot]
0eea8ffb91 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/node` from 20.19.27 to 20.19.28
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@types/react` from 19.2.7 to 19.2.8
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.28
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@types/react"
  dependency-version: 19.2.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-13 03:45:00 +00:00
Fabrice Lamant
81ae138747 Merge pull request #123 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-aac2e3be06
npm(deps-dev): bump typescript-eslint from 8.51.0 to 8.52.0 in /scraper in the dependencies-patch-and-minor group
2026-01-06 00:31:37 +01:00
dependabot[bot]
79fdc185bf npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.51.0 to 8.52.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.52.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.52.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-01-05 23:31:30 +00:00
Fabrice Lamant
5633b705f7 Merge pull request #122 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-45b166967a
npm(deps-dev): bump typescript-eslint from 8.50.1 to 8.51.0 in /scraper in the dependencies-patch-and-minor group
2025-12-30 00:22:56 +01:00
dependabot[bot]
87311545d0 npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.50.1 to 8.51.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.51.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.51.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-29 23:22:48 +00:00
Fabrice Lamant
28eb445250 Merge pull request #121 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-084c44ca92
npm(deps): bump the dependencies-patch-and-minor group in /ui with 3 updates
2025-12-23 00:26:50 +01:00
dependabot[bot]
ecdbf11a24 npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.1.0 to 16.1.1
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.1/packages/third-parties)

Updates `next` from 16.1.0 to 16.1.1
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.1.0...v16.1.1)

Updates `eslint-config-next` from 16.1.0 to 16.1.1
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.1/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 23:26:43 +00:00
Fabrice Lamant
0a34379020 Merge pull request #120 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-009a56cec0
npm(deps-dev): bump typescript-eslint from 8.50.0 to 8.50.1 in /scraper in the dependencies-patch-and-minor group
2025-12-23 00:26:23 +01:00
dependabot[bot]
c07bc41ef9 npm(deps-dev): bump typescript-eslint
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.50.0 to 8.50.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.50.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.50.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-22 23:26:16 +00:00
Fabrice Lamant
10a5ef7210 Merge pull request #119 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-91ca4a12d6
npm(deps): bump the dependencies-patch-and-minor group in /ui with 3 updates
2025-12-19 00:22:54 +01:00
dependabot[bot]
1718794d7f npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 3 updates: [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties), [next](https://github.com/vercel/next.js) and [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next).


Updates `@next/third-parties` from 16.0.10 to 16.1.0
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.0/packages/third-parties)

Updates `next` from 16.0.10 to 16.1.0
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.0.10...v16.1.0)

Updates `eslint-config-next` from 16.0.10 to 16.1.0
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.1.0/packages/eslint-config-next)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.1.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-18 23:22:46 +00:00
Fabrice Lamant
0b7149440c Merge pull request #118 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-ea13c0bda5
npm(deps-dev): bump the dependencies-patch-and-minor group in /scraper with 2 updates
2025-12-16 01:00:05 +01:00
Fabrice Lamant
919de2c922 Merge pull request #117 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-9167ed10f3
npm(deps-dev): bump the dependencies-patch-and-minor group in /ui with 2 updates
2025-12-16 00:27:56 +01:00
dependabot[bot]
0b05115465 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@types/node` from 24.10.3 to 24.10.4
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `typescript-eslint` from 8.49.0 to 8.50.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.50.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: typescript-eslint
  dependency-version: 8.50.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 23:27:55 +00:00
dependabot[bot]
c7f47bd56b npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 2 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) and [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui).


Updates `@types/node` from 20.19.26 to 20.19.27
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `daisyui` from 5.5.13 to 5.5.14
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.14/packages/daisyui)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.27
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: daisyui
  dependency-version: 5.5.14
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-15 23:27:48 +00:00
Fabrice Lamant
c4a94da9da Merge pull request #116 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-ca6bd95cb1
npm(deps-dev): bump eslint from 9.39.1 to 9.39.2 in /ui in the dependencies-patch-and-minor group
2025-12-13 01:00:04 +01:00
Fabrice Lamant
1df247b875 Merge pull request #115 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-ab633d47b1
npm(deps-dev): bump the dependencies-patch-and-minor group in /scraper with 2 updates
2025-12-13 00:38:22 +01:00
dependabot[bot]
1b6ebea812 npm(deps-dev): bump eslint
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [eslint](https://github.com/eslint/eslint).


Updates `eslint` from 9.39.1 to 9.39.2
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.39.1...v9.39.2)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 23:38:20 +00:00
dependabot[bot]
ce965e7962 npm(deps-dev): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /scraper with 2 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) and [eslint](https://github.com/eslint/eslint).


Updates `@eslint/js` from 9.39.1 to 9.39.2
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/commits/v9.39.2/packages/js)

Updates `eslint` from 9.39.1 to 9.39.2
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v9.39.1...v9.39.2)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint
  dependency-version: 9.39.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-12 23:38:15 +00:00
Fabrice Lamant
aa91cbc05b Merge pull request #114 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-9bfe028876
npm(deps): bump the dependencies-patch-and-minor group in /ui with 8 updates
2025-12-12 00:30:47 +01:00
dependabot[bot]
57c7d127fc npm(deps): bump the dependencies-patch-and-minor group
Bumps the dependencies-patch-and-minor group in /ui with 8 updates:

| Package | From | To |
| --- | --- | --- |
| [@next/third-parties](https://github.com/vercel/next.js/tree/HEAD/packages/third-parties) | `16.0.8` | `16.0.10` |
| [next](https://github.com/vercel/next.js) | `16.0.8` | `16.0.10` |
| [react](https://github.com/facebook/react/tree/HEAD/packages/react) | `19.2.1` | `19.2.3` |
| [react-dom](https://github.com/facebook/react/tree/HEAD/packages/react-dom) | `19.2.1` | `19.2.3` |
| [@tailwindcss/postcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/@tailwindcss-postcss) | `4.1.17` | `4.1.18` |
| [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui) | `5.5.11` | `5.5.13` |
| [eslint-config-next](https://github.com/vercel/next.js/tree/HEAD/packages/eslint-config-next) | `16.0.8` | `16.0.10` |
| [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) | `4.1.17` | `4.1.18` |


Updates `@next/third-parties` from 16.0.8 to 16.0.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.0.10/packages/third-parties)

Updates `next` from 16.0.8 to 16.0.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/compare/v16.0.8...v16.0.10)

Updates `react` from 19.2.1 to 19.2.3
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/react)

Updates `react-dom` from 19.2.1 to 19.2.3
- [Release notes](https://github.com/facebook/react/releases)
- [Changelog](https://github.com/facebook/react/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/react/commits/HEAD/packages/react-dom)

Updates `@tailwindcss/postcss` from 4.1.17 to 4.1.18
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.18/packages/@tailwindcss-postcss)

Updates `daisyui` from 5.5.11 to 5.5.13
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.13/packages/daisyui)

Updates `eslint-config-next` from 16.0.8 to 16.0.10
- [Release notes](https://github.com/vercel/next.js/releases)
- [Changelog](https://github.com/vercel/next.js/blob/canary/release.js)
- [Commits](https://github.com/vercel/next.js/commits/v16.0.10/packages/eslint-config-next)

Updates `tailwindcss` from 4.1.17 to 4.1.18
- [Release notes](https://github.com/tailwindlabs/tailwindcss/releases)
- [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.18/packages/tailwindcss)

---
updated-dependencies:
- dependency-name: "@next/third-parties"
  dependency-version: 16.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: next
  dependency-version: 16.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: react
  dependency-version: 19.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: react-dom
  dependency-version: 19.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: "@tailwindcss/postcss"
  dependency-version: 4.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: daisyui
  dependency-version: 5.5.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: eslint-config-next
  dependency-version: 16.0.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
- dependency-name: tailwindcss
  dependency-version: 4.1.18
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-11 23:30:39 +00:00
Fabrice Lamant
a5d5c1eee8 Merge pull request #113 from fabrice404/dependabot/npm_and_yarn/ui/dependencies-patch-and-minor-d6087f71ff
npm(deps-dev): bump daisyui from 5.5.8 to 5.5.11 in /ui in the dependencies-patch-and-minor group
2025-12-11 01:00:04 +01:00
Fabrice Lamant
b9a508da19 Merge pull request #112 from fabrice404/dependabot/npm_and_yarn/scraper/dependencies-patch-and-minor-e68fff4225
npm(deps-dev): bump @types/node from 24.10.2 to 24.10.3 in /scraper in the dependencies-patch-and-minor group
2025-12-11 00:20:51 +01:00
dependabot[bot]
b1651fe7e9 npm(deps-dev): bump daisyui
Bumps the dependencies-patch-and-minor group in /ui with 1 update: [daisyui](https://github.com/saadeghi/daisyui/tree/HEAD/packages/daisyui).


Updates `daisyui` from 5.5.8 to 5.5.11
- [Release notes](https://github.com/saadeghi/daisyui/releases)
- [Changelog](https://github.com/saadeghi/daisyui/blob/master/CHANGELOG.md)
- [Commits](https://github.com/saadeghi/daisyui/commits/v5.5.11/packages/daisyui)

---
updated-dependencies:
- dependency-name: daisyui
  dependency-version: 5.5.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 23:20:45 +00:00
dependabot[bot]
7380235ffb npm(deps-dev): bump @types/node
Bumps the dependencies-patch-and-minor group in /scraper with 1 update: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node).


Updates `@types/node` from 24.10.2 to 24.10.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.10.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: dependencies-patch-and-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-12-10 23:20:43 +00:00
19 changed files with 1450 additions and 1043 deletions

19
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,19 @@
name: Build
on:
push:
branches:
- main
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: sonarsource/sonarqube-scan-action@master
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}

View File

@@ -5,7 +5,7 @@ export class Cache {
private debug = Debug("olympics-calendar:cache");
private cachePath = (key: string): string => {
return `./cache/${key}.cached`;
return `./cache/${key}.json`;
};
public get(key: string): string | null {
@@ -27,6 +27,6 @@ export class Cache {
this.debug(`set: key=${key}`);
const path = this.cachePath(key);
mkdirSync(path.split("/").slice(0, -1).join("/"), { recursive: true });
writeFileSync(path, data);
writeFileSync(path, data, "utf-8");
}
}

View File

@@ -13,6 +13,23 @@ export class ICSGenerator {
this.calendar = calendar;
}
private cleanLine(line: string): string {
if (line.length <= 75) {
return line;
}
const chunks: string[] = [];
let index = 0;
while (index < line.length) {
let chunk = line.slice(index, index + 75);
if (index > 0) {
chunk = " " + chunk.trim();
}
chunks.push(chunk);
index += 75;
}
return chunks.join("\r\n");
}
private generateICSFile(
sportKey: string | null,
nocKey: string | null,
@@ -22,88 +39,128 @@ export class ICSGenerator {
sportKey || "all-sports",
nocKey || "all-nocs",
);
this.calendar.languages.forEach((lang) => {
const pathSportKey = sportKey ? sportKey : "all-sports";
const pathNocKey = nocKey ? nocKey : "calendar";
const filepath = `./output/${lang.code.toLowerCase()}/${pathSportKey.toLowerCase()}/${pathNocKey.toLowerCase()}.ics`;
mkdirSync(filepath.split("/").slice(0, -1).join("/"), { recursive: true });
let types = ["all-events", "medal-events", "gold-medal-events"];
if (nocKey) {
types = ["all-events"];
}
const titleComponents = [];
if (nocKey) {
titleComponents.push(
`${this.calendar.nocs.find((n) => n.key === nocKey)!.name[lang.code]}`,
for (const type of types) {
for (const lang of this.calendar.languages) {
const pathSportKey = sportKey || "all-sports";
let pathCalendar = "calendar";
if (type != "all-events") {
pathCalendar = type;
} else if (nocKey) {
pathCalendar = nocKey;
}
const filepath = `./output/${lang.code.toLowerCase()}/${pathSportKey.toLowerCase()}/${pathCalendar.toLowerCase()}.ics`;
mkdirSync(filepath.split("/").slice(0, -1).join("/"), { recursive: true });
const titleComponents: string[] = [];
if (nocKey) {
titleComponents.push(
`${this.calendar.nocs.find((n) => n.key === nocKey)!.name[lang.code]}`,
);
}
if (sportKey) {
titleComponents.push(this.calendar.sports.find((s) => s.key === sportKey)!.name[lang.code] || "");
}
titleComponents.push("Milano Cortina 2026");
const title = titleComponents.join(" - ");
const lines: string[] = [];
lines.push("BEGIN:VCALENDAR");
lines.push("VERSION:2.0");
lines.push(
`PRODID:-//fabrice404//olympics-calendar//${lang.code}/${pathSportKey}/${pathCalendar}`,
);
}
if (sportKey) {
titleComponents.push(this.calendar.sports.find((s) => s.key === sportKey)!.name[lang.code]);
}
titleComponents.push("Milano Cortina 2026");
lines.push(`X-WR-CALNAME:${title}`);
lines.push(`NAME:${title}`);
const title = titleComponents.join(" - ");
const lines = [];
lines.push("BEGIN:VCALENDAR");
lines.push("VERSION:2.0");
lines.push(
`PRODID:-//fabrice404//olympics-calendar//${lang.code}/${pathSportKey}/${pathNocKey}`,
);
lines.push(`X-WR-CALNAME:${title}`);
lines.push(`NAME:${title}`);
this.calendar.events
.filter((event) => {
if (sportKey && event.sport !== sportKey) return false;
if (nocKey) {
if (event.match) {
const team1Key = event.match.team1.key;
const team2Key = event.match.team2.key;
if (team1Key !== nocKey && team2Key !== nocKey) {
return false;
}
} else {
this.calendar.events
.filter((event) => {
if ((sportKey && event.sport !== sportKey) || event.sport === "CER") {
return false;
}
}
return true;
})
.forEach((event) => {
lines.push("BEGIN:VEVENT");
lines.push(`UID:${event.key.replace(/--/g, "-")}`);
lines.push(`DTSTAMP:${event.start.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`DTSTART:${event.start.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`DTEND:${event.end.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`LOCATION:${event.location[lang.code] || ""}`);
const sport = this.calendar.sports.find(
(s) => s.key === event.sport,
)!;
lines.push(`DESCRIPTION:${sport.name[lang.code]} - ${event.name[lang.code] || ""}`);
const summary = `SUMMARY:${event.name[lang.code] || ""}`;
if (event.match) {
const team1Name = event.match.team1.name[lang.code] || event.match.team1.key;
const team1Flag = getFlag(event.match.team1.key);
const team2Name = event.match.team2.name[lang.code] || event.match.team2.key;
const team2Flag = getFlag(event.match.team2.key);
if (team1Name && team2Name) {
lines.push(`SUMMARY:${team1Flag} ${team1Name} - ${team2Name} ${team2Flag}`);
if (nocKey && !event.nocs.includes(nocKey)) {
return false;
}
}
if (
(type === "medal-events" && event.medal === "0") ||
(type === "gold-medal-events" && event.medal !== "1")
) {
return false;
}
return true;
})
.forEach((event) => {
lines.push("BEGIN:VEVENT");
lines.push(`UID:${event.key.replace(/--/g, "-")}`);
lines.push(`DTSTAMP:${event.start.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`DTSTART:${event.start.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`DTEND:${event.end.replace(/[-:]/g, "").replace(/\.\d+Z$/, "Z")}`);
lines.push(`LOCATION:${event.location[lang.code] || ""}`);
lines.push(summary);
lines.push("END:VEVENT");
});
const sport = this.calendar.sports.find(
(s) => s.key === event.sport,
)!;
let description = `DESCRIPTION:${sport.name[lang.code]} - ${event.name[lang.code] || ""}`;
let summary = `SUMMARY:${event.name[lang.code] || ""}`;
lines.push("END:VCALENDAR");
if (event.competitors?.length === 2) {
const competitor1 = this.getCompetitor(event.competitors[0]!, lang.code);
const competitor2 = this.getCompetitor(event.competitors[1]!, lang.code);
writeFileSync(filepath, lines.join("\n"));
});
if (competitor1 && competitor2) {
summary = `SUMMARY:${competitor1?.flag} ${competitor1.name} - ${competitor2?.name} ${competitor2.flag}`;
}
} else if (event.competitors?.length > 0) {
const competitors = event.competitors
.map((competitorId) => this.getCompetitor(competitorId, lang.code))
.map((competitor) => `\\n${competitor.flag} ${competitor.name}`).join("");
description += `${competitors}`;
}
lines.push(summary);
lines.push(this.cleanLine(description));
lines.push("END:VEVENT");
});
lines.push("END:VCALENDAR");
if (lines.length <= 10) {
this.debug("Skipping empty ICS file:", filepath);
} else {
writeFileSync(filepath, lines.join("\r\n"), "utf-8");
}
}
}
}
private getCompetitor(competitorId: string, lang: string) {
if (competitorId.startsWith("team:")) {
const team = this.calendar.nocs.find(noc => noc.key === competitorId.replace("team:", ""));
return {
noc: team?.key,
name: team?.name[lang] || team?.key || competitorId,
flag: getFlag(team?.key || ""),
};
}
const competitor = this.calendar.competitors.find(comp => comp.code === competitorId)!;
return {
noc: competitor.noc,
name: competitor.name,
flag: getFlag(competitor.noc),
};
}
public generate(): void {
this.debug("generate");
this.generateICSFile(null, null);
this.calendar.sports.forEach((sport) => {

View File

@@ -1,12 +1,22 @@
import { removeSync } from "fs-extra/esm";
import nodeCron from "node-cron";
import { Scraper } from "./scraper";
const main = async () => {
nodeCron.schedule("* * * * *", async () => {
const main = () => {
nodeCron.schedule("*/10 * * * *", () => {
removeSync("./cache/schedules");
const scraper = new Scraper();
await scraper.scrape();
scraper.scrape();
});
nodeCron.schedule("0 0 * * *", () => {
removeSync("./cache/disciplinesevents");
removeSync("./cache/nocs");
});
const scraper = new Scraper();
scraper.scrape();
};
main();

View File

@@ -208,5 +208,5 @@ export const flags: { [key: string]: string } = {
};
export const getFlag = (nocKey: string): string => {
return flags[nocKey.toUpperCase()] || "🏳️";
return flags[nocKey?.toUpperCase()] || "🏳️";
};

View File

@@ -8,20 +8,21 @@
"name": "scraper",
"version": "1.0.0",
"dependencies": {
"axios": "^1.13.2",
"axios": "^1.13.6",
"debug": "^4.4.3",
"fs-extra": "^11.3.4",
"node-cron": "^4.2.1",
"nodemon": "^3.1.11",
"nodemon": "^3.1.14",
"ts-node": "^10.9.2"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@eslint/js": "^9.39.3",
"@types/debug": "^4.1.12",
"@types/node": "^24.10.2",
"eslint": "^9.39.1",
"@types/node": "^24.11.0",
"eslint": "^9.39.3",
"eslint-plugin-perfectionist": "^4.15.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.49.0"
"typescript-eslint": "^8.56.1"
}
},
"node_modules/@cspotcode/source-map-support": {
@@ -37,9 +38,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
"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==",
"version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
"integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -144,9 +145,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.39.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
"integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
"version": "9.39.3",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz",
"integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -313,30 +314,29 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "24.10.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz",
"integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==",
"version": "24.11.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.11.0.tgz",
"integrity": "sha512-fPxQqz4VTgPI/IQ+lj9r0h+fDR66bzoeMGHp8ASee+32OSGIkeASsoZuJixsQoVef1QJbeubcPBxKk22QVoWdw==",
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~7.16.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz",
"integrity": "sha512-JXij0vzIaTtCwu6SxTh8qBc66kmf1xs7pI4UOiMDFVct6q86G0Zs7KRcEoJgY3Cav3x5Tq0MF5jwgpgLqgKG3A==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.1.tgz",
"integrity": "sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
"@typescript-eslint/scope-manager": "8.49.0",
"@typescript-eslint/type-utils": "8.49.0",
"@typescript-eslint/utils": "8.49.0",
"@typescript-eslint/visitor-keys": "8.49.0",
"ignore": "^7.0.0",
"@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.56.1",
"@typescript-eslint/type-utils": "8.56.1",
"@typescript-eslint/utils": "8.56.1",
"@typescript-eslint/visitor-keys": "8.56.1",
"ignore": "^7.0.5",
"natural-compare": "^1.4.0",
"ts-api-utils": "^2.1.0"
"ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -346,8 +346,8 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"@typescript-eslint/parser": "^8.49.0",
"eslint": "^8.57.0 || ^9.0.0",
"@typescript-eslint/parser": "^8.56.1",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
},
@@ -362,18 +362,17 @@
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.49.0.tgz",
"integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.1.tgz",
"integrity": "sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.49.0",
"@typescript-eslint/types": "8.49.0",
"@typescript-eslint/typescript-estree": "8.49.0",
"@typescript-eslint/visitor-keys": "8.49.0",
"debug": "^4.3.4"
"@typescript-eslint/scope-manager": "8.56.1",
"@typescript-eslint/types": "8.56.1",
"@typescript-eslint/typescript-estree": "8.56.1",
"@typescript-eslint/visitor-keys": "8.56.1",
"debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -383,20 +382,20 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/project-service": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.49.0.tgz",
"integrity": "sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.1.tgz",
"integrity": "sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.49.0",
"@typescript-eslint/types": "^8.49.0",
"debug": "^4.3.4"
"@typescript-eslint/tsconfig-utils": "^8.56.1",
"@typescript-eslint/types": "^8.56.1",
"debug": "^4.4.3"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -410,14 +409,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.49.0.tgz",
"integrity": "sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.1.tgz",
"integrity": "sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.49.0",
"@typescript-eslint/visitor-keys": "8.49.0"
"@typescript-eslint/types": "8.56.1",
"@typescript-eslint/visitor-keys": "8.56.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -428,9 +427,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.49.0.tgz",
"integrity": "sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.1.tgz",
"integrity": "sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -445,17 +444,17 @@
}
},
"node_modules/@typescript-eslint/type-utils": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.49.0.tgz",
"integrity": "sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.1.tgz",
"integrity": "sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.49.0",
"@typescript-eslint/typescript-estree": "8.49.0",
"@typescript-eslint/utils": "8.49.0",
"debug": "^4.3.4",
"ts-api-utils": "^2.1.0"
"@typescript-eslint/types": "8.56.1",
"@typescript-eslint/typescript-estree": "8.56.1",
"@typescript-eslint/utils": "8.56.1",
"debug": "^4.4.3",
"ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -465,14 +464,14 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/types": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.49.0.tgz",
"integrity": "sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.1.tgz",
"integrity": "sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -484,21 +483,21 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.49.0.tgz",
"integrity": "sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.1.tgz",
"integrity": "sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/project-service": "8.49.0",
"@typescript-eslint/tsconfig-utils": "8.49.0",
"@typescript-eslint/types": "8.49.0",
"@typescript-eslint/visitor-keys": "8.49.0",
"debug": "^4.3.4",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
"@typescript-eslint/project-service": "8.56.1",
"@typescript-eslint/tsconfig-utils": "8.56.1",
"@typescript-eslint/types": "8.56.1",
"@typescript-eslint/visitor-keys": "8.56.1",
"debug": "^4.4.3",
"minimatch": "^10.2.2",
"semver": "^7.7.3",
"tinyglobby": "^0.2.15",
"ts-api-utils": "^2.1.0"
"ts-api-utils": "^2.4.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -511,43 +510,56 @@
"typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
"integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
"dev": true,
"license": "MIT",
"engines": {
"node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz",
"integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
"balanced-match": "^4.0.2"
},
"engines": {
"node": "18 || 20 || >=22"
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
"integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"dev": true,
"license": "ISC",
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^2.0.1"
"brace-expansion": "^5.0.2"
},
"engines": {
"node": ">=16 || 14 >=14.17"
"node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/@typescript-eslint/utils": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.49.0.tgz",
"integrity": "sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.1.tgz",
"integrity": "sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.7.0",
"@typescript-eslint/scope-manager": "8.49.0",
"@typescript-eslint/types": "8.49.0",
"@typescript-eslint/typescript-estree": "8.49.0"
"@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.56.1",
"@typescript-eslint/types": "8.56.1",
"@typescript-eslint/typescript-estree": "8.56.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -557,19 +569,19 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/visitor-keys": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.49.0.tgz",
"integrity": "sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.1.tgz",
"integrity": "sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/types": "8.49.0",
"eslint-visitor-keys": "^4.2.1"
"@typescript-eslint/types": "8.56.1",
"eslint-visitor-keys": "^5.0.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -579,12 +591,24 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
"node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
"integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -680,13 +704,13 @@
"license": "MIT"
},
"node_modules/axios": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"version": "1.13.6",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz",
"integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"follow-redirects": "^1.15.11",
"form-data": "^4.0.5",
"proxy-from-env": "^1.1.0"
}
},
@@ -694,6 +718,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
"license": "MIT"
},
"node_modules/binary-extensions": {
@@ -712,6 +737,7 @@
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -842,6 +868,7 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true,
"license": "MIT"
},
"node_modules/create-require": {
@@ -980,12 +1007,11 @@
}
},
"node_modules/eslint": {
"version": "9.39.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"version": "9.39.3",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz",
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -993,7 +1019,7 @@
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.39.1",
"@eslint/js": "9.39.3",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
@@ -1272,6 +1298,20 @@
"node": ">= 6"
}
},
"node_modules/fs-extra": {
"version": "11.3.4",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.4.tgz",
"integrity": "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==",
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
"node": ">=14.14"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1370,6 +1410,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
"integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
"license": "ISC"
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -1545,6 +1591,18 @@
"dev": true,
"license": "MIT"
},
"node_modules/jsonfile": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/keyv": {
"version": "4.5.4",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
@@ -1632,6 +1690,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -1673,15 +1732,15 @@
}
},
"node_modules/nodemon": {
"version": "3.1.11",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz",
"integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==",
"version": "3.1.14",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz",
"integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==",
"license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^4",
"ignore-by-default": "^1.0.1",
"minimatch": "^3.1.2",
"minimatch": "^10.2.1",
"pstree.remy": "^1.1.8",
"semver": "^7.5.3",
"simple-update-notifier": "^2.0.0",
@@ -1700,6 +1759,27 @@
"url": "https://opencollective.com/nodemon"
}
},
"node_modules/nodemon/node_modules/balanced-match": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz",
"integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==",
"license": "MIT",
"engines": {
"node": "20 || >=22"
}
},
"node_modules/nodemon/node_modules/brace-expansion": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz",
"integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==",
"license": "MIT",
"dependencies": {
"balanced-match": "^4.0.2"
},
"engines": {
"node": "20 || >=22"
}
},
"node_modules/nodemon/node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -1709,6 +1789,21 @@
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/minimatch": {
"version": "10.2.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.2.tgz",
"integrity": "sha512-+G4CpNBxa5MprY+04MbgOw1v7So6n5JY166pFi9KfYwT78fxScCeSNQSNzp6dpPSW2rONOps6Ocam1wFhCgoVw==",
"license": "BlueOak-1.0.0",
"dependencies": {
"brace-expansion": "^5.0.2"
},
"engines": {
"node": "18 || 20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/nodemon/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -1993,7 +2088,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -2023,9 +2117,9 @@
}
},
"node_modules/ts-api-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz",
"integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2096,7 +2190,6 @@
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -2106,16 +2199,16 @@
}
},
"node_modules/typescript-eslint": {
"version": "8.49.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.49.0.tgz",
"integrity": "sha512-zRSVH1WXD0uXczCXw+nsdjGPUdx4dfrs5VQoHnUWmv1U3oNlAKv4FUNdLDhVUg+gYn+a5hUESqch//Rv5wVhrg==",
"version": "8.56.1",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.56.1.tgz",
"integrity": "sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.49.0",
"@typescript-eslint/parser": "8.49.0",
"@typescript-eslint/typescript-estree": "8.49.0",
"@typescript-eslint/utils": "8.49.0"
"@typescript-eslint/eslint-plugin": "8.56.1",
"@typescript-eslint/parser": "8.56.1",
"@typescript-eslint/typescript-estree": "8.56.1",
"@typescript-eslint/utils": "8.56.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2125,7 +2218,7 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
"eslint": "^8.57.0 || ^9.0.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.0.0"
}
},
@@ -2141,6 +2234,15 @@
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"license": "MIT"
},
"node_modules/universalify": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
"integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"license": "MIT",
"engines": {
"node": ">= 10.0.0"
}
},
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",

View File

@@ -11,19 +11,20 @@
"lint": "eslint . --ext .ts"
},
"dependencies": {
"axios": "^1.13.2",
"axios": "^1.13.6",
"debug": "^4.4.3",
"fs-extra": "^11.3.4",
"node-cron": "^4.2.1",
"nodemon": "^3.1.11",
"nodemon": "^3.1.14",
"ts-node": "^10.9.2"
},
"devDependencies": {
"@eslint/js": "^9.39.1",
"@eslint/js": "^9.39.3",
"@types/debug": "^4.1.12",
"@types/node": "^24.10.2",
"eslint": "^9.39.1",
"@types/node": "^24.11.0",
"eslint": "^9.39.3",
"eslint-plugin-perfectionist": "^4.15.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.49.0"
"typescript-eslint": "^8.56.1"
}
}

View File

@@ -1,129 +1,136 @@
import { get } from "axios";
import Debug from "debug";
import { writeFileSync } from "fs";
import { Cache } from "./cache";
import { ICSGenerator } from "./ics-generator";
import { Calendar, Event, Language, PageData, Sport, Team } from "./types";
import { Calendar, Event, Language, Sport, NOC, Competitor } from "./types";
const BASE_URL = "https://www.olympics.com";
const BASE_SCHEDULE_PATH = "milano-cortina-2026/schedule/overview";
const proxy = process.env.HTTP_PROXY || "";
export class Scraper {
private cache = new Cache();
private debug = Debug("olympics-calendar:scraper");
private readonly cache = new Cache();
private events: Event[] = [];
private languages: Language[] = [];
private nocs: Team[] = [];
private sports: Sport[] = [];
private readonly competitors: Competitor[] = [];
private async getPageData(path: string): Promise<PageData> {
this.debug(`getPageData: path=${path}`);
if (!this.cache.has(path)) {
const url = `${BASE_URL}${path}`;
this.debug(url);
const response = await get(url, {
headers: {
private readonly debug = Debug("olympics-calendar:scraper");
private readonly events: Event[] = [];
private readonly languages: Language[] = [
{ code: "en", name: "English", code3: "ENG" },
{ code: "it", name: "Italiano", code3: "ITA" },
{ code: "fr", name: "Français", code3: "FRA" },
{ code: "de", name: "Deutsch", code3: "DEU" },
{ code: "pt", name: "Português", code3: "POR" },
{ code: "es", name: "Español", code3: "SPA" },
{ code: "ja", name: "日本語", code3: "JPN" },
{ code: "zh", name: "中文", code3: "CHI" },
{ code: "hi", name: "हिन्दी", code3: "HIN" },
{ code: "ko", name: "한국어", code3: "KOR" },
{ code: "ru", name: "Русский", code3: "RUS" },
];
private readonly nocs: NOC[] = [];
private readonly sports: Sport[] = [];
private dateToUtcString(dateString: string): string {
const date = new Date(dateString);
const utc = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
return new Date(utc).toISOString();
}
private async getJSONData(url: string, cacheKey: string): Promise<any> {
this.debug(`getJSONData: url=${url}`);
if (!this.cache.has(cacheKey)) {
const response = await fetch(`${proxy}${url}`, {
"headers": {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36"
"accept-language": "en-US,en;q=0.9,fr-FR;q=0.8,fr;q=0.7",
"cache-control": "max-age=0",
"priority": "u=0, i",
"sec-ch-ua": "\"Not(A:Brand\";v=\"8\", \"Chromium\";v=\"144\", \"Google Chrome\";v=\"144\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"macOS\"",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
},
"body": null,
"method": "GET"
});
const page = await response.data;
const dataMatch = page.match(
/<script id="__NEXT_DATA__" type="application\/json">([\s\S]*?)<\/script>/,
);
if (!dataMatch) {
throw new Error(
`Could not find __NEXT_DATA__ script tag for URL: ${url}`,
);
}
const data = dataMatch[1];
if (data) {
this.cache.set(path, JSON.stringify(JSON.parse(data), null, 2));
}
const result = await response.json();
this.cache.set(cacheKey, JSON.stringify(result, null, 2));
}
return JSON.parse(this.cache.get(path)!);
return JSON.parse(this.cache.get(cacheKey)!);
}
private saveCalendar(): void {
this.debug("saveCalendar");
const calendar = this.getCalendar();
writeFileSync("./output/calendar.json", JSON.stringify(calendar));
writeFileSync("./output/calendar.json", JSON.stringify(calendar, null, 2), "utf-8");
}
private async scrapeEvents(): Promise<void> {
this.debug("scrapeEvents");
for (const sport of this.sports) {
for (const lang of this.languages) {
const data = await this.getPageData(
`/${lang.code}/milano-cortina-2026/schedule/${sport.key}`,
);
const scheduleList = data.props.pageProps.page.items
.find(
(item) => item.type === "module" && item.name === "scheduleList",
)!
.data.schedules.map((schedule) => schedule.units)
.flat();
for (const scheduleElement of scheduleList) {
if (
this.events.find((e) => e.key === scheduleElement.unitCode) == null
) {
for (const lang of this.languages) {
this.debug(`Scraping events: ${lang.code}`);
for (let i = 3; i <= 23; i++) {
const url = `https://www.olympics.com/wmr-owg2026/schedules/api/${lang.code3}/schedule/lite/day/2026-02-${i.toString().padStart(2, "0")}`;
const data = await this.getJSONData(url, `schedules/day/2026-02-${i.toString().padStart(2, "0")}/${lang.code3}`);
for (const event of data.units) {
if (!event.endDate) {
continue;
}
const { id: key } = event;
if (!this.events.some((e) => e.key === key)) {
this.events.push({
key: scheduleElement.unitCode,
sport: sport.key,
start: scheduleElement.startDateTimeUtc,
end: scheduleElement.endDateTimeUtc,
isTraining: scheduleElement.isTraining,
medal: scheduleElement.medal,
key,
sport: event.disciplineCode,
start: this.dateToUtcString(event.startDate),
end: this.dateToUtcString(event.endDate),
medal: event.medalFlag.toString(),
name: {},
location: {},
nocs: [],
competitors: [],
});
}
const event = this.events.find(
(e) => e.key === scheduleElement.unitCode,
)!;
event.name[lang.code] = scheduleElement.description;
event.location[lang.code] = scheduleElement.venue?.description || "";
if (scheduleElement.match) {
if (event.match == null) {
event.match = {
team1: {
key: scheduleElement.match.team1.teamCode.replace(
/[^A-Z]/gi,
"",
),
name: {},
},
team2: {
key: scheduleElement.match.team2.teamCode.replace(
/[^A-Z]/gi,
"",
),
name: {},
},
};
}
event.match.team1.name[lang.code] = (
scheduleElement.match.team1.description || ""
).replace(/,/gi, "");
event.match.team2.name[lang.code] = (
scheduleElement.match.team2.description || ""
).replace(/,/gi, "");
const calendarEvent = this.events.find((e) => e.key === key)!;
calendarEvent.name[lang.code] = event.eventUnitName;
calendarEvent.location[lang.code] = event.venueDescription;
for (const team of [
scheduleElement.match.team1,
scheduleElement.match.team2,
]) {
const nocKey = team.teamCode.replace(/[^A-Z]/gi, "");
if (this.nocs.find((n) => n.key === nocKey) == null) {
this.nocs.push({ key: nocKey, name: {} });
if (event.competitors) {
for (const competitor of event.competitors) {
if (competitor.code === "TBD") {
continue;
}
const { code, name, noc, competitorType } = competitor;
if (!calendarEvent.nocs.some((n) => n === noc)) {
calendarEvent.nocs.push(noc);
}
if (competitorType) {
if (!calendarEvent.competitors.some((c) => c === code)) {
calendarEvent.competitors.push(code);
}
this.setCompetitor(code, noc, name);
this.setNoc(noc, "", lang.code);
} else {
const key = `team:${noc}`;
if (!calendarEvent.competitors.some((c) => c === key)) {
calendarEvent.competitors.push(key);
}
this.setNoc(noc, name, lang.code);
}
const noc = this.nocs.find((n) => n.key === nocKey)!;
noc.name[lang.code] = (team.description || "").replace(/,/gi, "");
}
}
}
@@ -131,47 +138,62 @@ export class Scraper {
}
}
private async scrapeLanguages(): Promise<void> {
this.debug("scrapeLanguages");
const pageData = await this.getPageData(`/en/${BASE_SCHEDULE_PATH}`);
const languagesData =
pageData.props.pageProps.page.template.properties.header.mainNav
.languages;
private async scrapeNOCs(): Promise<void> {
this.debug("scrapeNOCs");
for (const lang of this.languages) {
this.debug(`Scraping NOCs: ${lang.code}`);
const url = `https://www.olympics.com/wmr-owg2026/info/api/${lang.code3}/nocs`;
const data = await this.getJSONData(url, `nocs/${lang.code3}`);
this.languages = languagesData
.filter((lang) =>
lang.link.match(/\/milano-cortina-2026\/schedule\/overview$/),
)
.map((lang) => ({
code: lang.lang,
name: lang.label,
}));
for (const noc of this.nocs) {
const found = data.nocs.find((n) => n.id === noc.key);
this.setNoc(found.id, found.name, lang.code);
}
}
}
private async scrapeSports(): Promise<void> {
this.debug("scrapeSports");
for (const lang of this.languages) {
this.debug(`Scraping language: ${lang.code}`);
const pageData = await this.getPageData(
`/${lang.code}/${BASE_SCHEDULE_PATH}`,
);
this.debug(`Scraping sports: ${lang.code}`);
const disciplines = pageData.props.pageProps.page.items.find(
(item) => item.type === "module" && item.name === "scheduleGrid",
)!.data.disciplines;
for (const discipline of disciplines.filter(
(d) => d.disciplineCode.toLowerCase() !== "cer",
)) {
const key = discipline.disciplineCode.toLowerCase();
if (this.sports.find((s) => s.key === key) == null) {
this.sports.push({ key, name: {}, order: -1 });
const url = `https://www.olympics.com/wmr-owg2026/info/api/${lang.code3}/disciplinesevents`;
const data = await this.getJSONData(url, `disciplinesevents/${lang.code3}`);
for (const discipline of data.disciplines) {
const { id, name } = discipline;
if (!this.sports.some((s) => s.key === id)) {
this.sports.push({ key: id, name: {}, order: 0 });
}
const sport = this.sports.find((s) => s.key === key)!;
sport.name[lang.code] = discipline.description;
sport.order = discipline.order;
const sport = this.sports.find((s) => s.key === id)!;
sport.name[lang.code] = name;
}
}
this.sports
.toSorted((a, b) => (a.order < b.order ? -1 : 1))
.forEach((sport, index) => {
sport.order = index + 1;
});
}
private setCompetitor(code: string, noc: string, name: string): void {
if (!code)
return;
if (!this.competitors.some((c) => c.code === code)) {
this.competitors.push({ code, noc, name });
}
}
private setNoc(key: string, name: string, langCode: string): void {
if (!key)
return;
if (!this.nocs.some((n) => n.key === key)) {
this.nocs.push({ key, name: {} });
}
const noc = this.nocs.find((n) => n.key === key)!;
noc.name[langCode] = name;
}
public getCalendar(): Calendar {
@@ -179,15 +201,17 @@ export class Scraper {
languages: this.languages,
sports: this.sports,
nocs: this.nocs,
competitors: this.competitors,
events: this.events,
};
}
public async scrape(): Promise<void> {
this.debug("scrape");
await this.scrapeLanguages();
await this.scrapeSports();
await this.scrapeEvents();
await this.scrapeNOCs();
this.saveCalendar();
new ICSGenerator(this.getCalendar()).generate();

View File

@@ -22,6 +22,7 @@
"exactOptionalPropertyTypes": true,
// Style Options
"noImplicitAny": false,
// "noImplicitReturns": true,
// "noImplicitOverride": true,
// "noUnusedLocals": true,
@@ -36,6 +37,6 @@
"isolatedModules": true,
"noUncheckedSideEffectImports": true,
"moduleDetection": "force",
"skipLibCheck": true,
"skipLibCheck": true
}
}

73
scraper/types.d.ts vendored
View File

@@ -5,6 +5,7 @@ export interface MultilingualString {
export interface Language {
code: string;
name: string;
code3: string;
}
export interface Sport {
@@ -13,14 +14,15 @@ export interface Sport {
order: number;
}
export interface Team {
export interface NOC {
key: string;
name: MultilingualString;
}
export interface Match {
team1: Team;
team2: Team;
export interface Competitor {
noc: string;
code: string;
name: string;
}
export interface Event {
@@ -28,72 +30,17 @@ export interface Event {
start: string;
end: string;
sport: string;
isTraining: boolean;
medal: "0" | "1" | "3";
name: MultilingualString;
location: MultilingualString;
match?: Match;
nocs: string[];
competitors: string[];
}
export interface Calendar {
languages: Language[];
sports: Sport[];
nocs: NOC[];
competitors: Competitor[];
events: Event[];
nocs: Team[];
}
export interface PageData {
props: {
pageProps: {
page: {
template: {
properties: {
header: {
mainNav: {
languages: {
link: string;
lang: string;
label: string;
}[];
};
};
};
};
items: {
type: string;
name: string;
data: {
disciplines: {
disciplineCode: string;
order: number;
description: string;
}[];
schedules: {
units: {
unitCode: string;
startDateTimeUtc: string;
endDateTimeUtc: string;
isTraining: boolean;
medal: "0" | "1" | "3";
description: string;
venue: {
description: string;
};
match?: {
team1: {
teamCode: string;
description: string;
};
team2: {
teamCode: string;
description: string;
};
};
}[];
}[];
};
}[];
};
};
};
}

1
sonar-project.properties Normal file
View File

@@ -0,0 +1 @@
sonar.projectKey=fabrice404_olympics-calendar_55a1e8d3-edef-4319-a482-364594aa26ef

573
ui/app/[[...slug]]/page.tsx Normal file
View File

@@ -0,0 +1,573 @@
/* eslint-disable @next/next/no-html-link-for-pages */
"use client";
import { loadSchedule } from "../../lib/data";
import { use, useEffect, useState } from "react";
import Flag from "../flag";
import { ALL_EVENTS, COPY, COPY_SUCCESS, FILTER_BY_COUNTRY, FILTER_BY_EVENT_TYPE, FILTER_BY_SPORT, GOLD_MEDAL_EVENTS, LANGUAGE, MADE_BY_FABRICE, MEDAL_EVENTS, NOT_AFFILIATED, NO_EVENT_FOR_FILTERS } from "../../lib/text";
import useLocalStorage from "@/lib/local-storage";
import { GoogleAnalytics } from "@next/third-parties/google";
import { Google_Sans, SUSE_Mono } from "next/font/google";
import { permanentRedirect, usePathname } from "next/navigation";
const googleSans = Google_Sans({
variable: "--font-google-sans",
subsets: ["latin"],
fallback: ["sans-serif"],
});
const suseMono = SUSE_Mono({
variable: "--font-suse-mono",
subsets: ["latin"],
fallback: ["sans-serif"],
});
export interface MultilingualString {
[key: string]: string;
}
export interface Language {
code: string;
name: string;
code3: string;
}
export interface Sport {
key: string;
name: MultilingualString;
order: number;
}
export interface NOC {
key: string;
name: MultilingualString;
}
export interface Competitor {
noc: string;
code: string;
name: string;
}
export interface Event {
key: string;
start: string;
end: string;
sport: string;
medal: "0" | "1" | "3";
name: MultilingualString;
location: MultilingualString;
nocs: string[];
competitors: string[];
}
export interface Calendar {
languages: Language[];
sports: Sport[];
nocs: NOC[];
competitors: Competitor[];
events: Event[];
}
const COLORS = ['azzurro', 'giallo', 'rosa', 'rosso', 'verde', 'viola'];
const EVENT_TYPE_ALL = "all";
const EVENT_TYPE_MEDAL = "medal-events";
const EVENT_TYPE_GOLD_MEDAL = "gold-medal-events";
const EVENT_TYPES = [{
key: EVENT_TYPE_ALL.toUpperCase(),
name: ALL_EVENTS
}, {
key: EVENT_TYPE_MEDAL.toUpperCase(),
name: MEDAL_EVENTS,
}, {
key: EVENT_TYPE_GOLD_MEDAL.toUpperCase(),
name: GOLD_MEDAL_EVENTS,
}]
const DEFAULT_NOC = "world";
const DEFAULT_SPORT = "all-sports";
const DEFAULT_EVENT_TYPE = EVENT_TYPE_ALL;
export default function Home({
params,
}: {
params: Promise<{ slug: string }>
}) {
const qs = typeof window !== 'undefined' ? window.location.search ? new URLSearchParams(window.location.search) : new URLSearchParams() : new URLSearchParams();
const { slug } = use(params);
const pathname = usePathname();
const [data, setData] = useState<Calendar | null>(null);
const [language, setLanguage] = useLocalStorage('lang', (navigator.language || 'en').split('-')[0]);
const [cookieConsent, setCookieConsent] = useLocalStorage('cookie-consent', 'null');
const translate = (text: MultilingualString) => {
return text[`${language}`] || text['en'] || Object.values(text)[0] || '';
};
const getParams = () => ({
noc: slug?.length ? slug[0].toLowerCase() : DEFAULT_NOC,
sport: slug?.length >= 2 ? slug[1].toLowerCase() : DEFAULT_SPORT,
type: slug?.length >= 3 ? slug[2].toLowerCase() : DEFAULT_EVENT_TYPE,
})
const generateLink = ({ noc, sport, type }: { noc?: string; sport?: string; type?: string }) => {
const { noc: newNOC, sport: newSport, type: newType } = getParams();
if (type && type !== DEFAULT_EVENT_TYPE) {
return `/${noc || newNOC}/${sport || newSport}/${type}`.toLowerCase();
}
return `/${noc || newNOC}/${sport || newSport}`.toLowerCase();
}
const generateCalendarLink = () => {
const host = typeof window !== 'undefined' ? window.location.host : '';
const { noc, sport, type } = getParams();
if (type !== DEFAULT_EVENT_TYPE) {
return `http://${host}/api/data/${language}/${sport}/${type}.ics`;
}
return `http://${host}/api/data/${language}/${sport}/${noc === DEFAULT_NOC ? "calendar" : noc}.ics`;
};
const getColor = (i: number) => COLORS[i % COLORS.length];
useEffect(() => {
let selectedNOC = DEFAULT_NOC;
let selectedSport = DEFAULT_SPORT;
if (qs.get('noc')) {
selectedNOC = qs.get('noc')!.toLowerCase();
} else if (slug?.length >= 1) {
selectedNOC = getParams().noc.toLowerCase();
}
if (qs.get('sport')) {
selectedSport = qs.get('sport')!.toLowerCase();
} else if (slug?.length >= 2) {
selectedSport = getParams().sport.toLowerCase();
}
let expectedUrl = `/${selectedNOC}/${selectedSport}`;
if (getParams().type !== DEFAULT_EVENT_TYPE) {
expectedUrl = `/${selectedNOC}/${selectedSport}/${getParams().type}`;
}
if (pathname !== expectedUrl) {
permanentRedirect(expectedUrl);
}
if (data == null) {
loadSchedule()
.then(setData)
.catch(console.log);
}
}, [data]);
const filter = (event: Event) => {
let visible = true;
if (event.end < new Date().toISOString()) {
return false;
}
const { noc, sport, type } = getParams();
if (
noc !== DEFAULT_NOC &&
!event.nocs.includes(noc.toUpperCase())
) {
visible = false;
}
if (
sport !== DEFAULT_SPORT &&
event.sport !== sport.toUpperCase()
) {
visible = false;
}
if (type !== DEFAULT_EVENT_TYPE) {
if (
(type === "medal-events" && event.medal === "0") ||
(type === "gold-medal-events" && event.medal !== "1")
) {
visible = false;
}
}
return visible;
}
const copyToClipboard = (text: string) => {
if (typeof navigator !== 'undefined' && navigator.clipboard) {
const button = document.getElementById('copy_button')!;
navigator.clipboard.writeText(text).then(() => {
button.textContent = translate(COPY_SUCCESS);
button.classList.add('text-success');
button.classList.add('font-bold');
setTimeout(() => {
button.textContent = translate(COPY);
button.classList.remove('text-success');
button.classList.remove('font-bold');
}, 2000);
});
}
}
const calendarLink = generateCalendarLink();
if (data) {
let lastDay = "";
if (data.languages.find(lang => lang.code === language) === undefined) {
setLanguage('en')
}
const events = data.events.filter(event => filter(event));
let main = (
<div>
<div className="text-center pt-10 mb-100">
{translate(NO_EVENT_FOR_FILTERS)}
</div>
</div>
)
if (events.length) {
main = (
<div>
<div className="text-center pt-6">
<span className="input md:w-1/3">
<input type="text" placeholder={calendarLink} readOnly={true} />
<button id="copy_button" className="label cursor-pointer" onClick={() => copyToClipboard(calendarLink)}>{translate(COPY)}</button>
</span>
<div className="pt-2 md:pt-0 lg:inline-block">
<a className="inline-block" href={calendarLink.replace("https://", "webcal://")} target="_blank">
<img src="/img/icon-apple.svg" alt="Apple Calendar" className="inline-block size-6 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://calendar.google.com/calendar/u/0/r?cid=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-google.svg" alt="Google Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://outlook.office.com/calendar/0/deeplink/subscribe?url=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-office365.svg" alt="Office 365 Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://outlook.live.com/calendar/0/deeplink/subscribe?url=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-outlookcom.svg" alt="Outlook Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://calendar.yahoo.com/?ics=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-yahoo.svg" alt="Yahoo Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
</div>
</div>
{
events
.sort((a, b) => a.start.localeCompare(b.start))
.map((event, i) => {
const startDate = new Date(event.start);
const endDate = new Date(event.end);
const startHours = startDate.getHours().toString().padStart(2, '0');
const startMinutes = startDate.getMinutes().toString().padStart(2, '0');
const endHours = endDate.getHours().toString().padStart(2, '0');
const endMinutes = endDate.getMinutes().toString().padStart(2, '0');
let titleColor = "fg-main";
if (event.medal === '1') {
titleColor = "bg-gold";
} else if (event.medal === '3') {
titleColor = "bg-bronze";
}
const day = event.start.split('T')[0];
let dayHeader = <></>;
if (lastDay !== day) {
dayHeader = (
<div className="day-header text-center my-8">
<h2 className="text-3xl font-light fg-main">
{new Date(event.start).toLocaleDateString(language, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
</h2>
</div>
);
}
// eslint-disable-next-line react-hooks/immutability
lastDay = day;
const getCompetitor = (competitorId: string) => {
if (competitorId.startsWith("team:")) {
const team = data.nocs.find(noc => noc.key === competitorId.replace("team:", ""));
return { noc: team!.key, name: translate(team!.name) };
}
const competitor = data.competitors.find(comp => comp.code === competitorId);
return { noc: competitor!.noc, name: competitor!.name };
};
let competitors = <></>;
if (event.competitors.length > 0) {
competitors = (
<ul>
{
event.competitors
.filter(Boolean)
.map((competitorId) => {
const competitor = getCompetitor(competitorId);
if (!competitor) return null;
const noc = data.nocs.find(noc => noc.key === competitor.noc);
if (event.competitors.length === 2 || getParams().noc.toUpperCase() === competitor.noc) {
return (
<li key={competitorId}>
<Flag iso3={competitor.noc} name={translate(noc!.name)} /> {competitor.name}
</li>
);
}
})
}
</ul>
);
}
let nocs = <></>;
if (event.nocs.length > 0 && event.competitors.length !== 2) {
nocs = (
<div>
{
event.nocs.filter(Boolean).toSorted((a, b) => a.localeCompare(b)).map((nocKey) => {
const noc = data.nocs.find(noc => noc.key === nocKey);
if (!noc) return null;
return (
<Flag key={nocKey} iso3={noc.key} name={translate(noc.name)} size="sm" />
);
})
}
</div>
);
}
return (
<div key={event.key}>
{dayHeader}
<div className="flex p-2 m-2 my-4 bg-white rounded-md md:w-3/4 md:mx-auto">
<div className={`flex-none fg-${getColor(i)} ${suseMono.className} text-right font-bold align-top inline-block tabular-nums pr-2`}>
<span className="text-xl">{startHours}:{startMinutes}</span>
<div className="text-xs">{endHours}:{endMinutes}</div>
</div>
<div className="shrink align-top inline-block text-black pl-2 border-l border-slate-900/10">
<div className="font-bold">
{translate(data.sports.find(sport => sport.key === event.sport)?.name || {})}
</div>
<div className={`inline-block font-bold text-sm ${titleColor}`}>{translate(event.name)}</div>
{competitors}
{nocs}
</div>
</div>
</div>
)
})
}
</div>
)
}
const header = (
<div className="navbar bg-main">
<div className={`flex-1 ${googleSans.className}`}>
<a href="/world/all-sports" className="text-xl font-bold">Olympics Calendar</a>
</div>
<div className="flex">
<label htmlFor="my-drawer-5" className="drawer-button btn btn-main btn-ghost">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" className="inline-block h-5 w-5 stroke-current"> <path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M4 6h16M4 12h16M4 18h16"></path> </svg>
</label>
</div>
</div>
);
const footer = (
<footer className="footer footer-horizontal footer-center bg-gray-800 text-primary-content p-10">
<aside>
<p className="font-bold">
{translate(MADE_BY_FABRICE)}
</p>
<p>{translate(NOT_AFFILIATED)}</p>
</aside>
<nav>
<div className="grid grid-flow-col gap-4">
<a href="https://github.com/fabrice404/olympics-calendar" target="_blank">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
className="fill-current">
<path d="M5.315 2.1c.791 -.113 1.9 .145 3.333 .966l.272 .161l.16 .1l.397 -.083a13.3 13.3 0 0 1 4.59 -.08l.456 .08l.396 .083l.161 -.1c1.385 -.84 2.487 -1.17 3.322 -1.148l.164 .008l.147 .017l.076 .014l.05 .011l.144 .047a1 1 0 0 1 .53 .514a5.2 5.2 0 0 1 .397 2.91l-.047 .267l-.046 .196l.123 .163c.574 .795 .93 1.728 1.03 2.707l.023 .295l.007 .272c0 3.855 -1.659 5.883 -4.644 6.68l-.245 .061l-.132 .029l.014 .161l.008 .157l.004 .365l-.002 .213l-.003 3.834a1 1 0 0 1 -.883 .993l-.117 .007h-6a1 1 0 0 1 -.993 -.883l-.007 -.117v-.734c-1.818 .26 -3.03 -.424 -4.11 -1.878l-.535 -.766c-.28 -.396 -.455 -.579 -.589 -.644l-.048 -.019a1 1 0 0 1 .564 -1.918c.642 .188 1.074 .568 1.57 1.239l.538 .769c.76 1.079 1.36 1.459 2.609 1.191l.001 -.678l-.018 -.168a5.03 5.03 0 0 1 -.021 -.824l.017 -.185l.019 -.12l-.108 -.024c-2.976 -.71 -4.703 -2.573 -4.875 -6.139l-.01 -.31l-.004 -.292a5.6 5.6 0 0 1 .908 -3.051l.152 -.222l.122 -.163l-.045 -.196a5.2 5.2 0 0 1 .145 -2.642l.1 -.282l.106 -.253a1 1 0 0 1 .529 -.514l.144 -.047l.154 -.03z" />
</svg>
</a>
</div>
</nav>
</footer>
);
let cookie = <></>;
if (cookieConsent === 'true') {
cookie = (
<GoogleAnalytics gaId="G-SLBLJRE0CM" />
);
} else if (cookieConsent === 'null') {
cookie = (
<div className="sticky bottom-0 bg-gray-800 text-white text-center p-8">
<p className="p-4">This website uses cookies for statistics purposes and to enhance the user experience.</p>
<button className="btn btn-sm mx-2" onClick={() => setCookieConsent('true')}>Accept</button>
<button className="btn btn-sm btn-outline" onClick={() => setCookieConsent('false')}>Decline</button>
</div>
);
}
return (
<div>
<div className="drawer drawer-end">
<input id="my-drawer-5" type="checkbox" className="drawer-toggle" />
<div className="drawer-content">
{header}
{main}
{footer}
{cookie}
</div>
<div className="drawer-side">
<label htmlFor="my-drawer-5" aria-label="close sidebar" className="drawer-overlay"></label>
<div className="menu bg-base-200 min-h-full w-80 p-4">
<div>
<span className="font-bold">{translate(FILTER_BY_COUNTRY)}</span>
{getParams().noc !== DEFAULT_NOC && (
<div className="my-1">
<a href={generateLink({ noc: DEFAULT_NOC })} className="btn bg-white btn-sm">
<span className="font-bold text-red-400">X</span> {translate(data.nocs.find(noc => noc.key === getParams().noc.toUpperCase())!.name)}
</a>
</div>
)}
<div className="bg-white h-[200px] max-h-[200px] overflow-y-scroll">
<ul>
{data.nocs.toSorted((a, b) => translate(a.name).localeCompare(translate(b.name))).map(noc => {
if (noc.key === getParams().noc.toUpperCase()) {
return (
<li key={noc.key}>
<a href={generateLink({ noc: DEFAULT_NOC })}><div aria-label="success" className="status status-success"></div> {translate(noc.name)}</a>
</li>
)
}
return (
<li key={noc.key}>
<a href={generateLink({ noc: noc.key })}>{translate(noc.name)}</a>
</li>
)
})}
</ul>
</div>
</div>
<div className="mt-2 pt-2 border-t-1 border-slate-300">
<span className="font-bold">{translate(FILTER_BY_SPORT)}</span>
{getParams().sport !== DEFAULT_SPORT && (
<div className="my-1">
<a href={generateLink({ sport: DEFAULT_SPORT })} className="btn bg-white btn-sm">
<span className="font-bold text-red-400">X</span> {translate(data.sports.find(sport => sport.key === getParams().sport.toUpperCase())!.name)}
</a>
</div>
)}
<div className="bg-white h-[200px] max-h-[200px] overflow-y-scroll">
<ul>
{data.sports.toSorted((a, b) => translate(a.name).localeCompare(translate(b.name))).map(sport => {
if (sport.key === getParams().sport.toUpperCase()) {
return (
<li key={sport.key}>
<a href={generateLink({ sport: DEFAULT_SPORT })}><div aria-label="success" className="status status-success"></div> {translate(sport.name)}</a>
</li>
)
}
return (
<li key={sport.key}>
<a href={generateLink({ sport: sport.key })}>{translate(sport.name)}</a>
</li>
)
})}
</ul>
</div>
</div>
<div className="mt-2 pt-2 border-t-1 border-slate-300">
<span className="font-bold">{translate(FILTER_BY_EVENT_TYPE)}</span>
{getParams().type !== DEFAULT_EVENT_TYPE && (
<div className="my-1">
<a href={generateLink({ type: DEFAULT_EVENT_TYPE })} className="btn bg-white btn-sm">
<span className="font-bold text-red-400">X</span> {translate(EVENT_TYPES.find(type => type.key === getParams().type.toUpperCase())?.name || {})}
</a>
</div>
)}
<div className="bg-white h-[100px] max-h-[100px] overflow-y-scroll">
<ul>
{EVENT_TYPES.map(type => {
if (type.key === getParams().type.toUpperCase()) {
return (
<li key={type.key}>
<a href={generateLink({ type: DEFAULT_EVENT_TYPE })}><div aria-label="success" className="status status-success"></div> {translate(type.name)}</a>
</li>
)
}
return (
<li key={type.key}>
<a href={generateLink({ type: type.key })}>{translate(type.name)}</a>
</li>
)
})}
</ul>
</div>
</div>
<div className="mt-2 pt-2 border-t-1 border-slate-300">
<span className="font-bold">{translate(LANGUAGE)}</span>
<div className="bg-white h-[200px] max-h-[200px] overflow-y-scroll">
<ul>
{data.languages.map(lang => {
if (lang.code === language) {
return (
<li key={lang.code}>
<a onClick={() => setLanguage(lang.code)}><div aria-label="success" className="status status-success"></div> {lang.code.toUpperCase()} - {lang.name}</a>
</li>
);
}
return (
<li key={lang.code}>
<a onClick={() => setLanguage(lang.code)}>{lang.code.toUpperCase()} - {lang.name}</a>
</li>
);
})}
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
);
}
return (
<div>Loading</div>
);
}

View File

@@ -13,10 +13,10 @@ export async function GET(
const filePath = slug ? path.join(DATA_FOLDER, ...slug) : null;
if (!filePath) throw new Error()
const content = await fs.readFile(filePath);
const content = await fs.readFile(filePath, "utf-8");
if (!content) throw new Error()
return new NextResponse(content, { status: 200 });
return new NextResponse(content, { status: 200, headers: { "Content-Type": slug?.join("/").endsWith(".ics") ? "text/calendar" : "text/json" } });
} catch (ex) {
console.log(ex);
return new NextResponse("File not found", { status: 404 });

View File

@@ -1,4 +1,4 @@
export default function Flag({ iso3, name }: { iso3: string; name: string }) {
export default function Flag({ iso3, name, size }: { iso3: string; name: string, size?: "sm" }) {
const iso3to2: { [key: string]: string } = {
AFG: "AF",
@@ -259,9 +259,11 @@ export default function Flag({ iso3, name }: { iso3: string; name: string }) {
const iso2 = (iso3to2[iso3.toUpperCase()] || "").toLowerCase();
const className = size === "sm" ? 'inline-block h-3 mr-1' : 'inline-block h-5 mr-1 border-1 border-gray-300';
return <img
alt={name}
className={className}
src={`https://gstatic.olympics.com/s3/noc/oly/3x2/${iso3.toUpperCase()}.png`}
height="24"
alt={`${iso3} - ${iso2}`}
className="inline-block mx-2 h-5 border-1 border-gray-300" />
title={name}
/>
}

View File

@@ -1,16 +1,18 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import { Geist, Geist_Mono, DM_Sans } from "next/font/google";
import "./globals.css";
import Head from "next/head";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
fallback: ["sans-serif"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
const dmSans = DM_Sans({
variable: "--font-dm-sans",
subsets: ["latin"],
fallback: ["sans-serif"],
});
export const metadata: Metadata = {
@@ -29,7 +31,7 @@ export default function RootLayout({
<link rel="icon" href="/favicon.ico" sizes="any" />
</Head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
className={`${geistSans.variable} ${dmSans.className} antialiased`}
>
{children}
</body>

View File

@@ -1,395 +0,0 @@
"use client";
import { loadSchedule } from "../lib/data";
import { useEffect, useState } from "react";
import Flag from "./flag";
import { COPY, COPY_SUCCESS, FILTER_BY_COUNTRY, FILTER_BY_SPORT, MADE_BY_FABRICE, NOT_AFFILIATED } from "../lib/text";
import useLocalStorage from "@/lib/local-storage";
import { GoogleAnalytics } from "@next/third-parties/google";
interface MultilingualString {
[key: string]: string;
}
interface Language {
code: string;
name: string;
}
interface Sport {
key: string;
name: MultilingualString
}
interface Team {
key: string;
name: MultilingualString;
}
interface Match {
team1: Team;
team2: Team;
}
interface Event {
key: string;
start: string;
end: string;
sport: string;
isTraining: boolean;
medal: '0' | '1' | '3';
name: MultilingualString;
match?: Match;
}
interface Calendar {
languages: Language[];
sports: Sport[];
events: Event[];
nocs: Team[];
}
const COLORS = ['azzurro', 'giallo', 'rosa', 'rosso', 'verde', 'viola'];
export default function Home() {
const qs = typeof window !== 'undefined' ? window.location.search ? new URLSearchParams(window.location.search) : new URLSearchParams() : new URLSearchParams();
const [data, setData] = useState<Calendar | null>(null);
const [language, setLanguage] = useLocalStorage('lang', (navigator.language || 'en').split('-')[0]);
const [cookieConsent, setCookieConsent] = useLocalStorage('cookie-consent', 'null');
const translate = (text: MultilingualString) => {
return text[`${language}`] || text['en'] || Object.values(text)[0] || '';
};
const generateLink = ({ noc, sport, lang }: { noc?: string; sport?: string, lang?: string }) => {
const currentParams = new URLSearchParams(qs.toString());
if (noc !== undefined) {
if (noc === "") {
currentParams.delete('noc');
} else {
currentParams.set('noc', noc);
}
}
if (sport !== undefined) {
if (sport === "") {
currentParams.delete('sport');
} else {
currentParams.set('sport', sport);
}
}
if (lang !== undefined) {
if (lang === "") {
currentParams.delete('lang');
} else {
currentParams.set('lang', lang);
}
}
const paramString = currentParams.toString();
return paramString ? `./?${paramString}` : '.';
}
const generateCalendarLink = () => {
const host = typeof window !== 'undefined' ? window.location.host : '';
const noc = (qs.get('noc') || 'calendar').toLowerCase();
const sport = (qs.get('sport') || 'all-sports').toLowerCase();
return `http://${host}/api/data/${language}/${sport}/${noc}.ics`;
};
const getColor = (i: number) => COLORS[i % COLORS.length];
useEffect(() => {
if (data == null) {
loadSchedule()
.then(setData)
.catch(console.log);
}
}, [data]);
const filter = (event: Event) => {
let visible = true;
if (event.end < new Date().toISOString()) {
return false;
}
const sport = qs.get('sport');
if (sport && event.sport !== sport) {
visible = false;
}
const noc = qs.get('noc');
if (noc) {
if (event.match) {
if (event.match.team1.key !== noc && event.match.team2.key !== noc) {
visible = false;
}
} else {
visible = false;
}
}
return visible;
}
const copyToClipboard = (text: string) => {
if (typeof navigator !== 'undefined' && navigator.clipboard) {
const button = document.getElementById('copy_button')!;
navigator.clipboard.writeText(text).then(() => {
button.textContent = translate(COPY_SUCCESS);
button.classList.add('text-success');
button.classList.add('font-bold');
setTimeout(() => {
// document.getElementById('copy_toast')?.classList.remove('toast-open');
button.textContent = translate(COPY);
button.classList.remove('text-success');
button.classList.remove('font-bold');
}, 2000);
});
}
}
const calendarLink = generateCalendarLink();
if (data) {
let lastDay = "";
if (data.languages.find(lang => lang.code === language) === undefined) {
setLanguage('en')
}
return (
<div>
<div className="navbar bg-main">
<div className="navbar-start">
<a href="." className="text-xl">Milano Cortina 2026 Winter Olympics Calendar</a>
</div>
<div className="navbar-end">
<ul className="menu menu-horizontal px-2">
<li className="px-2">
<div className="dropdown">
<div tabIndex={0} role="button" className="select bg-transparent">
{qs.get('sport') ? (
<>{translate(data.sports.find((sport) => sport.key === qs.get('sport'))!.name)}</>
) : (
<>{translate(FILTER_BY_SPORT)}</>
)}
</div>
<ul tabIndex={-1} className="dropdown-content menu bg-base-100 text-black rounded-box z-1 w-52 p-2 shadow-sm">
{data.sports.sort((a, b) => translate(a.name).localeCompare(translate(b.name))).map(sport => {
if (sport.key === qs.get('sport')) {
return (
<li key={sport.key}>
<a href={generateLink({ sport: "" })}><div aria-label="success" className="status status-success"></div> {translate(sport.name)}</a>
</li>
)
}
return (
<li key={sport.key}>
<a href={generateLink({ sport: sport.key })}>{translate(sport.name)}</a>
</li>
)
})}
</ul>
</div>
</li>
<li className="px-2">
<div className="dropdown">
<div tabIndex={0} role="button" className="select bg-transparent">
{qs.get('noc') ? (
<>{translate(data.nocs.find((noc) => noc.key === qs.get('noc'))!.name)}</>
) : (
<>{translate(FILTER_BY_COUNTRY)}</>
)}
</div>
<ul tabIndex={-1} className="dropdown-content menu bg-base-100 text-black rounded-box z-1 w-52 p-2 shadow-sm">
{data.nocs.sort((a, b) => translate(a.name).localeCompare(translate(b.name))).map(noc => {
if (noc.key === qs.get('noc')) {
return (
<li key={noc.key}>
<a href={generateLink({ noc: "" })}><div aria-label="success" className="status status-success"></div> {translate(noc.name)}</a>
</li>
)
}
return (
<li key={noc.key}>
<a href={generateLink({ noc: noc.key })}>{translate(noc.name)}</a>
</li>
)
})}
</ul>
</div>
</li>
<li className="px-2">
<div className="dropdown dropdown-end">
<div tabIndex={0} role="button" className="btn btn-ghost">
<svg className="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path strokeLinejoin="round" strokeLinecap="round" strokeWidth="2" fill="none" stroke="currentColor" d="M12 21a9 9 0 1 0 0-18m0 18a9 9 0 1 1 0-18m0 18c2.761 0 3.941-5.163 3.941-9S14.761 3 12 3m0 18c-2.761 0-3.941-5.163-3.941-9S9.239 3 12 3M3.5 9h17m-17 6h17"></path>
</svg>
<svg className="mt-px hidden size-2 fill-current opacity-60 sm:inline-block" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2048 2048"><path d="M1799 349l242 241-1017 1017L7 590l242-241 775 775 775-775z"></path></svg>
</div>
<ul tabIndex={-1} className="menu menu-sm dropdown-content bg-base-100 text-black rounded-box z-1 mt-3 w-52 p-2 shadow">
{data.languages.map(lang => (
<li key={lang.code}>
<a onClick={() => setLanguage(lang.code)}>{lang.code.toUpperCase()} - {lang.name}</a>
</li>
))}
</ul>
</div>
</li>
</ul>
</div>
</div>
<div>
<div className="text-center pt-6">
<span className="input w-1/3">
<input type="text" placeholder={calendarLink} readOnly={true} />
<button id="copy_button" className="label cursor-pointer" onClick={() => copyToClipboard(calendarLink)}>{translate(COPY)}</button>
</span>
<a className="inline-block" href={calendarLink.replace("https://", "webcal://")} target="_blank">
<img src="/img/icon-apple.svg" alt="Apple Calendar" className="inline-block size-6 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://calendar.google.com/calendar/u/0/r?cid=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-google.svg" alt="Google Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://outlook.office.com/calendar/0/deeplink/subscribe?url=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-office365.svg" alt="Office 365 Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://outlook.live.com/calendar/0/deeplink/subscribe?url=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-outlookcom.svg" alt="Outlook Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
<a className="inline-block" href={`https://calendar.yahoo.com/?ics=${encodeURIComponent(calendarLink)}`} target="_blank">
<img src="/img/icon-yahoo.svg" alt="Yahoo Calendar" className="inline-block size-5 ml-4 mr-2" />
</a>
</div>
{
data.events
.filter(event => filter(event))
.sort((a, b) => a.start.localeCompare(b.start))
.map((event, i) => {
const startDate = new Date(event.start);
const endDate = new Date(event.end);
const startHours = startDate.getHours().toString().padStart(2, '0');
const startMinutes = startDate.getMinutes().toString().padStart(2, '0');
const endHours = endDate.getHours().toString().padStart(2, '0');
const endMinutes = endDate.getMinutes().toString().padStart(2, '0');
const participants = [];
let titleColor = "fg-main";
if (event.medal === '1') {
titleColor = "bg-gold";
} else if (event.medal === '3') {
titleColor = "bg-bronze";
}
if (event.match) {
participants.push(event.match.team1.key);
participants.push(event.match.team2.key);
}
const day = event.start.split('T')[0];
let dayHeader = <></>;
if (lastDay !== day) {
dayHeader = (
<div className="day-header text-center my-8">
<h2 className="text-3xl font-light fg-main">
{new Date(day).toLocaleDateString(language, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
</h2>
</div>
);
}
lastDay = day;
return (
<div key={event.key}>
{dayHeader}
<div className="py-4 mx-auto my-4 bg-white w-3/4 rounded-lg">
<div className={`fg-${getColor(i)} w-1/4 align-top text-right inline-block text-5xl tabular-nums pr-2 border-r border-slate-900/10`}>
<span className="time-start">{startHours}:{startMinutes}</span>
<div className="time-end text-xs">{endHours}:{endMinutes}</div>
</div>
<div className="w-3/5 align-top inline-block text-black pl-2">
<div className="px-2">
{translate(data.sports.find(sport => sport.key === event.sport)?.name || {}).toUpperCase()}
</div>
<div className={`font-bold inline-block px-2 ${titleColor}`}>{translate(event.name)}</div>
{event.match?.team1?.key && event.match?.team2.key && (
<div className="competitors min-w-md max-w-md px-2 font-light">
<div className="w-1/3 inline-block">
{translate(event.match.team1.name)}
</div>
<div className="w-1/9 inline-block">
<Flag iso3={event.match.team1.key} name={translate(event.match.team1.name)} />
</div>
<div className="w-1/9 inline-block text-center">-</div>
<div className="w-1/9 inline-block text-right">
<Flag iso3={event.match.team2.key} name={translate(event.match.team2.name)} />
</div>
<div className="w-1/3 inline-block text-right">
{translate(event.match.team2.name)}
</div>
</div>
)}
</div>
</div>
</div>
)
})
}
</div>
<footer className="footer footer-horizontal footer-center bg-gray-800 text-primary-content p-10">
<aside>
<p className="font-bold">
{translate(MADE_BY_FABRICE)}
</p>
<p>{translate(NOT_AFFILIATED)}</p>
</aside>
<nav>
<div className="grid grid-flow-col gap-4">
<a href="https://github.com/fabrice404/olympics-calendar" target="_blank">
<svg
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
viewBox="0 0 24 24"
className="fill-current">
<path d="M5.315 2.1c.791 -.113 1.9 .145 3.333 .966l.272 .161l.16 .1l.397 -.083a13.3 13.3 0 0 1 4.59 -.08l.456 .08l.396 .083l.161 -.1c1.385 -.84 2.487 -1.17 3.322 -1.148l.164 .008l.147 .017l.076 .014l.05 .011l.144 .047a1 1 0 0 1 .53 .514a5.2 5.2 0 0 1 .397 2.91l-.047 .267l-.046 .196l.123 .163c.574 .795 .93 1.728 1.03 2.707l.023 .295l.007 .272c0 3.855 -1.659 5.883 -4.644 6.68l-.245 .061l-.132 .029l.014 .161l.008 .157l.004 .365l-.002 .213l-.003 3.834a1 1 0 0 1 -.883 .993l-.117 .007h-6a1 1 0 0 1 -.993 -.883l-.007 -.117v-.734c-1.818 .26 -3.03 -.424 -4.11 -1.878l-.535 -.766c-.28 -.396 -.455 -.579 -.589 -.644l-.048 -.019a1 1 0 0 1 .564 -1.918c.642 .188 1.074 .568 1.57 1.239l.538 .769c.76 1.079 1.36 1.459 2.609 1.191l.001 -.678l-.018 -.168a5.03 5.03 0 0 1 -.021 -.824l.017 -.185l.019 -.12l-.108 -.024c-2.976 -.71 -4.703 -2.573 -4.875 -6.139l-.01 -.31l-.004 -.292a5.6 5.6 0 0 1 .908 -3.051l.152 -.222l.122 -.163l-.045 -.196a5.2 5.2 0 0 1 .145 -2.642l.1 -.282l.106 -.253a1 1 0 0 1 .529 -.514l.144 -.047l.154 -.03z" />
</svg>
</a>
</div>
</nav>
</footer>
{cookieConsent === 'true' &&
<GoogleAnalytics gaId="G-SLBLJRE0CM" />
}
{cookieConsent === 'null' &&
<div className="sticky bottom-0 bg-gray-800 text-white text-center p-8">
<p className="p-4">This website uses cookies for statistics purposes and to enhance the user experience.</p>
<button className="btn btn-sm mx-2" onClick={() => setCookieConsent('true')}>Accept</button>
<button className="btn btn-sm btn-outline" onClick={() => setCookieConsent('false')}>Decline</button>
</div>
}
</div>
);
}
return (
<div>Loading</div>
);
}

View File

@@ -82,3 +82,75 @@ export const NOT_AFFILIATED = {
ja: "このウェブサイトは国際オリンピック委員会とは提携していません。すべての商標、ロゴ、ブランド名はそれぞれの所有者の財産です。",
ru: "Этот веб-сайт не аффилирован с Международным олимпийским комитетом. Все торговые марки, логотипы и названия брендов являются собственностью их соответствующих владельцев."
}
export const NO_EVENT_FOR_FILTERS = {
en: "There's no event for the selected team and/or sport, please adjust your filters.",
fr: "Il n'y a pas d'événement pour l'équipe et/ou le sport sélectionné, veuillez ajuster vos filtres.",
es: "No hay ningún evento para el equipo y/o deporte seleccionado, por favor ajuste sus filtros.",
de: "Es gibt kein Ereignis für das ausgewählte Team und/oder den ausgewählten Sport, bitte passen Sie Ihre Filter an.",
it: "Non ci sono eventi per la squadra e/o lo sport selezionato, si prega di regolare i filtri.",
pt: "Não há evento para a equipe e/ou esporte selecionado, por favor ajuste seus filtros.",
zh: "所选团队和/或运动没有事件,请调整您的过滤器。",
ja: "選択したチームおよび/またはスポーツのイベントはありません。フィルターを調整してください。",
ru: "Для выбранной команды и/или вида спорта нет событий, пожалуйста, отрегулируйте ваши фильтры."
}
export const LANGUAGE = {
en: "Language",
fr: "Langue",
es: "Idioma",
de: "Sprache",
it: "Lingua",
pt: "Idioma",
zh: "语言",
ja: "言語",
ru: "Язык",
}
export const FILTER_BY_EVENT_TYPE = {
en: "Filter by event type",
fr: "Filtrer par type d'événement",
es: "Filtrar por tipo de evento",
de: "Nach Veranstaltungstyp filtern",
it: "Filtra per tipo di evento",
pt: "Filtrar por tipo de evento",
zh: "按事件类型筛选",
ja: "イベントタイプでフィルタリング",
ru: "Фильтр по типу события"
}
export const ALL_EVENTS = {
en: "All events",
fr: "Tous les événements",
es: "Todos los eventos",
de: "Alle Veranstaltungen",
it: "Tutti gli eventi",
pt: "Todos os eventos",
zh: "所有事件",
ja: "すべてのイベント",
ru: "Все события"
};
export const MEDAL_EVENTS = {
en: "Medal events",
fr: "Épreuves de médailles",
es: "Eventos de medallas",
de: "Medaillenveranstaltungen",
it: "Eventi di medaglia",
pt: "Eventos de medalha",
zh: "奖牌赛事",
ja: "メダルイベント",
ru: "Медальные события"
};
export const GOLD_MEDAL_EVENTS = {
en: "Gold medal events",
fr: "Épreuves de médailles d'or",
es: "Eventos de medallas de oro",
de: "Goldmedaillenveranstaltungen",
it: "Eventi di medaglia d'oro",
pt: "Eventos de medalha de ouro",
zh: "金牌赛事",
ja: "金メダルイベント",
ru: "Золотые медальные события"
};

463
ui/package-lock.json generated
View File

@@ -8,19 +8,19 @@
"name": "ui",
"version": "0.1.0",
"dependencies": {
"@next/third-parties": "^16.0.8",
"next": "16.0.8",
"react": "19.2.1",
"react-dom": "19.2.1"
"@next/third-parties": "^16.1.6",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4"
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"daisyui": "^5.5.8",
"eslint": "^9.39.1",
"eslint-config-next": "16.0.8",
"daisyui": "^5.5.19",
"eslint": "^9.39.3",
"eslint-config-next": "16.1.6",
"tailwindcss": "^4",
"typescript": "^5"
}
@@ -69,7 +69,6 @@
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@@ -420,9 +419,9 @@
}
},
"node_modules/@eslint/js": {
"version": "9.39.1",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
"integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
"version": "9.39.3",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.3.tgz",
"integrity": "sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1038,15 +1037,15 @@
}
},
"node_modules/@next/env": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.8.tgz",
"integrity": "sha512-xP4WrQZuj9MdmLJy3eWFHepo+R3vznsMSS8Dy3wdA7FKpjCiesQ6DxZvdGziQisj0tEtCgBKJzjcAc4yZOgLEQ==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.6.tgz",
"integrity": "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.8.tgz",
"integrity": "sha512-1miV0qXDcLUaOdHridVPCh4i39ElRIAraseVIbb3BEqyZ5ol9sPyjTP/GNTPV5rBxqxjF6/vv5zQTVbhiNaLqA==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.1.6.tgz",
"integrity": "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1054,9 +1053,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.8.tgz",
"integrity": "sha512-yjVMvTQN21ZHOclQnhSFbjBTEizle+1uo4NV6L4rtS9WO3nfjaeJYw+H91G+nEf3Ef43TaEZvY5mPWfB/De7tA==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.6.tgz",
"integrity": "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==",
"cpu": [
"arm64"
],
@@ -1070,9 +1069,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.8.tgz",
"integrity": "sha512-+zu2N3QQ0ZOb6RyqQKfcu/pn0UPGmg+mUDqpAAEviAcEVEYgDckemOpiMRsBP3IsEKpcoKuNzekDcPczEeEIzA==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.6.tgz",
"integrity": "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==",
"cpu": [
"x64"
],
@@ -1086,9 +1085,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.8.tgz",
"integrity": "sha512-LConttk+BeD0e6RG0jGEP9GfvdaBVMYsLJ5aDDweKiJVVCu6sGvo+Ohz9nQhvj7EQDVVRJMCGhl19DmJwGr6bQ==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.6.tgz",
"integrity": "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==",
"cpu": [
"arm64"
],
@@ -1102,9 +1101,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.8.tgz",
"integrity": "sha512-JaXFAlqn8fJV+GhhA9lpg6da/NCN/v9ub98n3HoayoUSPOVdoxEEt86iT58jXqQCs/R3dv5ZnxGkW8aF4obMrQ==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.6.tgz",
"integrity": "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==",
"cpu": [
"arm64"
],
@@ -1118,9 +1117,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.8.tgz",
"integrity": "sha512-O7M9it6HyNhsJp3HNAsJoHk5BUsfj7hRshfptpGcVsPZ1u0KQ/oVy8oxF7tlwxA5tR43VUP0yRmAGm1us514ng==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.6.tgz",
"integrity": "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==",
"cpu": [
"x64"
],
@@ -1134,9 +1133,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.8.tgz",
"integrity": "sha512-8+KClEC/GLI2dLYcrWwHu5JyC5cZYCFnccVIvmxpo6K+XQt4qzqM5L4coofNDZYkct/VCCyJWGbZZDsg6w6LFA==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.6.tgz",
"integrity": "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==",
"cpu": [
"x64"
],
@@ -1150,9 +1149,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.8.tgz",
"integrity": "sha512-rpQ/PgTEgH68SiXmhu/cJ2hk9aZ6YgFvspzQWe2I9HufY6g7V02DXRr/xrVqOaKm2lenBFPNQ+KAaeveywqV+A==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.6.tgz",
"integrity": "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==",
"cpu": [
"arm64"
],
@@ -1166,9 +1165,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.8.tgz",
"integrity": "sha512-jWpWjWcMQu2iZz4pEK2IktcfR+OA9+cCG8zenyLpcW8rN4rzjfOzH4yj/b1FiEAZHKS+5Vq8+bZyHi+2yqHbFA==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.6.tgz",
"integrity": "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==",
"cpu": [
"x64"
],
@@ -1182,9 +1181,9 @@
}
},
"node_modules/@next/third-parties": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-16.0.8.tgz",
"integrity": "sha512-F8TNI1GFm7ivZX6HBMDVsDklAXOHlACbtw7w3WFbDk2oFXdVgKZBfdK+ILhjTBK4ibIXzLMWO1Py3bgSETKHYQ==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-16.1.6.tgz",
"integrity": "sha512-/cLY1egaH529ylSMSK+C8dA3nWDLL4hOFR4fca9OLWWxjcNwzsbuq2pPb/tmdWL9Zj3K1nTjd1pWQoSlaDQ0VA==",
"license": "MIT",
"dependencies": {
"third-party-capital": "1.0.20"
@@ -1259,49 +1258,49 @@
}
},
"node_modules/@tailwindcss/node": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz",
"integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz",
"integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/remapping": "^2.3.4",
"enhanced-resolve": "^5.18.3",
"@jridgewell/remapping": "^2.3.5",
"enhanced-resolve": "^5.19.0",
"jiti": "^2.6.1",
"lightningcss": "1.30.2",
"lightningcss": "1.31.1",
"magic-string": "^0.30.21",
"source-map-js": "^1.2.1",
"tailwindcss": "4.1.17"
"tailwindcss": "4.2.1"
}
},
"node_modules/@tailwindcss/oxide": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz",
"integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz",
"integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 10"
"node": ">= 20"
},
"optionalDependencies": {
"@tailwindcss/oxide-android-arm64": "4.1.17",
"@tailwindcss/oxide-darwin-arm64": "4.1.17",
"@tailwindcss/oxide-darwin-x64": "4.1.17",
"@tailwindcss/oxide-freebsd-x64": "4.1.17",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17",
"@tailwindcss/oxide-linux-arm64-gnu": "4.1.17",
"@tailwindcss/oxide-linux-arm64-musl": "4.1.17",
"@tailwindcss/oxide-linux-x64-gnu": "4.1.17",
"@tailwindcss/oxide-linux-x64-musl": "4.1.17",
"@tailwindcss/oxide-wasm32-wasi": "4.1.17",
"@tailwindcss/oxide-win32-arm64-msvc": "4.1.17",
"@tailwindcss/oxide-win32-x64-msvc": "4.1.17"
"@tailwindcss/oxide-android-arm64": "4.2.1",
"@tailwindcss/oxide-darwin-arm64": "4.2.1",
"@tailwindcss/oxide-darwin-x64": "4.2.1",
"@tailwindcss/oxide-freebsd-x64": "4.2.1",
"@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1",
"@tailwindcss/oxide-linux-arm64-gnu": "4.2.1",
"@tailwindcss/oxide-linux-arm64-musl": "4.2.1",
"@tailwindcss/oxide-linux-x64-gnu": "4.2.1",
"@tailwindcss/oxide-linux-x64-musl": "4.2.1",
"@tailwindcss/oxide-wasm32-wasi": "4.2.1",
"@tailwindcss/oxide-win32-arm64-msvc": "4.2.1",
"@tailwindcss/oxide-win32-x64-msvc": "4.2.1"
}
},
"node_modules/@tailwindcss/oxide-android-arm64": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz",
"integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz",
"integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==",
"cpu": [
"arm64"
],
@@ -1312,13 +1311,13 @@
"android"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-arm64": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz",
"integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz",
"integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==",
"cpu": [
"arm64"
],
@@ -1329,13 +1328,13 @@
"darwin"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-darwin-x64": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz",
"integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz",
"integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==",
"cpu": [
"x64"
],
@@ -1346,13 +1345,13 @@
"darwin"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-freebsd-x64": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz",
"integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz",
"integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==",
"cpu": [
"x64"
],
@@ -1363,13 +1362,13 @@
"freebsd"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz",
"integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz",
"integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==",
"cpu": [
"arm"
],
@@ -1380,13 +1379,13 @@
"linux"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz",
"integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz",
"integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==",
"cpu": [
"arm64"
],
@@ -1397,13 +1396,13 @@
"linux"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-arm64-musl": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz",
"integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz",
"integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==",
"cpu": [
"arm64"
],
@@ -1414,13 +1413,13 @@
"linux"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-gnu": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz",
"integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz",
"integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==",
"cpu": [
"x64"
],
@@ -1431,13 +1430,13 @@
"linux"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-linux-x64-musl": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz",
"integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz",
"integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==",
"cpu": [
"x64"
],
@@ -1448,13 +1447,13 @@
"linux"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz",
"integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz",
"integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==",
"bundleDependencies": [
"@napi-rs/wasm-runtime",
"@emnapi/core",
@@ -1470,19 +1469,19 @@
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "^1.6.0",
"@emnapi/runtime": "^1.6.0",
"@emnapi/core": "^1.8.1",
"@emnapi/runtime": "^1.8.1",
"@emnapi/wasi-threads": "^1.1.0",
"@napi-rs/wasm-runtime": "^1.0.7",
"@napi-rs/wasm-runtime": "^1.1.1",
"@tybys/wasm-util": "^0.10.1",
"tslib": "^2.4.0"
"tslib": "^2.8.1"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
"version": "1.6.0",
"version": "1.8.1",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -1493,7 +1492,7 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
"version": "1.6.0",
"version": "1.8.1",
"dev": true,
"inBundle": true,
"license": "MIT",
@@ -1513,15 +1512,19 @@
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
"version": "1.0.7",
"version": "1.1.1",
"dev": true,
"inBundle": true,
"license": "MIT",
"optional": true,
"dependencies": {
"@emnapi/core": "^1.5.0",
"@emnapi/runtime": "^1.5.0",
"@emnapi/core": "^1.7.1",
"@emnapi/runtime": "^1.7.1",
"@tybys/wasm-util": "^0.10.1"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/Brooooooklyn"
}
},
"node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
@@ -1542,9 +1545,9 @@
"optional": true
},
"node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz",
"integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz",
"integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==",
"cpu": [
"arm64"
],
@@ -1555,13 +1558,13 @@
"win32"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/oxide-win32-x64-msvc": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz",
"integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz",
"integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==",
"cpu": [
"x64"
],
@@ -1572,21 +1575,21 @@
"win32"
],
"engines": {
"node": ">= 10"
"node": ">= 20"
}
},
"node_modules/@tailwindcss/postcss": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.17.tgz",
"integrity": "sha512-+nKl9N9mN5uJ+M7dBOOCzINw94MPstNR/GtIhz1fpZysxL/4a+No64jCBD6CPN+bIHWFx3KWuu8XJRrj/572Dw==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz",
"integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@alloc/quick-lru": "^5.2.0",
"@tailwindcss/node": "4.1.17",
"@tailwindcss/oxide": "4.1.17",
"postcss": "^8.4.41",
"tailwindcss": "4.1.17"
"@tailwindcss/node": "4.2.1",
"@tailwindcss/oxide": "4.2.1",
"postcss": "^8.5.6",
"tailwindcss": "4.2.1"
}
},
"node_modules/@tybys/wasm-util": {
@@ -1622,9 +1625,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
"version": "20.19.26",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.26.tgz",
"integrity": "sha512-0l6cjgF0XnihUpndDhk+nyD3exio3iKaYROSgvh/qSevPXax3L8p5DBRFjbvalnwatGgHEQn2R88y2fA3g4irg==",
"version": "20.19.35",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.35.tgz",
"integrity": "sha512-Uarfe6J91b9HAUXxjvSOdiO2UPOKLm07Q1oh0JHxoZ1y8HoqxDAu3gVrsrOHeiio0kSsoVBt4wFrKOm0dKxVPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1632,12 +1635,11 @@
}
},
"node_modules/@types/react": {
"version": "19.2.7",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
"integrity": "sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==",
"version": "19.2.14",
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz",
"integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"csstype": "^3.2.2"
}
@@ -1698,7 +1700,6 @@
"integrity": "sha512-jCzKdm/QK0Kg4V4IK/oMlRZlY+QOcdjv89U2NgKHZk1CYTj82/RVSx1mV/0gqCVMJ/DA+Zf/S4NBWNF8GQ+eqQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.48.0",
"@typescript-eslint/types": "8.48.0",
@@ -2198,7 +2199,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -2490,7 +2490,6 @@
"version": "2.8.32",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.32.tgz",
"integrity": "sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.js"
@@ -2540,7 +2539,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.25",
"caniuse-lite": "^1.0.30001754",
@@ -2715,9 +2713,9 @@
"license": "MIT"
},
"node_modules/daisyui": {
"version": "5.5.8",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.8.tgz",
"integrity": "sha512-6psL9jIEOFOw68V10j/BKCWcRgx8dh81mmNxShr+g7HDM6UHNoPharlp9zq/PQkHNuGU1ZQsajR3HgpvavbRKQ==",
"version": "5.5.19",
"resolved": "https://registry.npmjs.org/daisyui/-/daisyui-5.5.19.tgz",
"integrity": "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA==",
"dev": true,
"license": "MIT",
"funding": {
@@ -2899,14 +2897,14 @@
"license": "MIT"
},
"node_modules/enhanced-resolve": {
"version": "5.18.3",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz",
"integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==",
"version": "5.19.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
"integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
"dev": true,
"license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
"tapable": "^2.3.0"
},
"engines": {
"node": ">=10.13.0"
@@ -3113,12 +3111,11 @@
}
},
"node_modules/eslint": {
"version": "9.39.1",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
"integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
"version": "9.39.3",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.3.tgz",
"integrity": "sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -3126,7 +3123,7 @@
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "9.39.1",
"@eslint/js": "9.39.3",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
@@ -3174,13 +3171,13 @@
}
},
"node_modules/eslint-config-next": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.8.tgz",
"integrity": "sha512-8J5cOAboXIV3f8OD6BOyj7Fik6n/as7J4MboiUSExWruf/lCu1OPR3ZVSdnta6WhzebrmAATEmNSBZsLWA6kbg==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.1.6.tgz",
"integrity": "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@next/eslint-plugin-next": "16.0.8",
"@next/eslint-plugin-next": "16.1.6",
"eslint-import-resolver-node": "^0.3.6",
"eslint-import-resolver-typescript": "^3.5.2",
"eslint-plugin-import": "^2.32.0",
@@ -3304,7 +3301,6 @@
"integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.9",
@@ -3590,9 +3586,9 @@
"license": "MIT"
},
"node_modules/fastq": {
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
"version": "1.20.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz",
"integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -4628,9 +4624,9 @@
}
},
"node_modules/lightningcss": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz",
"integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
@@ -4644,23 +4640,23 @@
"url": "https://opencollective.com/parcel"
},
"optionalDependencies": {
"lightningcss-android-arm64": "1.30.2",
"lightningcss-darwin-arm64": "1.30.2",
"lightningcss-darwin-x64": "1.30.2",
"lightningcss-freebsd-x64": "1.30.2",
"lightningcss-linux-arm-gnueabihf": "1.30.2",
"lightningcss-linux-arm64-gnu": "1.30.2",
"lightningcss-linux-arm64-musl": "1.30.2",
"lightningcss-linux-x64-gnu": "1.30.2",
"lightningcss-linux-x64-musl": "1.30.2",
"lightningcss-win32-arm64-msvc": "1.30.2",
"lightningcss-win32-x64-msvc": "1.30.2"
"lightningcss-android-arm64": "1.31.1",
"lightningcss-darwin-arm64": "1.31.1",
"lightningcss-darwin-x64": "1.31.1",
"lightningcss-freebsd-x64": "1.31.1",
"lightningcss-linux-arm-gnueabihf": "1.31.1",
"lightningcss-linux-arm64-gnu": "1.31.1",
"lightningcss-linux-arm64-musl": "1.31.1",
"lightningcss-linux-x64-gnu": "1.31.1",
"lightningcss-linux-x64-musl": "1.31.1",
"lightningcss-win32-arm64-msvc": "1.31.1",
"lightningcss-win32-x64-msvc": "1.31.1"
}
},
"node_modules/lightningcss-android-arm64": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz",
"integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz",
"integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==",
"cpu": [
"arm64"
],
@@ -4679,9 +4675,9 @@
}
},
"node_modules/lightningcss-darwin-arm64": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
"integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz",
"integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==",
"cpu": [
"arm64"
],
@@ -4700,9 +4696,9 @@
}
},
"node_modules/lightningcss-darwin-x64": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz",
"integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz",
"integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==",
"cpu": [
"x64"
],
@@ -4721,9 +4717,9 @@
}
},
"node_modules/lightningcss-freebsd-x64": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz",
"integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz",
"integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==",
"cpu": [
"x64"
],
@@ -4742,9 +4738,9 @@
}
},
"node_modules/lightningcss-linux-arm-gnueabihf": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz",
"integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz",
"integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==",
"cpu": [
"arm"
],
@@ -4763,9 +4759,9 @@
}
},
"node_modules/lightningcss-linux-arm64-gnu": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz",
"integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz",
"integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==",
"cpu": [
"arm64"
],
@@ -4784,9 +4780,9 @@
}
},
"node_modules/lightningcss-linux-arm64-musl": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz",
"integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz",
"integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==",
"cpu": [
"arm64"
],
@@ -4805,9 +4801,9 @@
}
},
"node_modules/lightningcss-linux-x64-gnu": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz",
"integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz",
"integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==",
"cpu": [
"x64"
],
@@ -4826,9 +4822,9 @@
}
},
"node_modules/lightningcss-linux-x64-musl": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz",
"integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz",
"integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==",
"cpu": [
"x64"
],
@@ -4847,9 +4843,9 @@
}
},
"node_modules/lightningcss-win32-arm64-msvc": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz",
"integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz",
"integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==",
"cpu": [
"arm64"
],
@@ -4868,9 +4864,9 @@
}
},
"node_modules/lightningcss-win32-x64-msvc": {
"version": "1.30.2",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz",
"integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==",
"version": "1.31.1",
"resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz",
"integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==",
"cpu": [
"x64"
],
@@ -5050,14 +5046,14 @@
"license": "MIT"
},
"node_modules/next": {
"version": "16.0.8",
"resolved": "https://registry.npmjs.org/next/-/next-16.0.8.tgz",
"integrity": "sha512-LmcZzG04JuzNXi48s5P+TnJBsTGPJunViNKV/iE4uM6kstjTQsQhvsAv+xF6MJxU2Pr26tl15eVbp0jQnsv6/g==",
"version": "16.1.6",
"resolved": "https://registry.npmjs.org/next/-/next-16.1.6.tgz",
"integrity": "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@next/env": "16.0.8",
"@next/env": "16.1.6",
"@swc/helpers": "0.5.15",
"baseline-browser-mapping": "^2.8.3",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
"styled-jsx": "5.1.6"
@@ -5069,14 +5065,14 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
"@next/swc-darwin-arm64": "16.0.8",
"@next/swc-darwin-x64": "16.0.8",
"@next/swc-linux-arm64-gnu": "16.0.8",
"@next/swc-linux-arm64-musl": "16.0.8",
"@next/swc-linux-x64-gnu": "16.0.8",
"@next/swc-linux-x64-musl": "16.0.8",
"@next/swc-win32-arm64-msvc": "16.0.8",
"@next/swc-win32-x64-msvc": "16.0.8",
"@next/swc-darwin-arm64": "16.1.6",
"@next/swc-darwin-x64": "16.1.6",
"@next/swc-linux-arm64-gnu": "16.1.6",
"@next/swc-linux-arm64-musl": "16.1.6",
"@next/swc-linux-x64-gnu": "16.1.6",
"@next/swc-linux-x64-musl": "16.1.6",
"@next/swc-win32-arm64-msvc": "16.1.6",
"@next/swc-win32-x64-msvc": "16.1.6",
"sharp": "^0.34.4"
},
"peerDependencies": {
@@ -5480,26 +5476,24 @@
"license": "MIT"
},
"node_modules/react": {
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.1.tgz",
"integrity": "sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==",
"version": "19.2.4",
"resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz",
"integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-dom": {
"version": "19.2.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.1.tgz",
"integrity": "sha512-ibrK8llX2a4eOskq1mXKu/TGZj9qzomO+sNfO98M6d9zIPOEhlBkMkBUBLd1vgS0gQsLDBzA+8jJBVXDnfHmJg==",
"version": "19.2.4",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz",
"integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"scheduler": "^0.27.0"
},
"peerDependencies": {
"react": "^19.2.1"
"react": "^19.2.4"
}
},
"node_modules/react-is": {
@@ -6122,9 +6116,9 @@
}
},
"node_modules/tailwindcss": {
"version": "4.1.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz",
"integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==",
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz",
"integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==",
"dev": true,
"license": "MIT"
},
@@ -6189,7 +6183,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -6352,7 +6345,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -6628,7 +6620,6 @@
"integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==",
"dev": true,
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/colinhacks"
}

View File

@@ -9,19 +9,19 @@
"lint": "eslint"
},
"dependencies": {
"@next/third-parties": "^16.0.8",
"next": "16.0.8",
"react": "19.2.1",
"react-dom": "19.2.1"
"@next/third-parties": "^16.1.6",
"next": "16.1.6",
"react": "19.2.4",
"react-dom": "19.2.4"
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"daisyui": "^5.5.8",
"eslint": "^9.39.1",
"eslint-config-next": "16.0.8",
"daisyui": "^5.5.19",
"eslint": "^9.39.3",
"eslint-config-next": "16.1.6",
"tailwindcss": "^4",
"typescript": "^5"
}