From ab9ec31a04f524728f88ef3d849922cb84008bd3 Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Mon, 8 Sep 2025 11:35:38 +0200 Subject: [PATCH] refactor: various workspaces to vitest (#62058) Co-authored-by: Mrugesh Mohapatra <1884376+raisedadead@users.noreply.github.com> --- curriculum/build-curriculum.test.js | 22 +- curriculum/build-superblock.test.js | 13 +- curriculum/file-handler.js | 18 +- curriculum/get-challenges.test.js | 4 +- curriculum/package.json | 4 +- curriculum/test/utils/sort-challenges.test.js | 6 +- curriculum/utils.test.ts | 2 + jest.config.js | 9 +- package.json | 6 +- pnpm-lock.yaml | 323 ++++++++++++------ .../helpers/create-project.test.ts | 15 +- .../helpers/get-arg-value.test.ts | 1 + .../helpers/get-file-name.test.ts | 1 + .../helpers/get-project-info.test.ts | 1 + .../helpers/get-step-template.test.ts | 1 + .../helpers/insert-erms.test.ts | 1 + .../helpers/project-metadata.test.ts | 3 +- .../helpers/utils.test.ts | 1 + tools/challenge-helper-scripts/package.json | 8 +- tools/challenge-helper-scripts/utils.test.ts | 66 ++-- .../build-external-curricula-data-v1.test.ts | 1 + .../build-external-curricula-data-v2.test.ts | 1 + tools/scripts/build/package.json | 9 +- 23 files changed, 342 insertions(+), 174 deletions(-) diff --git a/curriculum/build-curriculum.test.js b/curriculum/build-curriculum.test.js index 29ff9347ae4..9188334023d 100644 --- a/curriculum/build-curriculum.test.js +++ b/curriculum/build-curriculum.test.js @@ -1,15 +1,17 @@ -jest.mock('./file-handler'); +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, it, expect, vi } from 'vitest'; -const path = require('node:path'); - -const { +import { createCommentMap, addBlockStructure, getSuperblocks -} = require('./build-curriculum'); -const { getCurriculumStructure } = require('./file-handler'); +} from './build-curriculum.js'; +import { getCurriculumStructure } from './file-handler.js'; -const mockGetCurriculumStructure = getCurriculumStructure; +vi.mock('./file-handler'); +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); describe('createCommentMap', () => { const dictionaryDir = path.resolve(__dirname, '__fixtures__', 'dictionaries'); @@ -115,7 +117,7 @@ describe('addBlockStructure', () => { describe('getSuperblocks', () => { it('returns an empty array if no superblocks contain the given block', () => { - mockGetCurriculumStructure.mockReturnValue({ + getCurriculumStructure.mockReturnValue({ superblocks: ['superblock-1'] // doesn't matter what this is, but must be defined }); const mockAddSuperblockStructure = () => [ @@ -131,7 +133,7 @@ describe('getSuperblocks', () => { }); it('returns an array with one superblock if one superblock contains the given block', () => { - mockGetCurriculumStructure.mockReturnValue({ + getCurriculumStructure.mockReturnValue({ superblocks: ['superblock-1'] // doesn't matter what this is, but must be defined }); const mockAddSuperblockStructure = () => [ @@ -147,7 +149,7 @@ describe('getSuperblocks', () => { }); it('returns an array with multiple superblocks if multiple superblocks contain the given block', () => { - mockGetCurriculumStructure.mockReturnValue({ + getCurriculumStructure.mockReturnValue({ superblocks: ['superblock-1'] // doesn't matter what this is, but must be defined }); const mockAddSuperblockStructure = () => [ diff --git a/curriculum/build-superblock.test.js b/curriculum/build-superblock.test.js index a12bb5470df..1b454cf9226 100644 --- a/curriculum/build-superblock.test.js +++ b/curriculum/build-superblock.test.js @@ -1,5 +1,6 @@ -const { isPoly } = require('../shared/utils/polyvinyl'); -const { +import { describe, test, expect, vi } from 'vitest'; +import { isPoly } from '../shared/utils/polyvinyl.js'; +import { validateChallenges, buildBlock, transformSuperBlock, @@ -7,7 +8,7 @@ const { fixChallengeProperties, SuperblockCreator, finalizeChallenge -} = require('./build-superblock'); +} from './build-superblock.js'; const dummyFullStackSuperBlock = { chapters: [ @@ -297,7 +298,7 @@ describe('buildSuperblock pure functions', () => { }); test('should log errors for duplicate titles in meta if shouldThrow is false', () => { - jest.spyOn(console, 'error'); + vi.spyOn(console, 'error'); const foundChallenges = [ { id: '1', title: 'Challenge 1' }, { id: '2', title: 'Challenge 2' } @@ -401,7 +402,7 @@ describe('buildSuperblock pure functions', () => { }); describe('finalizeChallenge', () => { - it('should add meta properties', async () => { + test('should add meta properties', async () => { const challenge = finalizeChallenge( { id: '1' @@ -548,7 +549,7 @@ describe('buildSuperblock pure functions', () => { describe('SuperblockCreator class', () => { describe('processSuperblock', () => { test('should process blocks using the provided processing function', async () => { - const mockProcessBlockFn = jest + const mockProcessBlockFn = vi .fn() .mockResolvedValueOnce('Block 1') .mockResolvedValueOnce('Block 2') diff --git a/curriculum/file-handler.js b/curriculum/file-handler.js index 7f2f3d7c9fa..18cefa26868 100644 --- a/curriculum/file-handler.js +++ b/curriculum/file-handler.js @@ -3,8 +3,6 @@ const assert = require('node:assert'); const fs = require('node:fs'); const fsP = require('node:fs/promises'); -// const prettier = require('prettier'); - const debug = require('debug')('fcc:file-handler'); const CURRICULUM_DIR = __dirname; @@ -101,14 +99,22 @@ function getBlockStructure(block) { } async function writeBlockStructure(block, structure) { - // TODO: format with prettier (jest, at least this version, is not compatible - // with prettier) - const content = JSON.stringify(structure); + // dynamically importing prettier because Gatsby build and develop fail when + // it's required. + const prettier = await import('prettier'); + const content = await prettier.format(JSON.stringify(structure), { + parser: 'json' + }); await fsP.writeFile(getBlockStructurePath(block), content, 'utf8'); } async function writeSuperblockStructure(superblock, structure) { - const content = JSON.stringify(structure); + // dynamically importing prettier because Gatsby build and develop fail when + // it's required. + const prettier = await import('prettier'); + const content = await prettier.format(JSON.stringify(structure), { + parser: 'json' + }); await fsP.writeFile(getSuperblockStructurePath(superblock), content); } diff --git a/curriculum/get-challenges.test.js b/curriculum/get-challenges.test.js index 97e9a9e7438..a848b4023d0 100644 --- a/curriculum/get-challenges.test.js +++ b/curriculum/get-challenges.test.js @@ -1,4 +1,6 @@ -const { hasEnglishSource, getChallengesForLang } = require('./get-challenges'); +import { describe, it, expect } from 'vitest'; + +import { hasEnglishSource, getChallengesForLang } from './get-challenges.js'; const EXISTING_CHALLENGE_PATH = 'challenge.md'; const MISSING_CHALLENGE_PATH = 'no/challenge.md'; diff --git a/curriculum/package.json b/curriculum/package.json index 51f3b2de4ba..1b06a27d944 100644 --- a/curriculum/package.json +++ b/curriculum/package.json @@ -42,6 +42,7 @@ "@babel/core": "7.23.7", "@babel/register": "7.23.7", "@compodoc/live-server": "^1.2.3", + "@vitest/ui": "^3.2.4", "chai": "4.4.1", "glob": "8.1.0", "invariant": "2.2.4", @@ -55,6 +56,7 @@ "ora": "5.4.1", "puppeteer": "22.12.1", "readdirp": "3.6.0", - "string-similarity": "4.0.4" + "string-similarity": "4.0.4", + "vitest": "^3.2.4" } } diff --git a/curriculum/test/utils/sort-challenges.test.js b/curriculum/test/utils/sort-challenges.test.js index a80c0b16ca4..0ae15451eb9 100644 --- a/curriculum/test/utils/sort-challenges.test.js +++ b/curriculum/test/utils/sort-challenges.test.js @@ -1,5 +1,7 @@ -const { shuffleArray } = require('../../../shared/utils/shuffle-array'); -const { sortChallenges } = require('./sort-challenges'); +import { describe, it, expect } from 'vitest'; + +import { shuffleArray } from '../../../shared/utils/shuffle-array.js'; +import { sortChallenges } from './sort-challenges.js'; const challenges = [ { diff --git a/curriculum/utils.test.ts b/curriculum/utils.test.ts index abd389f4de7..efbf247ee0f 100644 --- a/curriculum/utils.test.ts +++ b/curriculum/utils.test.ts @@ -1,5 +1,7 @@ import path from 'path'; import { config } from 'dotenv'; +import { describe, it, expect } from 'vitest'; + import { SuperBlocks } from '../shared/config/curriculum'; import { createSuperOrder, diff --git a/jest.config.js b/jest.config.js index 7cef17b8799..7496579148f 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,5 +1,12 @@ module.exports = { - testPathIgnorePatterns: ['/node_modules/', 'api/', 'e2e/'], + testPathIgnorePatterns: [ + '/node_modules/', + 'api/', + 'e2e/', + 'tools/challenge-helper-scripts/', + 'tools/scripts/build/', + 'curriculum' + ], moduleNameMapper: { '\\.(jpg|jpeg|png|svg|woff|woff2)$': '/client/src/__mocks__/file-mock.ts', diff --git a/package.json b/package.json index bdacdf9cd0b..186cfc7b213 100644 --- a/package.json +++ b/package.json @@ -72,11 +72,13 @@ "test": "NODE_OPTIONS='--max-old-space-size=7168' run-s create:shared build:curriculum build-workers test:*", "test:source": "jest", "test:api": "cd api && pnpm test", - "test:curriculum": "cd ./curriculum && pnpm test", + "test:tools:challenge-helper-scripts": "cd ./tools/challenge-helper-scripts && pnpm test run", + "test:tools:scripts-build": "cd ./tools/scripts/build && pnpm test run", + "test:curriculum:content": "cd ./curriculum && pnpm test", + "test:curriculum:tooling": "cd ./curriculum && pnpm vitest run", "test-curriculum-full-output": "cd ./curriculum && pnpm run test:full-output", "test-client": "jest client", "test-config": "jest config", - "test-curriculum-js": "jest curriculum", "test-tools": "jest tools", "test-utils": "jest utils", "prepare": "husky", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56957979ce9..23789cf2386 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -393,34 +393,34 @@ importers: version: 4.20.10 gatsby: specifier: 3.15.0 - version: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + version: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-cli: specifier: 3.15.0 version: 3.15.0 gatsby-plugin-create-client-paths: specifier: 3.15.0 - version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) gatsby-plugin-manifest: specifier: 3.15.0 - version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) + version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@16.10.0) gatsby-plugin-pnpm: specifier: ^1.2.10 - version: 1.2.10(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + version: 1.2.10(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) gatsby-plugin-postcss: specifier: 4.15.0 - version: 4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(postcss@8.4.35)(webpack@5.90.3) + version: 4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(postcss@8.4.35)(webpack@5.90.3) gatsby-plugin-react-helmet: specifier: 4.15.0 - version: 4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(react-helmet@6.1.0(react@17.0.2)) + version: 4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(react-helmet@6.1.0(react@17.0.2)) gatsby-plugin-remove-serviceworker: specifier: 1.0.0 version: 1.0.0 gatsby-source-filesystem: specifier: 3.15.0 - version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + version: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) gatsby-transformer-remark: specifier: 5.25.1 - version: 5.25.1(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + version: 5.25.1(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) i18next: specifier: 25.2.1 version: 25.2.1(typescript@5.2.2) @@ -661,7 +661,7 @@ importers: version: 16.4.5 gatsby-plugin-webpack-bundle-analyser-v2: specifier: 1.1.32 - version: 1.1.32(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + version: 1.1.32(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) i18next-fs-backend: specifier: 2.6.0 version: 2.6.0 @@ -704,6 +704,9 @@ importers: '@compodoc/live-server': specifier: ^1.2.3 version: 1.2.3 + '@vitest/ui': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) chai: specifier: 4.4.1 version: 4.4.1 @@ -746,6 +749,9 @@ importers: string-similarity: specifier: 4.0.4 version: 4.0.4 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@16.7.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) shared: dependencies: @@ -832,6 +838,9 @@ importers: '@types/inquirer': specifier: ^8.2.5 version: 8.2.11 + '@vitest/ui': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) bson-objectid: specifier: 2.0.4 version: 2.0.4 @@ -850,6 +859,9 @@ importers: typescript: specifier: 5.2.2 version: 5.2.2 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.2.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) tools/challenge-parser: dependencies: @@ -952,7 +964,7 @@ importers: dependencies: '@freecodecamp/curriculum-helpers': specifier: ^5.4.1 - version: 5.4.1(debug@4.3.4)(typescript@5.8.2) + version: 5.4.1(debug@4.3.4)(typescript@5.7.3) xterm: specifier: ^5.2.1 version: 5.3.0 @@ -974,7 +986,7 @@ importers: version: 8.0.1(webpack-cli@4.10.0) '@typescript/vfs': specifier: ^1.6.0 - version: 1.6.1(typescript@5.8.2) + version: 1.6.1(typescript@5.7.3) babel-loader: specifier: 8.3.0 version: 8.3.0(@babel/core@7.23.7)(webpack@5.90.3) @@ -1031,18 +1043,18 @@ importers: '@total-typescript/ts-reset': specifier: ^0.5.0 version: 0.5.1 - '@types/chai': - specifier: ^4.3.16 - version: 4.3.20 - chai: - specifier: 4.4.1 - version: 4.4.1 + '@vitest/ui': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) joi: specifier: 17.12.2 version: 17.12.2 readdirp: specifier: 3.6.0 version: 3.6.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) tools/scripts/seed: devDependencies: @@ -4421,9 +4433,6 @@ packages: '@types/canvas-confetti@1.9.0': resolution: {integrity: sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg==} - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} @@ -7818,14 +7827,6 @@ packages: fd@0.0.3: resolution: {integrity: sha512-iAHrIslQb3U68OcMSP0kkNWabp7sSN6d2TBSb2JO3gcLJVDd4owr/hKM4SFJovFOUeeXeItjYgouEDTMWiVAnA==} - fdir@6.4.5: - resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -11234,10 +11235,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.3: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} @@ -11737,6 +11734,7 @@ packages: puppeteer@22.12.1: resolution: {integrity: sha512-1GxY8dnEnHr1SLzdSDr0FCjM6JQfAh2E2I/EqzeF8a58DbGVk9oVjj4lFdqNoVbpgFSpAbz7VER9St7S1wDpNg==} engines: {node: '>=18'} + deprecated: < 24.9.0 is no longer supported hasBin: true puppeteer@24.10.0: @@ -17491,7 +17489,7 @@ snapshots: prop-types: 15.8.1 react: 17.0.2 - '@freecodecamp/curriculum-helpers@5.4.1(debug@4.3.4)(typescript@5.8.2)': + '@freecodecamp/curriculum-helpers@5.4.1(debug@4.3.4)(typescript@5.7.3)': dependencies: '@sinonjs/fake-timers': 14.0.0 '@types/jquery': 3.5.32 @@ -17504,10 +17502,10 @@ snapshots: http-server: 14.1.1(debug@4.3.4) jquery: 3.7.1 process: 0.11.10 - puppeteer: 24.10.0(typescript@5.8.2) + puppeteer: 24.10.0(typescript@5.7.3) pyodide: 0.23.3 util: 0.12.5 - vitest-environment-puppeteer: 11.0.3(debug@4.3.4)(typescript@5.8.2) + vitest-environment-puppeteer: 11.0.3(debug@4.3.4)(typescript@5.7.3) transitivePeerDependencies: - bare-buffer - bufferutil @@ -19428,7 +19426,7 @@ snapshots: '@types/acorn@4.0.6': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/aria-query@5.0.2': {} @@ -19483,8 +19481,6 @@ snapshots: '@types/canvas-confetti@1.9.0': {} - '@types/chai@4.3.20': {} - '@types/chai@5.2.2': dependencies: '@types/deep-eql': 4.0.2 @@ -19551,7 +19547,7 @@ snapshots: '@types/estree-jsx@1.0.1': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/estree@1.0.2': {} @@ -20269,10 +20265,10 @@ snapshots: '@typescript-eslint/types': 8.33.0 eslint-visitor-keys: 4.2.0 - '@typescript/vfs@1.6.1(typescript@5.8.2)': + '@typescript/vfs@1.6.1(typescript@5.7.3)': dependencies: debug: 4.3.4(supports-color@8.1.1) - typescript: 5.8.2 + typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -20359,6 +20355,15 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 + '@vitest/mocker@3.2.4(msw@2.8.7(@types/node@20.12.8)(typescript@5.2.2))(vite@7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.17 + optionalDependencies: + msw: 2.8.7(@types/node@20.12.8)(typescript@5.2.2) + vite: 7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + '@vitest/mocker@3.2.4(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(vite@7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 @@ -20397,7 +20402,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + vitest: 3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@16.7.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) '@vitest/utils@3.2.4': dependencies: @@ -21128,20 +21133,20 @@ snapshots: dependencies: prismjs: 1.30.0 - babel-plugin-remove-graphql-queries@3.15.0(@babel/core@7.23.0)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + babel-plugin-remove-graphql-queries@3.15.0(@babel/core@7.23.0)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/core': 7.23.0 '@babel/runtime': 7.23.9 '@babel/types': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 2.15.0 - babel-plugin-remove-graphql-queries@3.15.0(@babel/core@7.23.7)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + babel-plugin-remove-graphql-queries@3.15.0(@babel/core@7.23.7)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/core': 7.23.7 '@babel/runtime': 7.23.9 '@babel/types': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 2.15.0 babel-plugin-transform-react-remove-prop-types@0.4.24: {} @@ -23198,7 +23203,7 @@ snapshots: dependencies: eslint: 9.19.0 - eslint-config-react-app@6.0.0(@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2))(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(babel-eslint@10.1.0(eslint@7.32.0))(eslint-plugin-flowtype@5.10.0(eslint@7.32.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0))(eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0))(eslint-plugin-react-hooks@4.6.0(eslint@7.32.0))(eslint-plugin-react@7.33.2(eslint@7.32.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2): + eslint-config-react-app@6.0.0(@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2))(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(babel-eslint@10.1.0(eslint@7.32.0))(eslint-plugin-flowtype@5.10.0(eslint@7.32.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0))(eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0))(eslint-plugin-react-hooks@4.6.0(eslint@7.32.0))(eslint-plugin-react@7.33.2(eslint@7.32.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2): dependencies: '@typescript-eslint/eslint-plugin': 4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2) '@typescript-eslint/parser': 4.33.0(eslint@7.32.0)(typescript@5.2.2) @@ -23206,7 +23211,7 @@ snapshots: confusing-browser-globals: 1.0.11 eslint: 7.32.0 eslint-plugin-flowtype: 5.10.0(eslint@7.32.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@7.32.0) eslint-plugin-react: 7.33.2(eslint@7.32.0) eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) @@ -23248,7 +23253,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0): dependencies: debug: 3.2.7 optionalDependencies: @@ -23284,7 +23289,7 @@ snapshots: - typescript - utf-8-validate - eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0): + eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -23294,7 +23299,7 @@ snapshots: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0) has: 1.0.3 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -23629,7 +23634,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -23938,10 +23943,6 @@ snapshots: fd@0.0.3: {} - fdir@6.4.5(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.5.0(picomatch@4.0.3): optionalDependencies: picomatch: 4.0.3 @@ -24333,23 +24334,23 @@ snapshots: lodash: 4.17.21 micromatch: 4.0.8 - gatsby-plugin-create-client-paths@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-plugin-create-client-paths@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) - gatsby-plugin-manifest@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0): + gatsby-plugin-manifest@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@16.10.0): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 2.15.0 - gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) + gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@16.10.0) semver: 7.5.4 sharp: 0.29.3 transitivePeerDependencies: - graphql - gatsby-plugin-page-creator@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0): + gatsby-plugin-page-creator@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0): dependencies: '@babel/runtime': 7.23.9 '@babel/traverse': 7.23.7 @@ -24357,10 +24358,10 @@ snapshots: chokidar: 3.6.0 fs-exists-cached: 1.0.0 fs-extra: 10.1.0 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 2.15.0 gatsby-page-utils: 1.15.0 - gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) + gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) gatsby-telemetry: 2.15.0 globby: 11.1.0 lodash: 4.17.21 @@ -24369,30 +24370,30 @@ snapshots: - graphql - supports-color - gatsby-plugin-pnpm@1.2.10(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-plugin-pnpm@1.2.10(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) lodash.get: 4.4.2 lodash.uniq: 4.5.0 - gatsby-plugin-postcss@4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(postcss@8.4.35)(webpack@5.90.3): + gatsby-plugin-postcss@4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(postcss@8.4.35)(webpack@5.90.3): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) postcss: 8.4.35 postcss-loader: 4.3.0(postcss@8.4.35)(webpack@5.90.3) transitivePeerDependencies: - webpack - gatsby-plugin-react-helmet@4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(react-helmet@6.1.0(react@17.0.2)): + gatsby-plugin-react-helmet@4.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(react-helmet@6.1.0(react@17.0.2)): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) react-helmet: 6.1.0(react@17.0.2) gatsby-plugin-remove-serviceworker@1.0.0: {} - gatsby-plugin-typescript@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-plugin-typescript@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/core': 7.23.7 '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.23.7) @@ -24400,23 +24401,31 @@ snapshots: '@babel/plugin-proposal-optional-chaining': 7.17.12(@babel/core@7.23.7) '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) '@babel/runtime': 7.23.9 - babel-plugin-remove-graphql-queries: 3.15.0(@babel/core@7.23.7)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + babel-plugin-remove-graphql-queries: 3.15.0(@babel/core@7.23.7)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) transitivePeerDependencies: - supports-color - gatsby-plugin-utils@1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0): + gatsby-plugin-utils@1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0): dependencies: '@babel/runtime': 7.23.9 fastq: 1.17.1 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) graphql: 15.8.0 joi: 17.12.2 - gatsby-plugin-webpack-bundle-analyser-v2@1.1.32(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-plugin-utils@1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@16.10.0): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + fastq: 1.17.1 + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + graphql: 16.10.0 + joi: 17.12.2 + + gatsby-plugin-webpack-bundle-analyser-v2@1.1.32(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + dependencies: + '@babel/runtime': 7.23.9 + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) webpack-bundle-analyzer: 4.10.1 transitivePeerDependencies: - bufferutil @@ -24497,14 +24506,14 @@ snapshots: - supports-color - utf-8-validate - gatsby-source-filesystem@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-source-filesystem@3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/runtime': 7.23.9 chokidar: 3.6.0 fastq: 1.15.0 file-type: 16.5.4 fs-extra: 10.1.0 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 2.15.0 got: 9.6.0 md5-file: 5.0.0 @@ -24533,10 +24542,10 @@ snapshots: transitivePeerDependencies: - encoding - gatsby-transformer-remark@5.25.1(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): + gatsby-transformer-remark@5.25.1(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)): dependencies: '@babel/runtime': 7.23.9 - gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) + gatsby: 3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2) gatsby-core-utils: 3.25.0 gray-matter: 4.0.3 hast-util-raw: 6.1.0 @@ -24568,7 +24577,7 @@ snapshots: transitivePeerDependencies: - supports-color - gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2): + gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2): dependencies: '@babel/code-frame': 7.22.13 '@babel/core': 7.23.0 @@ -24594,7 +24603,7 @@ snapshots: babel-plugin-add-module-exports: 1.0.4 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-lodash: 3.3.4 - babel-plugin-remove-graphql-queries: 3.15.0(@babel/core@7.23.0)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + babel-plugin-remove-graphql-queries: 3.15.0(@babel/core@7.23.0)(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) babel-preset-gatsby: 1.15.0(@babel/core@7.23.0)(core-js@3.33.0) better-opn: 2.1.1 bluebird: 3.7.2 @@ -24619,10 +24628,10 @@ snapshots: devcert: 1.2.2 dotenv: 8.6.0 eslint: 7.32.0 - eslint-config-react-app: 6.0.0(@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2))(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(babel-eslint@10.1.0(eslint@7.32.0))(eslint-plugin-flowtype@5.10.0(eslint@7.32.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0))(eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0))(eslint-plugin-react-hooks@4.6.0(eslint@7.32.0))(eslint-plugin-react@7.33.2(eslint@7.32.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2) + eslint-config-react-app: 6.0.0(@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2))(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(babel-eslint@10.1.0(eslint@7.32.0))(eslint-plugin-flowtype@5.10.0(eslint@7.32.0))(eslint-plugin-import@2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0))(eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0))(eslint-plugin-react-hooks@4.6.0(eslint@7.32.0))(eslint-plugin-react@7.33.2(eslint@7.32.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(eslint@7.32.0)(typescript@5.2.2) eslint-plugin-flowtype: 5.10.0(eslint@7.32.0) eslint-plugin-graphql: 4.0.0(@types/node@20.12.8)(graphql@15.8.0)(typescript@5.2.2) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1)(eslint@7.32.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.2.2))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint@7.32.0) eslint-plugin-jsx-a11y: 6.7.1(eslint@7.32.0) eslint-plugin-react: 7.33.2(eslint@7.32.0) eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) @@ -24642,9 +24651,9 @@ snapshots: gatsby-graphiql-explorer: 1.15.0 gatsby-legacy-polyfills: 1.15.0 gatsby-link: 3.15.0(@gatsbyjs/reach-router@1.3.9(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) - gatsby-plugin-page-creator: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) - gatsby-plugin-typescript: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) - gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1)(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) + gatsby-plugin-page-creator: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) + gatsby-plugin-typescript: 3.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2)) + gatsby-plugin-utils: 1.15.0(gatsby@3.15.0(@types/node@20.12.8)(babel-eslint@10.1.0(eslint@7.32.0))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.19.0))(eslint-plugin-testing-library@3.9.0(eslint@7.32.0)(typescript@5.2.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.2.2))(graphql@15.8.0) gatsby-react-router-scroll: 4.15.0(@gatsbyjs/reach-router@1.3.9(react-dom@17.0.2(react@17.0.2))(react@17.0.2))(react-dom@17.0.2(react@17.0.2))(react@17.0.2) gatsby-telemetry: 2.15.0 gatsby-worker: 0.6.0 @@ -27376,7 +27385,7 @@ snapshots: micromark-extension-mdx-expression@1.0.8: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 @@ -27388,7 +27397,7 @@ snapshots: micromark-extension-mdx-jsx@1.0.5: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-util-is-identifier-name: 2.1.0 micromark-factory-mdx-expression: 1.0.9 micromark-factory-space: 1.1.0 @@ -27404,7 +27413,7 @@ snapshots: micromark-extension-mdxjs-esm@1.0.5: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 micromark-core-commonmark: 1.1.0 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 @@ -27453,7 +27462,7 @@ snapshots: micromark-factory-mdx-expression@1.0.9: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 micromark-util-character: 1.2.0 micromark-util-events-to-acorn: 1.2.3 micromark-util-symbol: 1.1.0 @@ -27562,7 +27571,7 @@ snapshots: micromark-util-events-to-acorn@1.2.3: dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 '@types/unist': 2.0.8 estree-util-visit: 1.2.1 micromark-util-symbol: 1.1.0 @@ -27910,6 +27919,32 @@ snapshots: optionalDependencies: msgpackr-extract: 3.0.2 + msw@2.8.7(@types/node@20.12.8)(typescript@5.2.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.7(@types/node@20.12.8) + '@mswjs/interceptors': 0.38.7 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + graphql: 16.10.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.37.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.2.2 + transitivePeerDependencies: + - '@types/node' + optional: true + msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -28538,8 +28573,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - picomatch@4.0.3: {} pidtree@0.5.0: {} @@ -29078,11 +29111,11 @@ snapshots: - typescript - utf-8-validate - puppeteer@24.10.0(typescript@5.8.2): + puppeteer@24.10.0(typescript@5.7.3): dependencies: '@puppeteer/browsers': 2.10.5 chromium-bidi: 5.1.0(devtools-protocol@0.0.1452169) - cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@5.7.3) devtools-protocol: 0.0.1452169 puppeteer-core: 24.10.0 typed-query-selector: 2.12.0 @@ -31082,8 +31115,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.5(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.1: {} @@ -31902,16 +31935,102 @@ snapshots: transitivePeerDependencies: - debug - vitest-environment-puppeteer@11.0.3(debug@4.3.4)(typescript@5.8.2): + vitest-environment-puppeteer@11.0.3(debug@4.3.4)(typescript@5.7.3): dependencies: chalk: 4.1.2 - cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig: 9.0.0(typescript@5.7.3) deepmerge: 4.3.1 vitest-dev-server: 11.0.3(debug@4.3.4) transitivePeerDependencies: - debug - typescript + vitest@3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@16.7.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(vite@7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.12.8 + '@vitest/ui': 3.2.4(vitest@3.2.4) + jsdom: 16.7.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + + vitest@3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.2.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.8.7(@types/node@20.12.8)(typescript@5.2.2))(vite@7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.1 + debug: 4.4.1 + expect-type: 1.2.2 + magic-string: 0.30.17 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.1.3(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@20.12.8)(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.12.8 + '@vitest/ui': 3.2.4(vitest@3.2.4) + jsdom: 26.1.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.2.4(@types/node@20.12.8)(@vitest/ui@3.2.4)(jsdom@26.1.0)(msw@2.8.7(@types/node@20.12.8)(typescript@5.8.2))(terser@5.28.1)(tsx@4.19.1)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 @@ -31927,7 +32046,7 @@ snapshots: expect-type: 1.2.2 magic-string: 0.30.17 pathe: 2.0.3 - picomatch: 4.0.2 + picomatch: 4.0.3 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 diff --git a/tools/challenge-helper-scripts/helpers/create-project.test.ts b/tools/challenge-helper-scripts/helpers/create-project.test.ts index b73cf92278e..835481fe03c 100644 --- a/tools/challenge-helper-scripts/helpers/create-project.test.ts +++ b/tools/challenge-helper-scripts/helpers/create-project.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect, beforeEach, vi } from 'vitest'; import { getSuperblockStructure, writeSuperblockStructure @@ -7,14 +8,10 @@ import { updateSimpleSuperblockStructure } from './create-project'; -jest.mock('../../../curriculum/file-handler'); +vi.mock('../../../curriculum/file-handler'); -const mockGetSuperblockStructure = - getSuperblockStructure as jest.MockedFunction; -const mockWriteSuperblockStructure = - writeSuperblockStructure as jest.MockedFunction< - typeof writeSuperblockStructure - >; +const mockGetSuperblockStructure = vi.mocked(getSuperblockStructure); +const mockWriteSuperblockStructure = vi.mocked(writeSuperblockStructure); const incompleteSimpleChapterModuleSuperblock = { chapters: [ @@ -46,7 +43,7 @@ const simpleChapterModuleSuperblock = { describe('updateSimpleSuperblockStructure', () => { beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should insert the block into the blocks array at the expected position', async () => { @@ -77,7 +74,7 @@ describe('updateSimpleSuperblockStructure', () => { describe('updateChapterModuleSuperblockStructure', () => { beforeEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); it('should insert the block correctly when there is only one chapter and one module', async () => { diff --git a/tools/challenge-helper-scripts/helpers/get-arg-value.test.ts b/tools/challenge-helper-scripts/helpers/get-arg-value.test.ts index f25b416a6d0..c3d51bf81a8 100644 --- a/tools/challenge-helper-scripts/helpers/get-arg-value.test.ts +++ b/tools/challenge-helper-scripts/helpers/get-arg-value.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { getArgValue } from './get-arg-value'; describe('getArgValue helper', () => { diff --git a/tools/challenge-helper-scripts/helpers/get-file-name.test.ts b/tools/challenge-helper-scripts/helpers/get-file-name.test.ts index 90a596107ea..55b36ba7de6 100644 --- a/tools/challenge-helper-scripts/helpers/get-file-name.test.ts +++ b/tools/challenge-helper-scripts/helpers/get-file-name.test.ts @@ -1,6 +1,7 @@ import fs from 'fs'; import { join } from 'path'; +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { getFileName } from './get-file-name'; const basePath = join( diff --git a/tools/challenge-helper-scripts/helpers/get-project-info.test.ts b/tools/challenge-helper-scripts/helpers/get-project-info.test.ts index 4812e52d2aa..20b534be8a7 100644 --- a/tools/challenge-helper-scripts/helpers/get-project-info.test.ts +++ b/tools/challenge-helper-scripts/helpers/get-project-info.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { getProjectName, getProjectPath } from './get-project-info'; describe('getProjectPath helper', () => { diff --git a/tools/challenge-helper-scripts/helpers/get-step-template.test.ts b/tools/challenge-helper-scripts/helpers/get-step-template.test.ts index e3548fe7ef5..1ebb76d0187 100644 --- a/tools/challenge-helper-scripts/helpers/get-step-template.test.ts +++ b/tools/challenge-helper-scripts/helpers/get-step-template.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import ObjectID from 'bson-objectid'; import { getStepTemplate } from './get-step-template'; diff --git a/tools/challenge-helper-scripts/helpers/insert-erms.test.ts b/tools/challenge-helper-scripts/helpers/insert-erms.test.ts index 8e614940dfd..69861fcc865 100644 --- a/tools/challenge-helper-scripts/helpers/insert-erms.test.ts +++ b/tools/challenge-helper-scripts/helpers/insert-erms.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { insertErms } from './insert-erms'; describe('insertErms helper', () => { diff --git a/tools/challenge-helper-scripts/helpers/project-metadata.test.ts b/tools/challenge-helper-scripts/helpers/project-metadata.test.ts index dd6e1b972f8..7f8fd9f3a9a 100644 --- a/tools/challenge-helper-scripts/helpers/project-metadata.test.ts +++ b/tools/challenge-helper-scripts/helpers/project-metadata.test.ts @@ -1,8 +1,9 @@ import { join } from 'path'; +import { describe, it, expect, vi } from 'vitest'; import { getBlockStructure } from '../../../curriculum/file-handler'; import { getMetaData } from './project-metadata'; -jest.mock('../../../curriculum/file-handler'); +vi.mock('../../../curriculum/file-handler'); const commonPath = join('curriculum', 'challenges', 'blocks'); const block = 'block-name'; diff --git a/tools/challenge-helper-scripts/helpers/utils.test.ts b/tools/challenge-helper-scripts/helpers/utils.test.ts index acf9223ec3e..28e0eaf1498 100644 --- a/tools/challenge-helper-scripts/helpers/utils.test.ts +++ b/tools/challenge-helper-scripts/helpers/utils.test.ts @@ -1,3 +1,4 @@ +import { describe, it, expect } from 'vitest'; import { insertInto } from './utils'; describe('insertInto', () => { diff --git a/tools/challenge-helper-scripts/package.json b/tools/challenge-helper-scripts/package.json index 22ca0ea08b4..44340699310 100644 --- a/tools/challenge-helper-scripts/package.json +++ b/tools/challenge-helper-scripts/package.json @@ -19,20 +19,22 @@ "author": "freeCodeCamp ", "main": "utils.js", "scripts": { - "test": "mocha --delay --reporter progress --bail", "create-daily-challenges": "tsx create-daily-challenges", "create-project": "tsx create-project", "create-language-block": "tsx create-language-block", - "create-quiz": "tsx create-quiz" + "create-quiz": "tsx create-quiz", + "test": "vitest" }, "devDependencies": { "@types/glob": "^8.0.1", "@types/inquirer": "^8.2.5", + "@vitest/ui": "^3.2.4", "bson-objectid": "2.0.4", "glob": "^8.1.0", "gray-matter": "4.0.3", "inquirer": "8.2.6", "prettier": "3.2.5", - "typescript": "5.2.2" + "typescript": "5.2.2", + "vitest": "^3.2.4" } } diff --git a/tools/challenge-helper-scripts/utils.test.ts b/tools/challenge-helper-scripts/utils.test.ts index ef455434c58..f4bc5576172 100644 --- a/tools/challenge-helper-scripts/utils.test.ts +++ b/tools/challenge-helper-scripts/utils.test.ts @@ -2,28 +2,35 @@ import fs from 'fs'; import path, { join } from 'path'; import matter from 'gray-matter'; import ObjectID from 'bson-objectid'; +import { vi, describe, it, expect, afterEach } from 'vitest'; -jest.mock('fs', () => { +vi.mock('fs', () => { return { - writeFileSync: jest.fn(), - readdirSync: jest.fn() + default: { + writeFileSync: vi.fn(), + readdirSync: vi.fn() + } }; }); -jest.mock('gray-matter', () => { +vi.mock('gray-matter', () => { return { - read: jest.fn(), - stringify: jest.fn() + default: { + read: vi.fn(), + stringify: vi.fn() + } }; }); -jest.mock('bson-objectid', () => { - return jest.fn(() => ({ toString: () => mockChallengeId })); +vi.mock('bson-objectid', () => { + return { + default: vi.fn(() => ({ toString: () => mockChallengeId })) + }; }); -jest.mock('./helpers/get-step-template', () => { +vi.mock('./helpers/get-step-template', () => { return { - getStepTemplate: jest.fn() + getStepTemplate: vi.fn() }; }); @@ -31,11 +38,12 @@ const mockMeta = { challengeOrder: [{ id: 'abc', title: 'mock title' }] }; -jest.mock('./helpers/project-metadata', () => ({ - // ...jest.requireActual('./helpers/project-metadata'), - getMetaData: jest.fn(() => mockMeta), - updateMetaData: jest.fn() -})); +vi.mock('./helpers/project-metadata', () => { + return { + getMetaData: vi.fn(() => mockMeta), + updateMetaData: vi.fn() + }; +}); const mockChallengeId = '60d35cf3fe32df2ce8e31b03'; import { getStepTemplate } from './helpers/get-step-template'; @@ -48,24 +56,26 @@ import { } from './utils'; import { updateMetaData } from './helpers/project-metadata'; -const basePath = join( - process.cwd(), - '__fixtures__' + process.env.JEST_WORKER_ID -); -const commonPath = join(basePath, 'curriculum'); - const block = 'utils-project'; -const projectPath = join(commonPath, 'challenges', 'english', 'blocks', block); +const projectPath = join( + 'curriculum', + 'challenges', + 'english', + 'blocks', + block +); describe('Challenge utils helper scripts', () => { afterEach(() => { - jest.clearAllMocks(); + vi.clearAllMocks(); }); describe('createStepFile util', () => { it('should create next step and return its identifier', () => { process.env.CALLING_DIR = projectPath; const mockTemplate = 'Mock template...'; - (getStepTemplate as jest.Mock).mockReturnValue(mockTemplate); + (getStepTemplate as ReturnType).mockReturnValue( + mockTemplate + ); const step = createStepFile({ stepNum: 3, challengeType: 0 @@ -144,12 +154,14 @@ describe('Challenge utils helper scripts', () => { describe('updateStepTitles util', () => { it('should apply meta.challengeOrder to step files', () => { process.env.CALLING_DIR = projectPath; - (getStepTemplate as jest.Mock).mockReturnValue('Mock template...'); - (fs.readdirSync as jest.Mock).mockReturnValue([ + (getStepTemplate as ReturnType).mockReturnValue( + 'Mock template...' + ); + (fs.readdirSync as ReturnType).mockReturnValue([ 'name.md', 'another-name.md' ]); - (matter.read as jest.Mock).mockReturnValue({ + (matter.read as ReturnType).mockReturnValue({ data: { id: 'abc' }, content: 'goes here' }); diff --git a/tools/scripts/build/build-external-curricula-data-v1.test.ts b/tools/scripts/build/build-external-curricula-data-v1.test.ts index 9988bdbc5ca..5a3a976620f 100644 --- a/tools/scripts/build/build-external-curricula-data-v1.test.ts +++ b/tools/scripts/build/build-external-curricula-data-v1.test.ts @@ -2,6 +2,7 @@ import path from 'path'; import fs, { readFileSync } from 'fs'; import readdirp from 'readdirp'; +import { describe, test, expect } from 'vitest'; import { SuperBlocks, diff --git a/tools/scripts/build/build-external-curricula-data-v2.test.ts b/tools/scripts/build/build-external-curricula-data-v2.test.ts index 477f178d5c2..1f05e59045f 100644 --- a/tools/scripts/build/build-external-curricula-data-v2.test.ts +++ b/tools/scripts/build/build-external-curricula-data-v2.test.ts @@ -2,6 +2,7 @@ import path from 'path'; import fs, { readFileSync } from 'fs'; import readdirp from 'readdirp'; +import { describe, test, expect } from 'vitest'; import { chapterBasedSuperBlocks, diff --git a/tools/scripts/build/package.json b/tools/scripts/build/package.json index eeedf04d725..9eda9838c26 100644 --- a/tools/scripts/build/package.json +++ b/tools/scripts/build/package.json @@ -18,11 +18,14 @@ "homepage": "https://github.com/freeCodeCamp/freeCodeCamp#readme", "author": "freeCodeCamp ", "main": "none", + "scripts": { + "test": "vitest" + }, "devDependencies": { "@total-typescript/ts-reset": "^0.5.0", - "@types/chai": "^4.3.16", - "chai": "4.4.1", + "@vitest/ui": "^3.2.4", "joi": "17.12.2", - "readdirp": "3.6.0" + "readdirp": "3.6.0", + "vitest": "^3.2.4" } }