diff --git a/client/package.json b/client/package.json index 164d1b51436..902c9aa04fc 100644 --- a/client/package.json +++ b/client/package.json @@ -47,14 +47,13 @@ "@babel/preset-env": "7.23.7", "@babel/preset-react": "7.23.3", "@babel/preset-typescript": "7.23.3", - "@babel/standalone": "7.23.7", "@codesandbox/sandpack-react": "2.6.9", "@codesandbox/sandpack-themes": "2.0.21", "@fortawesome/fontawesome-svg-core": "6.7.1", "@fortawesome/free-brands-svg-icons": "6.7.1", "@fortawesome/free-solid-svg-icons": "6.7.1", "@fortawesome/react-fontawesome": "0.2.2", - "@freecodecamp/loop-protect": "3.0.0", + "@freecodecamp/challenge-builder": "workspace:*", "@freecodecamp/ui": "5.0.1", "@gatsbyjs/reach-router": "1.3.9", "@growthbook/growthbook-react": "1.6.0", @@ -141,10 +140,10 @@ }, "devDependencies": { "@babel/plugin-syntax-dynamic-import": "7.8.3", + "@freecodecamp/browser-scripts": "workspace:*", + "@freecodecamp/curriculum": "workspace:*", "@freecodecamp/eslint-config": "workspace:*", "@freecodecamp/shared": "workspace:*", - "@freecodecamp/curriculum": "workspace:*", - "@freecodecamp/browser-scripts": "workspace:*", "@testing-library/jest-dom": "^6.8.0", "@testing-library/react": "12.1.5", "@testing-library/react-hooks": "^8.0.1", diff --git a/client/src/templates/Challenges/components/completion-modal.test.tsx b/client/src/templates/Challenges/components/completion-modal.test.tsx index 8adf17be872..ab9031dcdd0 100644 --- a/client/src/templates/Challenges/components/completion-modal.test.tsx +++ b/client/src/templates/Challenges/components/completion-modal.test.tsx @@ -1,6 +1,8 @@ import React from 'react'; import { runSaga } from 'redux-saga'; import { describe, test, it, expect, beforeEach, vi, Mock } from 'vitest'; +import { buildChallenge } from '@freecodecamp/challenge-builder/build'; + import { render } from '../../../../utils/test-utils'; import { getCompletedPercentage } from '../../../utils/get-completion-percentage'; @@ -14,7 +16,7 @@ import { isBuildEnabledSelector, isBlockNewlyCompletedSelector } from '../redux/selectors'; -import { buildChallenge, getTestRunner } from '../utils/build'; +import { getTestRunner } from '../utils/build'; import CompletionModal, { combineFileData } from './completion-modal'; vi.mock('../../../analytics'); vi.mock('../../../utils/fire-confetti'); @@ -22,6 +24,7 @@ vi.mock('../../../components/Progress'); vi.mock('../redux/selectors'); vi.mock('../utils/build'); vi.mock('../../../utils/get-words'); +vi.mock('@freecodecamp/challenge-builder/build'); const mockFireConfetti = fireConfetti as Mock; const mockTestRunner = vi.fn().mockReturnValue({ pass: true }); const mockBuildEnabledSelector = isBuildEnabledSelector as Mock; diff --git a/client/src/templates/Challenges/redux/execute-challenge-saga.js b/client/src/templates/Challenges/redux/execute-challenge-saga.js index 548a96a7461..33bc039d3de 100644 --- a/client/src/templates/Challenges/redux/execute-challenge-saga.js +++ b/client/src/templates/Challenges/redux/execute-challenge-saga.js @@ -15,6 +15,8 @@ import { } from 'redux-saga/effects'; import { challengeTypes } from '@freecodecamp/shared/config/challenge-types'; +import { buildChallenge } from '@freecodecamp/challenge-builder/build'; + import { createFlashMessage } from '../../../components/Flash/redux'; import { FlashMessages } from '../../../components/Flash/redux/flash-messages'; import { @@ -25,7 +27,6 @@ import { } from '../../../utils/challenge-request-helpers'; import { playTone } from '../../../utils/tone'; import { - buildChallenge, canBuildChallenge, challengeHasPreview, getTestRunner, diff --git a/client/src/templates/Challenges/utils/build.ts b/client/src/templates/Challenges/utils/build.ts index 4d4bb0b50e6..f8f3c0df4af 100644 --- a/client/src/templates/Challenges/utils/build.ts +++ b/client/src/templates/Challenges/utils/build.ts @@ -1,13 +1,15 @@ import { challengeTypes } from '@freecodecamp/shared/config/challenge-types'; +import type { ChallengeFile } from '@freecodecamp/shared/utils/polyvinyl'; -import type { ChallengeFile } from '../../../redux/prop-types'; -import { concatHtml } from '../rechallenge/builders'; import { getTransformers, embedFilesInHtml, getPythonTransformers, getMultifileJSXTransformers -} from '../rechallenge/transformers'; +} from '@freecodecamp/challenge-builder/transformers'; +import { concatHtml } from '@freecodecamp/challenge-builder/builders'; +import { runnerTypes } from '@freecodecamp/challenge-builder/build'; + import { runTestsInTestFrame, createMainPreviewFramer, @@ -97,56 +99,6 @@ export function canBuildChallenge(challengeData: BuildChallengeData): boolean { return Object.prototype.hasOwnProperty.call(buildFunctions, challengeType); } -export async function buildChallenge( - challengeData: BuildChallengeData, - options: BuildOptions -) { - const { challengeType } = challengeData; - const build = buildFunctions[challengeType]; - if (build) { - return build(challengeData, options); - } - throw new Error(`Cannot build challenge of type ${challengeType}`); -} - -export const runnerTypes: Record< - (typeof challengeTypes)[keyof typeof challengeTypes], - 'javascript' | 'dom' | 'python' -> = { - [challengeTypes.html]: 'dom', - [challengeTypes.js]: 'javascript', - [challengeTypes.backend]: 'dom', - [challengeTypes.zipline]: 'dom', - [challengeTypes.frontEndProject]: 'dom', - [challengeTypes.backEndProject]: 'dom', - [challengeTypes.pythonProject]: 'python', - [challengeTypes.jsProject]: 'javascript', - [challengeTypes.modern]: 'dom', - [challengeTypes.step]: 'dom', - [challengeTypes.quiz]: 'dom', - [challengeTypes.invalid]: 'dom', - [challengeTypes.video]: 'dom', - [challengeTypes.codeAllyPractice]: 'dom', - [challengeTypes.codeAllyCert]: 'dom', - [challengeTypes.multifileCertProject]: 'dom', - [challengeTypes.theOdinProject]: 'dom', - [challengeTypes.colab]: 'dom', - [challengeTypes.exam]: 'dom', - [challengeTypes.msTrophy]: 'dom', - [challengeTypes.multipleChoice]: 'dom', - [challengeTypes.python]: 'python', - [challengeTypes.dialogue]: 'dom', - [challengeTypes.fillInTheBlank]: 'dom', - [challengeTypes.multifilePythonCertProject]: 'python', - [challengeTypes.generic]: 'dom', - [challengeTypes.lab]: 'dom', - [challengeTypes.jsLab]: 'javascript', - [challengeTypes.pyLab]: 'python', - [challengeTypes.dailyChallengeJs]: 'javascript', - [challengeTypes.dailyChallengePy]: 'python', - [challengeTypes.review]: 'dom' -}; - export async function getTestRunner(buildData: BuildChallengeData) { const { challengeType } = buildData; // TODO: Fully type BuildChallengeData diff --git a/curriculum/package.json b/curriculum/package.json index 0951504e0aa..e0994221a1d 100644 --- a/curriculum/package.json +++ b/curriculum/package.json @@ -48,9 +48,10 @@ "devDependencies": { "@babel/core": "7.23.7", "@babel/register": "7.23.7", + "@freecodecamp/browser-scripts": "workspace:*", + "@freecodecamp/challenge-builder": "workspace:*", "@freecodecamp/eslint-config": "workspace:*", "@freecodecamp/shared": "workspace:*", - "@freecodecamp/browser-scripts": "workspace:*", "@total-typescript/ts-reset": "^0.6.1", "@types/debug": "^4.1.12", "@types/js-yaml": "4.0.5", diff --git a/curriculum/src/test/test-challenges.js b/curriculum/src/test/test-challenges.js index f04746d1df0..17eb63147b3 100644 --- a/curriculum/src/test/test-challenges.js +++ b/curriculum/src/test/test-challenges.js @@ -26,16 +26,16 @@ import { sortChallenges } from './utils/sort-challenges.js'; const { flatten, isEmpty, cloneDeep } = lodash; vi.mock( - '../../../client/src/templates/Challenges/utils/typescript-worker-handler', + '@freecodecamp/challenge-builder/typescript-worker-handler', async importOriginal => { const actual = await importOriginal(); // ts and tsvfs must match the versions used in the typescript-worker. const tsvfs = await import('@typescript/vfs-1.6.1'); const ts = await import('typescript-5.9.2'); - // use the same TS compiler as the client + // use the same TS compiler as the challenge-builder const tsCompiler = await import( - '../../../tools/client-plugins/browser-scripts/modules/typescript-compiler' + '@freecodecamp/browser-scripts/ts-compiler' ); const compiler = new tsCompiler.Compiler(ts, tsvfs); await compiler.setup({ useNodeModules: true }); @@ -151,7 +151,7 @@ async function populateTestsForLang({ lang, challenges, meta }) { // Presumably this is because we import from_this file in the generated block // test files and that happens before the mock is applied. const { buildChallenge } = await import( - '../../../client/src/templates/Challenges/utils/build' + '@freecodecamp/challenge-builder/build' ); const validateChallenge = challengeSchemaValidator(); @@ -370,9 +370,7 @@ async function createTestRunner( buildChallenge, solutionFromNext ) { - const { runnerTypes } = await import( - '../../../client/src/templates/Challenges/utils/build' - ); + const { runnerTypes } = await import('@freecodecamp/challenge-builder/build'); const challengeFiles = replaceChallengeFilesContentsWithSolutions( challenge.challengeFiles, diff --git a/packages/challenge-builder/.gitignore b/packages/challenge-builder/.gitignore new file mode 100644 index 00000000000..1521c8b7652 --- /dev/null +++ b/packages/challenge-builder/.gitignore @@ -0,0 +1 @@ +dist diff --git a/packages/challenge-builder/.lintstagedrc.mjs b/packages/challenge-builder/.lintstagedrc.mjs new file mode 100644 index 00000000000..2cb8879f45f --- /dev/null +++ b/packages/challenge-builder/.lintstagedrc.mjs @@ -0,0 +1,4 @@ +/* eslint-disable filenames-simple/naming-convention */ +import { createLintStagedConfig } from '@freecodecamp/eslint-config/lintstaged'; + +export default createLintStagedConfig(import.meta.dirname); diff --git a/packages/challenge-builder/eslint.config.js b/packages/challenge-builder/eslint.config.js new file mode 100644 index 00000000000..6b01f2084f5 --- /dev/null +++ b/packages/challenge-builder/eslint.config.js @@ -0,0 +1,18 @@ +import { configTypeChecked } from '@freecodecamp/eslint-config/base'; +import globals from 'globals'; + +import { defineConfig } from 'eslint/config'; + +const baseLanguageOptions = { + globals: { + ...globals.browser, + ...globals.node // TODO: necessary? + } +}; + +export default defineConfig({ + extends: [configTypeChecked], + languageOptions: { + ...baseLanguageOptions + } +}); diff --git a/packages/challenge-builder/package.json b/packages/challenge-builder/package.json new file mode 100644 index 00000000000..9a839bd86b7 --- /dev/null +++ b/packages/challenge-builder/package.json @@ -0,0 +1,51 @@ +{ + "name": "@freecodecamp/challenge-builder", + "version": "0.0.1", + "author": "freeCodeCamp ", + "license": "BSD-3-Clause", + "description": "Builds challenges for testing and rendering", + "private": false, + "engines": { + "node": ">=24", + "pnpm": ">=10" + }, + "exports": { + "./build": "./dist/build.js", + "./transformers": "./dist/transformers.js", + "./typescript-worker-handler": "./dist/typescript-worker-handler.js", + "./builders": "./dist/builders.js" + }, + "scripts": { + "test": "vitest run", + "test:watch": "vitest", + "test:ui": "vitest --ui", + "type-check": "tsc --noEmit", + "compile": "tsc", + "lint": "eslint --max-warnings 0" + }, + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/freeCodeCamp/freeCodeCamp.git" + }, + "bugs": { + "url": "https://github.com/freeCodeCamp/freeCodeCamp/issues" + }, + "homepage": "https://github.com/freeCodeCamp/freeCodeCamp#readme", + "devDependencies": { + "@freecodecamp/eslint-config": "workspace:*", + "@types/lodash-es": "4.17.12", + "@vitest/ui": "^3.2.4", + "eslint": "^9.39.1", + "vitest": "^3.2.4" + }, + "dependencies": { + "@babel/preset-env": "7.23.7", + "@babel/preset-react": "7.28.5", + "@babel/standalone": "7.23.7", + "@freecodecamp/browser-scripts": "workspace:*", + "@freecodecamp/loop-protect": "3.0.0", + "@freecodecamp/shared": "workspace:*", + "lodash-es": "4.17.23" + } +} diff --git a/client/src/templates/Challenges/utils/awaitable-messenger.ts b/packages/challenge-builder/src/awaitable-messenger.ts similarity index 100% rename from client/src/templates/Challenges/utils/awaitable-messenger.ts rename to packages/challenge-builder/src/awaitable-messenger.ts diff --git a/packages/challenge-builder/src/build.ts b/packages/challenge-builder/src/build.ts new file mode 100644 index 00000000000..8c94925ec04 --- /dev/null +++ b/packages/challenge-builder/src/build.ts @@ -0,0 +1,269 @@ +import { challengeTypes } from '@freecodecamp/shared/config/challenge-types'; +import type { ChallengeFile } from '@freecodecamp/shared/utils/polyvinyl'; + +import { concatHtml } from './builders.js'; +import { + getTransformers, + embedFilesInHtml, + getPythonTransformers, + getMultifileJSXTransformers +} from './transformers.js'; + +interface Source { + index: string; + contents?: string; + editableContents: string; +} + +interface BuildChallengeData { + challengeType: number; + challengeFiles?: ChallengeFile[]; + required: { src?: string }[]; + template: string; + url: string; +} + +interface BuildOptions { + preview: boolean; + disableLoopProtectTests: boolean; + disableLoopProtectPreview: boolean; + usesTestRunner?: boolean; +} + +type ApplyFunctionProps = ( + file: ChallengeFile +) => Promise | ChallengeFile; + +const applyFunction = + (fn: ApplyFunctionProps) => async (file: ChallengeFile) => { + try { + if (file.error) { + return file; + } + const newFile = await fn.call(this, file); + if (typeof newFile !== 'undefined') { + return newFile; + } + return file; + } catch (error) { + return { ...file, error }; + } + }; + +const composeFunctions = (...fns: ApplyFunctionProps[]) => + fns.map(applyFunction).reduce((f, g) => x => f(x).then(g)); + +function buildSourceMap(challengeFiles: ChallengeFile[]): Source | undefined { + // TODO: rename sources.index to sources.contents. + const source: Source | undefined = challengeFiles?.reduce( + (sources, challengeFile) => { + sources.index += challengeFile.source || ''; + sources.contents = sources.index; + sources.editableContents += challengeFile.editableContents || ''; + return sources; + }, + { + index: '', + editableContents: '' + } as Source + ); + return source; +} + +export const buildFunctions = { + [challengeTypes.js]: buildJSChallenge, + [challengeTypes.jsProject]: buildJSChallenge, + [challengeTypes.html]: buildDOMChallenge, + [challengeTypes.modern]: buildDOMChallenge, + [challengeTypes.backend]: buildBackendChallenge, + [challengeTypes.backEndProject]: buildBackendChallenge, + [challengeTypes.pythonProject]: buildBackendChallenge, + [challengeTypes.multifileCertProject]: buildDOMChallenge, + [challengeTypes.colab]: buildBackendChallenge, + [challengeTypes.python]: buildPythonChallenge, + [challengeTypes.multifilePythonCertProject]: buildPythonChallenge, + [challengeTypes.lab]: buildDOMChallenge, + [challengeTypes.jsLab]: buildJSChallenge, + [challengeTypes.pyLab]: buildPythonChallenge, + [challengeTypes.dailyChallengeJs]: buildJSChallenge, + [challengeTypes.dailyChallengePy]: buildPythonChallenge +}; + +export function canBuildChallenge(challengeData: BuildChallengeData): boolean { + const { challengeType } = challengeData; + return Object.prototype.hasOwnProperty.call(buildFunctions, challengeType); +} + +export async function buildChallenge( + challengeData: BuildChallengeData, + options: BuildOptions +) { + const { challengeType } = challengeData; + const build = buildFunctions[challengeType]; + if (build) { + return build(challengeData, options); + } + throw new Error(`Cannot build challenge of type ${challengeType}`); +} + +export const runnerTypes: Record< + (typeof challengeTypes)[keyof typeof challengeTypes], + 'javascript' | 'dom' | 'python' +> = { + [challengeTypes.html]: 'dom', + [challengeTypes.js]: 'javascript', + [challengeTypes.backend]: 'dom', + [challengeTypes.zipline]: 'dom', + [challengeTypes.frontEndProject]: 'dom', + [challengeTypes.backEndProject]: 'dom', + [challengeTypes.pythonProject]: 'python', + [challengeTypes.jsProject]: 'javascript', + [challengeTypes.modern]: 'dom', + [challengeTypes.step]: 'dom', + [challengeTypes.quiz]: 'dom', + [challengeTypes.invalid]: 'dom', + [challengeTypes.video]: 'dom', + [challengeTypes.codeAllyPractice]: 'dom', + [challengeTypes.codeAllyCert]: 'dom', + [challengeTypes.multifileCertProject]: 'dom', + [challengeTypes.theOdinProject]: 'dom', + [challengeTypes.colab]: 'dom', + [challengeTypes.exam]: 'dom', + [challengeTypes.msTrophy]: 'dom', + [challengeTypes.multipleChoice]: 'dom', + [challengeTypes.python]: 'python', + [challengeTypes.dialogue]: 'dom', + [challengeTypes.fillInTheBlank]: 'dom', + [challengeTypes.multifilePythonCertProject]: 'python', + [challengeTypes.generic]: 'dom', + [challengeTypes.lab]: 'dom', + [challengeTypes.jsLab]: 'javascript', + [challengeTypes.pyLab]: 'python', + [challengeTypes.dailyChallengeJs]: 'javascript', + [challengeTypes.dailyChallengePy]: 'python', + [challengeTypes.review]: 'dom' +}; + +type BuildResult = { + challengeType: number; + build?: string; + sources: Source | undefined; + loadEnzyme?: boolean; + error?: unknown; +}; + +// TODO: All the buildXChallenge files have a similar structure, so make that +// abstraction (function, class, whatever) and then create the various functions +// out of it. +export async function buildDOMChallenge( + { + challengeFiles, + required = [], + template = '', + challengeType + }: BuildChallengeData, + options?: BuildOptions +): Promise { + // TODO: make this required in the schema. + if (!challengeFiles) throw Error('No challenge files provided'); + const hasJsx = challengeFiles.some( + challengeFile => challengeFile.ext === 'jsx' || challengeFile.ext === 'tsx' + ); + const isMultifile = challengeFiles.length > 1; + + const requiresReact16 = required.some(({ src }) => + src?.includes('https://cdnjs.cloudflare.com/ajax/libs/react/16.') + ); + + // I'm reasonably sure this is fine, but we need to migrate transformers to + // TypeScript to be sure. + const transformers: ApplyFunctionProps[] = (isMultifile && hasJsx + ? getMultifileJSXTransformers(options) + : getTransformers(options)) as unknown as ApplyFunctionProps[]; + + const pipeLine = composeFunctions(...transformers); + const finalFiles = await Promise.all(challengeFiles.map(pipeLine)); + const error = finalFiles.find(({ error }) => error)?.error; + const contents = (await embedFilesInHtml(finalFiles)) as string; + + // if there is an error, we just build the test runner so that it can be + // used to run tests against the code without actually running the code. + const toBuild = error + ? {} + : { + required, + template, + contents + }; + + return { + challengeType, + build: concatHtml(toBuild), + sources: buildSourceMap(finalFiles), + loadEnzyme: requiresReact16, + error + }; +} + +export async function buildJSChallenge( + { + challengeFiles, + challengeType + }: { challengeFiles?: ChallengeFile[]; challengeType: number }, + options: BuildOptions +): Promise { + if (!challengeFiles) throw Error('No challenge files provided'); + const pipeLine = composeFunctions( + ...(getTransformers(options) as unknown as ApplyFunctionProps[]) + ); + + const finalFiles = await Promise.all(challengeFiles?.map(pipeLine)); + const error = finalFiles.find(({ error }) => error)?.error; + + const toBuild = error ? [] : finalFiles; + + return { + challengeType, + build: toBuild + .reduce( + (body, challengeFile) => [ + ...body, + challengeFile.head, + challengeFile.contents, + challengeFile.tail + ], + [] as string[] + ) + .join('\n'), + sources: buildSourceMap(finalFiles), + error + }; +} + +function buildBackendChallenge({ url, challengeType }: BuildChallengeData) { + return { + challengeType, + build: '', + sources: { contents: url } + }; +} + +export async function buildPythonChallenge({ + challengeFiles, + challengeType +}: BuildChallengeData): Promise { + if (!challengeFiles) throw new Error('No challenge files provided'); + const pipeLine = composeFunctions( + ...(getPythonTransformers() as unknown as ApplyFunctionProps[]) + ); + const finalFiles = await Promise.all(challengeFiles.map(pipeLine)); + const error = finalFiles.find(({ error }) => error)?.error; + const sources = buildSourceMap(finalFiles); + + return { + challengeType, + sources, + build: sources?.contents, + error + }; +} diff --git a/client/src/templates/Challenges/rechallenge/builders.ts b/packages/challenge-builder/src/builders.ts similarity index 100% rename from client/src/templates/Challenges/rechallenge/builders.ts rename to packages/challenge-builder/src/builders.ts diff --git a/client/src/templates/Challenges/rechallenge/transformers.js b/packages/challenge-builder/src/transformers.js similarity index 99% rename from client/src/templates/Challenges/rechallenge/transformers.js rename to packages/challenge-builder/src/transformers.js index 7a2f440175b..db0a6b37337 100644 --- a/client/src/templates/Challenges/rechallenge/transformers.js +++ b/packages/challenge-builder/src/transformers.js @@ -17,11 +17,11 @@ import { } from '@freecodecamp/shared/utils/polyvinyl'; import { version } from '@freecodecamp/browser-scripts/package.json'; -import { WorkerExecutor } from '../utils/worker-executor'; +import { WorkerExecutor } from './worker-executor'; import { compileTypeScriptCode, checkTSServiceIsReady -} from '../utils/typescript-worker-handler'; +} from './typescript-worker-handler'; const protectTimeout = 100; const testProtectTimeout = 1500; diff --git a/client/src/templates/Challenges/utils/typescript-worker-handler.ts b/packages/challenge-builder/src/typescript-worker-handler.ts similarity index 81% rename from client/src/templates/Challenges/utils/typescript-worker-handler.ts rename to packages/challenge-builder/src/typescript-worker-handler.ts index 09752b36a45..da15802dbdc 100644 --- a/client/src/templates/Challenges/utils/typescript-worker-handler.ts +++ b/packages/challenge-builder/src/typescript-worker-handler.ts @@ -1,8 +1,8 @@ -import { version } from '@freecodecamp/browser-scripts/package.json'; +import browserScripts from '@freecodecamp/browser-scripts/package.json'; -import { awaitResponse } from './awaitable-messenger'; +import { awaitResponse } from './awaitable-messenger.js'; -const typeScriptWorkerSrc = `/js/workers/${version}/typescript-worker.js`; +const typeScriptWorkerSrc = `/js/workers/${browserScripts.version}/typescript-worker.js`; let worker: Worker | null = null; diff --git a/client/src/templates/Challenges/utils/worker-executor.js b/packages/challenge-builder/src/worker-executor.js similarity index 100% rename from client/src/templates/Challenges/utils/worker-executor.js rename to packages/challenge-builder/src/worker-executor.js diff --git a/client/src/templates/Challenges/utils/worker-executor.test.js b/packages/challenge-builder/src/worker-executor.test.js similarity index 100% rename from client/src/templates/Challenges/utils/worker-executor.test.js rename to packages/challenge-builder/src/worker-executor.test.js diff --git a/packages/challenge-builder/tsconfig.json b/packages/challenge-builder/tsconfig.json new file mode 100644 index 00000000000..03292333141 --- /dev/null +++ b/packages/challenge-builder/tsconfig.json @@ -0,0 +1,12 @@ +{ + "include": ["src"], + "extends": "../../tsconfig-base.json", + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "module": "es2020", + "moduleResolution": "bundler", + "outDir": "dist", + "noEmit": false + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f82c1179dcb..6810a414168 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -273,9 +273,6 @@ importers: '@babel/preset-typescript': specifier: 7.23.3 version: 7.23.3(@babel/core@7.28.5) - '@babel/standalone': - specifier: 7.23.7 - version: 7.23.7 '@codesandbox/sandpack-react': specifier: 2.6.9 version: 2.6.9(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -294,9 +291,9 @@ importers: '@fortawesome/react-fontawesome': specifier: 0.2.2 version: 0.2.2(@fortawesome/fontawesome-svg-core@6.7.1)(react@17.0.2) - '@freecodecamp/loop-protect': - specifier: 3.0.0 - version: 3.0.0 + '@freecodecamp/challenge-builder': + specifier: workspace:* + version: link:../packages/challenge-builder '@freecodecamp/ui': specifier: 5.0.1 version: 5.0.1(@types/react-dom@17.0.19)(@types/react@17.0.83)(react-dom@17.0.2(react@17.0.2))(react@17.0.2) @@ -660,7 +657,7 @@ importers: version: 9.39.2(jiti@2.6.1) eslint-plugin-flowtype: specifier: ^8.0.3 - version: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.28.5))(eslint@9.39.2(jiti@2.6.1)) + version: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.5))(eslint@9.39.2(jiti@2.6.1)) gatsby-plugin-schema-snapshot: specifier: 2.15.0 version: 2.15.0(gatsby@3.15.0(@types/node@24.10.9)(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(react-dom@17.0.2(react@17.0.2))(react@17.0.2)(typescript@5.9.3)) @@ -716,6 +713,9 @@ importers: '@freecodecamp/browser-scripts': specifier: workspace:* version: link:../tools/client-plugins/browser-scripts + '@freecodecamp/challenge-builder': + specifier: workspace:* + version: link:../packages/challenge-builder '@freecodecamp/eslint-config': specifier: workspace:* version: link:../packages/eslint-config @@ -807,6 +807,46 @@ importers: specifier: 5.9.3 version: 5.9.3 + packages/challenge-builder: + dependencies: + '@babel/preset-env': + specifier: 7.23.7 + version: 7.23.7(@babel/core@7.28.5) + '@babel/preset-react': + specifier: 7.28.5 + version: 7.28.5(@babel/core@7.28.5) + '@babel/standalone': + specifier: 7.23.7 + version: 7.23.7 + '@freecodecamp/browser-scripts': + specifier: workspace:* + version: link:../../tools/client-plugins/browser-scripts + '@freecodecamp/loop-protect': + specifier: 3.0.0 + version: 3.0.0 + '@freecodecamp/shared': + specifier: workspace:* + version: link:../shared + lodash-es: + specifier: 4.17.23 + version: 4.17.23 + devDependencies: + '@freecodecamp/eslint-config': + specifier: workspace:* + version: link:../eslint-config + '@types/lodash-es': + specifier: 4.17.12 + version: 4.17.12 + '@vitest/ui': + specifier: ^3.2.4 + version: 3.2.4(vitest@3.2.4) + eslint: + specifier: ^9.39.1 + version: 9.39.2(jiti@2.6.1) + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.9)(@vitest/ui@3.2.4)(jiti@2.6.1)(jsdom@26.1.0)(msw@2.12.7(@types/node@24.10.9)(typescript@5.9.3))(terser@5.28.1)(tsx@4.21.0)(yaml@2.8.1) + packages/eslint-config: devDependencies: '@babel/eslint-parser': @@ -1589,6 +1629,10 @@ packages: resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} engines: {node: '>=6.9.0'} @@ -1730,10 +1774,6 @@ packages: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} @@ -1949,6 +1989,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -2243,6 +2289,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.28.0': + resolution: {integrity: sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.22.5': resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} engines: {node: '>=6.9.0'} @@ -2255,6 +2307,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx-development@7.27.1': + resolution: {integrity: sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.22.15': resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} engines: {node: '>=6.9.0'} @@ -2267,6 +2325,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-pure-annotations@7.23.3': resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} engines: {node: '>=6.9.0'} @@ -2279,6 +2343,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-pure-annotations@7.27.1': + resolution: {integrity: sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.23.3': resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} engines: {node: '>=6.9.0'} @@ -2380,6 +2450,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-react@7.28.5': + resolution: {integrity: sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-typescript@7.23.3': resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} engines: {node: '>=6.9.0'} @@ -2411,10 +2487,6 @@ packages: resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.0': - resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} - engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} @@ -9895,6 +9967,9 @@ packages: lodash-es@4.17.22: resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -15526,12 +15601,12 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.10.5) + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.10.5) '@babel/helpers': 7.23.7 '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 + '@babel/template': 7.28.6 '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -15657,9 +15732,13 @@ snapshots: dependencies: '@babel/types': 7.28.5 + '@babel/helper-annotate-as-pure@7.27.3': + dependencies: + '@babel/types': 7.28.6 + '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.6 '@babel/helper-compilation-targets@7.23.6': dependencies: @@ -15719,14 +15798,14 @@ snapshots: '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 5.3.2 semver: 6.3.1 '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 regexpu-core: 5.3.2 semver: 6.3.1 @@ -15778,8 +15857,8 @@ snapshots: '@babel/helper-function-name@7.23.0': dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.27.3 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 '@babel/helper-globals@7.28.0': {} @@ -15789,7 +15868,7 @@ snapshots: '@babel/helper-member-expression-to-functions@7.23.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-module-imports@7.22.15': dependencies: @@ -15809,17 +15888,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.10.5)': - dependencies: - '@babel/core': 7.10.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 @@ -15853,6 +15921,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.10.5)': + dependencies: + '@babel/core': 7.10.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.28.6(@babel/core@7.23.0)': + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -15864,7 +15950,7 @@ snapshots: '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.10.4': {} @@ -15877,14 +15963,14 @@ snapshots: '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-wrap-function': 7.22.20 @@ -15915,7 +16001,7 @@ snapshots: '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.27.3 + '@babel/types': 7.28.6 '@babel/helper-split-export-declaration@7.22.6': dependencies: @@ -15931,8 +16017,6 @@ snapshots: '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.22.15': {} @@ -15946,8 +16030,8 @@ snapshots: '@babel/helper-wrap-function@7.22.20': dependencies: '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 '@babel/helpers@7.23.7': dependencies: @@ -15988,24 +16072,24 @@ snapshots: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.0) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.28.5) @@ -16013,19 +16097,19 @@ snapshots: dependencies: '@babel/core': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-proposal-class-properties@7.17.12(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-proposal-export-default-from@7.23.3(@babel/core@7.28.5)': dependencies: @@ -16042,39 +16126,39 @@ snapshots: '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) '@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) '@babel/plugin-proposal-object-rest-spread@7.10.4(@babel/core@7.10.5)': dependencies: '@babel/core': 7.10.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.10.5) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.10.5) '@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) '@babel/plugin-proposal-optional-chaining@7.17.12(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) @@ -16089,32 +16173,32 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.0)': dependencies: @@ -16134,12 +16218,12 @@ snapshots: '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5)': dependencies: @@ -16154,52 +16238,52 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.10.4(@babel/core@7.10.5)': dependencies: '@babel/core': 7.10.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7)': dependencies: @@ -16226,143 +16310,148 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.10.5)': dependencies: '@babel/core': 7.10.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) @@ -16370,15 +16459,15 @@ snapshots: dependencies: '@babel/core': 7.28.5 '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.5) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.5) '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.0) transitivePeerDependencies: - supports-color @@ -16386,8 +16475,8 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.5) transitivePeerDependencies: - supports-color @@ -16395,58 +16484,58 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.0) '@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.5) '@babel/plugin-transform-classes@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 @@ -16454,12 +16543,12 @@ snapshots: '@babel/plugin-transform-classes@7.23.5(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 @@ -16467,12 +16556,12 @@ snapshots: '@babel/plugin-transform-classes@7.23.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-function-name': 7.23.0 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 @@ -16480,166 +16569,166 @@ snapshots: '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.25.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 '@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.25.0 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-for-of@7.23.6(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-function-name@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-literals@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) '@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.5) '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -16674,9 +16763,9 @@ snapshots: dependencies: '@babel/core': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 transitivePeerDependencies: - supports-color @@ -16684,25 +16773,25 @@ snapshots: dependencies: '@babel/core': 7.28.5 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.23.0) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -16710,156 +16799,156 @@ snapshots: dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) '@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.5) '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.0)': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.0) '@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.28.5)': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.28.5) '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.0) '@babel/plugin-transform-object-super@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.22.20(@babel/core@7.28.5) '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) '@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.5) '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.10.5)': dependencies: '@babel/core': 7.10.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-parameters@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.0) '@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-create-class-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.5) '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.28.5)': dependencies: @@ -16876,6 +16965,11 @@ snapshots: '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -16897,6 +16991,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -16941,6 +17042,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.28.5) + '@babel/types': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 @@ -16959,27 +17071,33 @@ snapshots: '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 regenerator-transform: 0.15.2 '@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 regenerator-transform: 0.15.2 '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.0)': dependencies: @@ -17008,54 +17126,54 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-spread@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typescript@7.23.3(@babel/core@7.23.7)': dependencies: @@ -17076,56 +17194,56 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.0) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.23.7(@babel/core@7.23.0)': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.23.0 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.0) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.0) '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.0) @@ -17207,11 +17325,11 @@ snapshots: '@babel/preset-env@7.23.7(@babel/core@7.28.5)': dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.28.5) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.28.5) '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.28.5) @@ -17294,15 +17412,15 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.0)': dependencies: '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.25.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.28.6 esutils: 2.0.3 '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': dependencies: '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.25.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.28.6 esutils: 2.0.3 '@babel/preset-react@7.23.3(@babel/core@7.28.5)': @@ -17341,6 +17459,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-react@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color + '@babel/preset-typescript@7.23.3(@babel/core@7.23.7)': dependencies: '@babel/core': 7.23.7 @@ -17388,12 +17518,6 @@ snapshots: '@babel/parser': 7.28.5 '@babel/types': 7.23.3 - '@babel/template@7.25.0': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.28.5 - '@babel/types': 7.27.3 - '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 @@ -17441,8 +17565,8 @@ snapshots: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: @@ -17493,13 +17617,13 @@ snapshots: '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 + '@babel/helper-validator-identifier': 7.28.5 to-fast-properties: 2.0.0 '@babel/types@7.27.3': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@babel/types@7.28.5': dependencies: @@ -20657,7 +20781,7 @@ snapshots: '@types/yoga-layout@1.9.2': {} - '@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@4.33.0(@typescript-eslint/parser@4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/experimental-utils': 4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) @@ -21564,7 +21688,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.23.0): dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.23.0 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.23.0) semver: 6.3.1 @@ -21573,7 +21697,7 @@ snapshots: babel-plugin-polyfill-corejs2@0.4.8(@babel/core@7.28.5): dependencies: - '@babel/compat-data': 7.23.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.28.5 '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.28.5) semver: 6.3.1 @@ -22164,7 +22288,7 @@ snapshots: caniuse-api@3.0.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 caniuse-lite: 1.0.30001720 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 @@ -22560,7 +22684,7 @@ snapshots: core-js-compat@3.36.0: dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 core-js-compat@3.9.0: dependencies: @@ -23590,7 +23714,7 @@ snapshots: 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.9.3))(eslint@7.32.0)(typescript@5.9.3))(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3))(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-flowtype@5.10.0(eslint@7.32.0))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3))(eslint@7.32.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@7.32.0))(eslint-plugin-react-hooks@4.6.0(eslint@7.32.0))(eslint-plugin-react@7.37.4(eslint@7.32.0))(eslint@7.32.0)(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 4.33.0(@typescript-eslint/parser@4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) babel-eslint: 10.1.0(eslint@9.39.2(jiti@2.6.1)) confusing-browser-globals: 1.0.11 @@ -23658,10 +23782,10 @@ snapshots: lodash: 4.17.21 string-natural-compare: 3.0.1 - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.28.5))(eslint@9.39.2(jiti@2.6.1)): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.5))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.5))(eslint@9.39.2(jiti@2.6.1)): dependencies: '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.28.5) eslint: 9.39.2(jiti@2.6.1) lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -24890,7 +25014,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 '@pmmmwh/react-refresh-webpack-plugin': 0.4.3(react-refresh@0.9.0)(webpack@5.90.3) '@types/http-proxy': 1.17.12 - '@typescript-eslint/eslint-plugin': 4.33.0(@typescript-eslint/parser@4.33.0(eslint@7.32.0)(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 4.33.0(@typescript-eslint/parser@4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': 4.33.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) '@vercel/webpack-asset-relocator-loader': 1.7.3 address: 1.1.2 @@ -26616,6 +26740,8 @@ snapshots: lodash-es@4.17.22: {} + lodash-es@4.17.23: {} + lodash.clonedeep@4.5.0: {} lodash.debounce@4.0.8: {} @@ -28415,7 +28541,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.4.35 @@ -28423,7 +28549,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -28473,7 +28599,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.4.35) postcss: 8.4.35 @@ -28493,7 +28619,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 cssnano-utils: 3.1.0(postcss@8.4.35) postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -28555,7 +28681,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 postcss: 8.4.35 postcss-value-parser: 4.2.0 @@ -28578,7 +28704,7 @@ snapshots: postcss-reduce-initial@5.1.2(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 postcss: 8.4.35 @@ -30515,7 +30641,7 @@ snapshots: stylehacks@5.1.1(postcss@8.4.35): dependencies: - browserslist: 4.23.0 + browserslist: 4.28.1 postcss: 8.4.35 postcss-selector-parser: 6.1.2 diff --git a/tools/client-plugins/browser-scripts/package.json b/tools/client-plugins/browser-scripts/package.json index 052d11fc8fc..18c161a18f4 100644 --- a/tools/client-plugins/browser-scripts/package.json +++ b/tools/client-plugins/browser-scripts/package.json @@ -12,6 +12,8 @@ "dist" ], "exports": { + ".": "./index.d.ts", + "./ts-compiler": "./modules/typescript-compiler.ts", "./test-runner": "./test-runner.ts", "./package.json": "./package.json" },