diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 26f143e065b..0ee8f52314c 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -36,7 +36,7 @@ jobs: run: ./mvnw --batch-mode --update-snapshots verify - name: Set up Azure - uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a + uses: azure/login@6c251865b4e6290e7b78be643ea2d005bc51f69a # v2.1.1 with: creds: ${{ secrets.AZURE_CREDENTIALS_SPRING_IO }} diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index fe378a151db..d58dfb70bab 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -14,5 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -wrapperVersion=3.3.1 -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/CONTRIBUTING.adoc b/CONTRIBUTING.adoc index 07dccdb206d..2b98592fccd 100644 --- a/CONTRIBUTING.adoc +++ b/CONTRIBUTING.adoc @@ -53,7 +53,7 @@ added after the original pull request but before a merge. === Building from Source start.spring.io can be build from the command line using -https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 11 or above. +https://maven.apache.org/run-maven/index.html[Apache Maven] on JDK 17 or above. We include '`Maven Wrapper`' scripts (`./mvnw` or `mvnw.bat`) that you can run rather than needing to install Maven locally. diff --git a/mvnw b/mvnw index ac8e247e1c2..19529ddf8c6 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.1 +# Apache Maven Wrapper startup batch script, version 3.3.2 # # Optional ENV vars # ----------------- @@ -97,11 +97,19 @@ die() { exit 1 } +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + # parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties while IFS="=" read -r key value; do case "${key-}" in - distributionUrl) distributionUrl="${value-}" ;; - distributionSha256Sum) distributionSha256Sum="${value-}" ;; + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; esac done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" [ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" @@ -131,7 +139,8 @@ esac distributionUrlName="${distributionUrl##*/}" distributionUrlNameMain="${distributionUrlName%.*}" distributionUrlNameMain="${distributionUrlNameMain%-bin}" -MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" exec_maven() { unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : diff --git a/mvnw.cmd b/mvnw.cmd index 7b0c0943b22..249bdf38222 100644 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -19,7 +19,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.1 +@REM Apache Maven Wrapper startup batch script, version 3.3.2 @REM @REM Optional ENV vars @REM MVNW_REPOURL - repo url base for downloading maven distribution @@ -79,6 +79,9 @@ if ($env:MVNW_REPOURL) { $distributionUrlName = $distributionUrl -replace '^.*/','' $distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' $MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} $MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' $MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" diff --git a/pom.xml b/pom.xml index 0cfce4cc27d..1a0c232bf91 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.springframework.boot spring-boot-starter-parent - 3.2.6 + 3.3.3 io.spring.start start-parent @@ -33,13 +33,14 @@ 0.0.1-SNAPSHOT false - 0.21.0-SNAPSHOT - 0.0.41 + 0.22.0-SNAPSHOT + 0.0.43 start-client start-site + test-support @@ -79,10 +80,15 @@ start-site ${revision} + + io.spring.start + test-support + ${revision} + com.azure.spring spring-cloud-azure-dependencies - 5.8.0 + 5.13.0 pom import @@ -116,7 +122,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.3.1 + 3.4.0 checkstyle-validation @@ -135,7 +141,7 @@ com.puppycrawl.tools checkstyle - 10.12.7 + 10.17.0 io.spring.javaformat diff --git a/start-client/package.json b/start-client/package.json index 5fe0092f8b7..5dbcaa0783c 100644 --- a/start-client/package.json +++ b/start-client/package.json @@ -92,6 +92,7 @@ "js-search": "^2.0.0", "jszip": "^3.6.0", "lodash": "^4.17.21", + "luxon": "^3.4.4", "prism-react-renderer": "^1.2.0", "prismjs": "^1.24.0", "prop-types": "^15.7.2", diff --git a/start-client/pom.xml b/start-client/pom.xml index f8f46ea4a25..d6277a9b545 100644 --- a/start-client/pom.xml +++ b/start-client/pom.xml @@ -24,7 +24,7 @@ v16.20.0 - v1.22.19 + v1.22.22 diff --git a/start-client/src/components/Application.js b/start-client/src/components/Application.js index 96405205670..7862e98fda3 100644 --- a/start-client/src/components/Application.js +++ b/start-client/src/components/Application.js @@ -23,6 +23,7 @@ import { getConfig, getInfo, getProject } from './utils/ApiUtils' const Explore = lazy(() => import('./common/explore/Explore')) const Share = lazy(() => import('./common/share/Share')) +const History = lazy(() => import('./common/history/History')) const HotKeys = lazy(() => import('./common/builder/HotKeys')) export default function Application() { @@ -32,6 +33,7 @@ export default function Application() { theme, share: shareOpen, explore: exploreOpen, + history: historyOpen, list, dependencies, } = useContext(AppContext) @@ -78,6 +80,7 @@ export default function Application() { setGenerating(false) if (project) { FileSaver.saveAs(project, `${get(values, 'meta.artifact')}.zip`) + dispatch({ type: 'ADD_HISTORY', payload: share }) } } @@ -102,7 +105,13 @@ export default function Application() { setBlob(null) dispatch({ type: 'UPDATE', - payload: { list: false, share: false, explore: false, nav: false }, + payload: { + list: false, + share: false, + explore: false, + nav: false, + history: false, + }, }) } @@ -163,6 +172,15 @@ export default function Application() { onClose={onEscape} /> + + + + ) } diff --git a/start-client/src/components/common/history/History.js b/start-client/src/components/common/history/History.js new file mode 100644 index 00000000000..498c068937e --- /dev/null +++ b/start-client/src/components/common/history/History.js @@ -0,0 +1,23 @@ +import '../../../styles/history.scss' + +import PropTypes from 'prop-types' +import React from 'react' + +import Modal from './Modal' +import { Overlay } from '../form' + +function History({ open, onClose }) { + return ( + <> + + + + ) +} + +History.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default History diff --git a/start-client/src/components/common/history/Modal.js b/start-client/src/components/common/history/Modal.js new file mode 100644 index 00000000000..c8847c222d1 --- /dev/null +++ b/start-client/src/components/common/history/Modal.js @@ -0,0 +1,213 @@ +import PropTypes from 'prop-types' +import get from 'lodash/get' +import React, { useEffect, useRef, useContext, useMemo } from 'react' +import { CSSTransition, TransitionGroup } from 'react-transition-group' +import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' +import { AppContext } from '../../reducer/App' +import { Transform } from './Utils' +import queryString from 'query-string' + +function HistoryDate({ label, items, onClose }) { + return ( + <> +
{label}
+
    + {items.map(item => ( + + ))} +
+ + ) +} + +HistoryDate.propTypes = { + label: PropTypes.string.isRequired, + items: PropTypes.arrayOf( + PropTypes.shape({ + time: PropTypes.string, + value: PropTypes.string, + }) + ), + onClose: PropTypes.func.isRequired, +} + +HistoryDate.defaultProps = { + items: [], +} + +function getLabelFromList(list, key) { + return list.find(item => item.key === key)?.text || key +} + +function getLabelFromDepsList(list, key) { + return list.find(item => item.id === key)?.name || key +} + +function HistoryItem({ time, value, onClose }) { + const { config } = useContext(AppContext) + const params = queryString.parse(value) + const deps = get(params, 'dependencies', '') + .split(',') + .filter(dep => !!dep) + return ( +
  • + { + onClose() + }} + > + {time} + + + Project{' '} + + {getLabelFromList( + get(config, 'lists.project'), + get(params, 'type') + )} + + {`, `} + Language{' '} + + {getLabelFromList( + get(config, 'lists.language'), + get(params, 'language') + )} + + {`, `} + Spring Boot{' '} + + {getLabelFromList( + get(config, 'lists.boot'), + get(params, 'platformVersion') + )} + + + + {deps.length === 0 && 'No dependency'} + {deps.length > 0 && ( + <> + Dependencies:{' '} + + {deps + .map(dep => + getLabelFromDepsList( + get(config, 'lists.dependencies'), + dep + ) + ) + .join(', ')} + + + )} + + + +
  • + ) +} + +HistoryItem.propTypes = { + time: PropTypes.string.isRequired, + value: PropTypes.string.isRequired, + onClose: PropTypes.func.isRequired, +} + +function Modal({ open, onClose }) { + const wrapper = useRef(null) + const { histories, dispatch } = useContext(AppContext) + + const historiesTransform = useMemo(() => Transform(histories), [histories]) + + useEffect(() => { + const clickOutside = event => { + const children = get(wrapper, 'current') + if (children && !children.contains(event.target)) { + onClose() + } + } + document.addEventListener('mousedown', clickOutside) + return () => { + document.removeEventListener('mousedown', clickOutside) + } + }, [onClose]) + + useEffect(() => { + if (get(wrapper, 'current') && open) { + disableBodyScroll(get(wrapper, 'current')) + } + return () => { + clearAllBodyScrollLocks() + } + }, [wrapper, open]) + + return ( + + {open && ( + + + + )} + + ) +} + +Modal.propTypes = { + open: PropTypes.bool.isRequired, + onClose: PropTypes.func.isRequired, +} + +export default Modal diff --git a/start-client/src/components/common/history/Utils.js b/start-client/src/components/common/history/Utils.js new file mode 100644 index 00000000000..6df683cd522 --- /dev/null +++ b/start-client/src/components/common/history/Utils.js @@ -0,0 +1,46 @@ +import { DateTime } from 'luxon' + +function isToday(date) { + return date.hasSame(DateTime.now(), 'day') +} + +function isYesterday(date) { + return date.hasSame(DateTime.now().minus({ days: 1 }), 'day') +} + +export function Transform(histories) { + if (histories.length === 0) { + return [] + } + const parsed = histories.map(history => { + const dateLuxon = DateTime.fromISO(history.date) + let label = '' + if (isToday(dateLuxon)) { + label = 'Today, ' + } else if (isYesterday(dateLuxon)) { + label = 'Yesterday, ' + } + return { + date: dateLuxon, + time: `${dateLuxon.toFormat('HH:mm')}`, + label: `${label}${dateLuxon.toFormat('cccc, d LLLL yyyy')}`, + value: history.value, + } + }) + return parsed.reduce((acc, history) => { + if (acc.length === 0) { + acc.push({ + label: history.label, + histories: [history], + }) + } else if (acc[acc.length - 1].label === history.label) { + acc[acc.length - 1].histories.push(history) + } else { + acc.push({ + label: history.label, + histories: [history], + }) + } + return acc + }, []) +} diff --git a/start-client/src/components/common/history/index.js b/start-client/src/components/common/history/index.js new file mode 100644 index 00000000000..2efd9c0c11f --- /dev/null +++ b/start-client/src/components/common/history/index.js @@ -0,0 +1 @@ +export { default as History } from './History' diff --git a/start-client/src/components/common/icons/Icons.js b/start-client/src/components/common/icons/Icons.js index 1a2e0d153fa..9318ca56f1b 100644 --- a/start-client/src/components/common/icons/Icons.js +++ b/start-client/src/components/common/icons/Icons.js @@ -368,3 +368,34 @@ export function IconEnter() { ) } + +export function IconHistory() { + return ( + + ) +} diff --git a/start-client/src/components/common/icons/index.js b/start-client/src/components/common/icons/index.js index f8010ec116a..7fa600b4088 100644 --- a/start-client/src/components/common/icons/index.js +++ b/start-client/src/components/common/icons/index.js @@ -16,5 +16,6 @@ export { IconSun } from './Icons' export { IconMoon } from './Icons' export { IconRemove } from './Icons' export { IconEnter } from './Icons' +export { IconHistory } from './Icons' export { IconSpring } from './IconSpring' diff --git a/start-client/src/components/common/layout/SideLeft.js b/start-client/src/components/common/layout/SideLeft.js index c8ca6aa0caa..12596f1edaa 100644 --- a/start-client/src/components/common/layout/SideLeft.js +++ b/start-client/src/components/common/layout/SideLeft.js @@ -5,14 +5,14 @@ import { clearAllBodyScrollLocks, disableBodyScroll } from 'body-scroll-lock' import Header from './Header' import { AppContext } from '../../reducer/App' -import { IconGithub } from '../icons' +import { IconGithub, IconHistory } from '../icons' function SideLeft() { const [isOpen, setIsOpen] = useState(false) const [lock, setLock] = useState(false) const wrapper = useRef(null) - const { nav, dispatch } = useContext(AppContext) + const { nav, histories, dispatch } = useContext(AppContext) useEffect(() => { if (get(wrapper, 'current') && nav) { @@ -61,6 +61,22 @@ function SideLeft() { + {!isOpen && !lock && histories.length > 0 && ( + <> +
    + + + )}
    {}, + setItem: () => {}, + } + export function reduceDependencies(boot, items) { const groups = [] const list = [] @@ -96,7 +107,26 @@ export function reducer(state, action) { get(json, 'defaultValues.boot'), get(json, 'lists.dependencies') ) - return { ...state, complete: true, config: json, dependencies } + const histories = localStorage.getItem('histories') + ? JSON.parse(localStorage.getItem('histories')) + : [] + return { ...state, complete: true, config: json, dependencies, histories } + } + case 'ADD_HISTORY': { + const newHistory = get(action, 'payload') + const histories = [ + { + date: new Date().toISOString(), + value: newHistory, + }, + ...state.histories.slice(0, MAX_HISTORY - 1), + ] + localStorage.setItem('histories', JSON.stringify(histories)) + return { ...state, histories } + } + case 'CLEAR_HISTORY': { + localStorage.setItem('histories', JSON.stringify([])) + return { ...state, histories: [] } } default: return state diff --git a/start-client/src/components/reducer/__tests__/Initializr.js b/start-client/src/components/reducer/__tests__/Initializr.js index 20ef2bdd15d..23f43b046eb 100644 --- a/start-client/src/components/reducer/__tests__/Initializr.js +++ b/start-client/src/components/reducer/__tests__/Initializr.js @@ -47,7 +47,7 @@ describe('COMPLETE action', () => { }, }) expect(get(result, 'share')).toBe( - 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo' + 'type=maven-project&language=java&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo&dependencies=' ) expect(get(result, 'values.project')).toBe('maven-project') expect(get(result, 'values.language')).toBe('java') diff --git a/start-client/src/components/utils/ApiUtils.js b/start-client/src/components/utils/ApiUtils.js index 7de37d1ae85..15cdbb8f50d 100644 --- a/start-client/src/components/utils/ApiUtils.js +++ b/start-client/src/components/utils/ApiUtils.js @@ -54,6 +54,8 @@ export const getShareUrl = values => { let params = `${querystring.stringify(props)}` if (get(values, 'dependencies', []).length > 0) { params = `${params}&dependencies=${get(values, 'dependencies').join(',')}` + } else { + params = `${params}&dependencies=` } return params } @@ -151,6 +153,7 @@ export const parseParams = (values, queryParams, lists) => { const depsWarning = [] const newVal = value .split(',') + .filter(item => !!item) .map(item => { const dep = get(lists, 'dependencies').find( d => d.id === item.trim() diff --git a/start-client/src/styles/_dark.scss b/start-client/src/styles/_dark.scss index 984ceaf0561..6b00b3cfb0c 100644 --- a/start-client/src/styles/_dark.scss +++ b/start-client/src/styles/_dark.scss @@ -16,6 +16,14 @@ body.dark { border-color: rgba(255, 255, 255, 0.2); } + #side-left .navigation-item { + color: white; + transition: all 0.15s; + &:hover { + opacity: 0.7; + } + } + #side-right .side-container { border-color: $dark-border; background: $dark-background; @@ -321,7 +329,8 @@ body.dark { #side-left a, .explorer-ul .file, .explorer-ul .folder, - ul.dependencies-list li a { + ul.dependencies-list li a, + #side-left .navigation-item { &:focus { outline: 1px dotted $dark-border; } @@ -391,4 +400,26 @@ body.dark { box-shadow: inset 0 0 0 2px $dark-color; background: $dark-background; } + + .modal-share .modal-header { + background: $dark-background; + border-bottom: 1px solid $dark-border; + } + .modal-history-container { + border: 1px solid $dark-border; + } + .modal-content { + background: $dark-background; + } + .modal-content .list a.item { + background: $dark-background-secondary; + color: $dark-color; + &:hover { + background: lighten($dark-background-secondary, 2); + } + } + .modal-action { + background: $dark-background; + border-top: 1px solid $dark-border; + } } diff --git a/start-client/src/styles/_main.scss b/start-client/src/styles/_main.scss index 70ce292e0e2..85065d29d7d 100644 --- a/start-client/src/styles/_main.scss +++ b/start-client/src/styles/_main.scss @@ -85,6 +85,39 @@ body { left: 0; width: 5rem; } + .navigation-divider { + margin: 20px; + border-top: 1px solid $light-border; + } + .navigation-item { + $size: 30px; + display: block; + margin: 0.2rem auto; + color: $light-color; + padding: 0; + cursor: pointer; + width: $size + 12px; + height: $size + 12px; + @include transition(color $spring-transition-duration); + border: 0 none; + background: none; + .icon-history { + width: 30px; + margin-top: 6px; + } + &:hover { + color: $light-primary; + } + &:focus { + outline: 1px dotted #aecaca; + } + } + &.is-open .navigation-item { + color: white; + &:hover { + opacity: 0.7; + } + } } #side-right { @@ -163,6 +196,7 @@ body { border: 0; padding: 4px; outline: none; + cursor: pointer; } svg { display: block; @@ -1316,4 +1350,4 @@ ul.dependencies-list { display: inline-block; height: 14px; background: $light-placeholder; -} \ No newline at end of file +} diff --git a/start-client/src/styles/history.scss b/start-client/src/styles/history.scss new file mode 100644 index 00000000000..9d1ace6786d --- /dev/null +++ b/start-client/src/styles/history.scss @@ -0,0 +1,120 @@ +@import 'variables'; +@import 'mixins'; + +$w_arrow: 12px; +$w: 1000px; + +.modal-share { + z-index: 10000; + position: fixed; + top: 50px; + left: 0; + right: 0; + + .modal-history-container { + max-width: $w; + margin: 0 auto; + background: white; + } + + @include transition(all $spring-transition-duration); + &:before { + $h: 60px; + content: ' '; + height: $h; + width: $w; + position: absolute; + bottom: -$h; + left: 0; + } + .modal-content { + padding: $spring-8points * 3; + padding-top: $spring-8points; + padding-bottom: $spring-8points * 2; + max-height: 70vh; + overflow: auto; + .list { + .date { + font-weight: bold; + padding: 10px 0 5px; + } + ul { + padding: 0; + margin: 0 0 10px; + } + li { + list-style: none; + padding: 1px 0; + margin: 0; + } + a.item { + position: relative; + background: $light-background-seconday; + border-radius: 3px; + display: flex; + text-decoration: none; + padding: 5px 10px; + color: $light-color; + padding-right: 60px; + &:hover { + background: lighten($light-background-seconday, 2); + a { + opacity: 1; + } + } + } + .time { + width: 80px; + } + .time, + .desc, + .main, + .deps { + display: block; + } + } + } + .modal-header { + position: relative; + padding: 6px $spring-8points * 2 2px; + border-bottom: 1px solid #ebebeb; + h1 { + font-size: $spring-8points * 2.5; + line-height: $spring-8points * 2.5; + font-weight: 600; + } + .button { + position: absolute; + top: 11px; + right: 11px; + font-size: $spring-font-size - 3; + line-height: 0.7rem; + margin-right: 0; + } + } + .modal-action { + text-align: center; + border-top: 1px solid $light-border; + padding: 16px 0 8px; + } +} + +.modal-enter { + opacity: 0; +} + +.modal-enter-active { + opacity: 1; + transition: all 300ms; +} + +.modal-exit { + opacity: 1; +} + +.modal-exit-active { + opacity: 0; + transition: all 300ms; +} + +@import 'responsive'; diff --git a/start-client/yarn.lock b/start-client/yarn.lock index d8dd9ba0889..1cf2a984cba 100644 --- a/start-client/yarn.lock +++ b/start-client/yarn.lock @@ -20,12 +20,12 @@ leven "^3.1.0" "@babel/cli@^7.13.16": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.5.tgz#9eba21699f289c32e63a28aedf82f888dc134b30" - integrity sha512-2qg1mYtJRsOOWF6IUwLP5jI42P8Cc0hQ5TmnjLrik/4DKouO8dFJN80HEz81VmVeUs97yuuf3vQ/9j7Elrcjlg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.24.7.tgz#eb2868c1fa384b17ea88d60107577d3e6fd05c4e" + integrity sha512-8dfPprJgV4O14WTx+AQyEA+opgUKPrsIXX/MdL50J1n06EQJ6m1T+CdsJe0qEC0B/Xl85i+Un5KVAxd/PACX9A== dependencies: "@jridgewell/trace-mapping" "^0.3.25" - commander "^4.0.1" + commander "^6.2.0" convert-source-map "^2.0.0" fs-readdir-recursive "^1.1.0" glob "^7.2.0" @@ -35,34 +35,34 @@ "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" chokidar "^3.4.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.2": - version "7.24.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" - integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" + integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== dependencies: - "@babel/highlight" "^7.24.2" + "@babel/highlight" "^7.24.7" picocolors "^1.0.0" -"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.4.tgz#6f102372e9094f25d908ca0d34fc74c74606059a" - integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed" + integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== "@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.5", "@babel/core@^7.2.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.5.tgz#15ab5b98e101972d171aeef92ac70d8d6718f06a" - integrity sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4" + integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== dependencies: "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.24.5" - "@babel/helpers" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helpers" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -70,70 +70,71 @@ semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.5.tgz#3b0f7d383a540329a30a6a9937cfc89461d26217" - integrity sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7" + integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.24.5", "@babel/generator@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.5.tgz#e5afc068f932f05616b66713e28d0f04e99daeb3" - integrity sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA== +"@babel/generator@^7.24.7", "@babel/generator@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d" + integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== dependencies: - "@babel/types" "^7.24.5" + "@babel/types" "^7.24.7" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== +"@babel/helper-annotate-as-pure@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab" + integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" - integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3" + integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA== dependencies: - "@babel/types" "^7.22.15" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991" - integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== +"@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9" + integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg== dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-validator-option" "^7.23.5" + "@babel/compat-data" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" browserslist "^4.22.2" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4", "@babel/helper-create-class-features-plugin@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz#7d19da92c7e0cd8d11c09af2ce1b8e7512a6e723" - integrity sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-member-expression-to-functions" "^7.24.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b" + integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" - integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da" + integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-annotate-as-pure" "^7.24.7" regexpu-core "^5.3.1" semver "^6.3.1" @@ -148,181 +149,187 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" -"@babel/helper-environment-visitor@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" - integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== - -"@babel/helper-function-name@^7.23.0": - version "7.23.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" - integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== - dependencies: - "@babel/template" "^7.22.15" - "@babel/types" "^7.23.0" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== +"@babel/helper-environment-visitor@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9" + integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== dependencies: - "@babel/types" "^7.22.5" + "@babel/types" "^7.24.7" -"@babel/helper-member-expression-to-functions@^7.23.0", "@babel/helper-member-expression-to-functions@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz#5981e131d5c7003c7d1fa1ad49e86c9b097ec475" - integrity sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA== +"@babel/helper-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2" + integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz#6ac476e6d168c7c23ff3ba3cf4f7841d46ac8128" - integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== - dependencies: - "@babel/types" "^7.24.0" + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-hoist-variables@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee" + integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== + dependencies: + "@babel/types" "^7.24.7" -"@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz#ea6c5e33f7b262a0ae762fd5986355c45f54a545" - integrity sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-simple-access" "^7.24.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/helper-validator-identifier" "^7.24.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.24.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz#a924607dd254a65695e5bd209b98b902b3b2f11a" - integrity sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ== - -"@babel/helper-remap-async-to-generator@^7.22.20": - version "7.22.20" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" - integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-wrap-function" "^7.22.20" - -"@babel/helper-replace-supers@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz#7085bd19d4a0b7ed8f405c1ed73ccb70f323abc1" - integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-member-expression-to-functions" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5", "@babel/helper-simple-access@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz#50da5b72f58c16b07fbd992810be6049478e85ba" - integrity sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz#b9a67f06a46b0b339323617c8c6213b9055a78b6" - integrity sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q== - dependencies: - "@babel/types" "^7.24.5" - -"@babel/helper-string-parser@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" - integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== - -"@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz#918b1a7fa23056603506370089bd990d8720db62" - integrity sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA== - -"@babel/helper-validator-option@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" - integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== - -"@babel/helper-wrap-function@^7.22.20": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz#335f934c0962e2c1ed1fb9d79e06a56115067c09" - integrity sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw== - dependencies: - "@babel/helper-function-name" "^7.23.0" - "@babel/template" "^7.24.0" - "@babel/types" "^7.24.5" - -"@babel/helpers@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.5.tgz#fedeb87eeafa62b621160402181ad8585a22a40a" - integrity sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q== - dependencies: - "@babel/template" "^7.24.0" - "@babel/traverse" "^7.24.5" - "@babel/types" "^7.24.5" - -"@babel/highlight@^7.24.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.5.tgz#bc0613f98e1dd0720e99b2a9ee3760194a704b6e" - integrity sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw== - dependencies: - "@babel/helper-validator-identifier" "^7.24.5" +"@babel/helper-member-expression-to-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f" + integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-imports@^7.0.0-beta.49", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b" + integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-module-transforms@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8" + integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" + +"@babel/helper-optimise-call-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f" + integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0" + integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg== + +"@babel/helper-remap-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7" + integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + +"@babel/helper-replace-supers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765" + integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg== + dependencies: + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-member-expression-to-functions" "^7.24.7" + "@babel/helper-optimise-call-expression" "^7.24.7" + +"@babel/helper-simple-access@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3" + integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9" + integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ== + dependencies: + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helper-split-export-declaration@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856" + integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== + dependencies: + "@babel/types" "^7.24.7" + +"@babel/helper-string-parser@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2" + integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== + +"@babel/helper-validator-identifier@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db" + integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== + +"@babel/helper-validator-option@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6" + integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw== + +"@babel/helper-wrap-function@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f" + integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw== + dependencies: + "@babel/helper-function-name" "^7.24.7" + "@babel/template" "^7.24.7" + "@babel/traverse" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/helpers@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416" + integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg== + dependencies: + "@babel/template" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/highlight@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d" + integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== + dependencies: + "@babel/helper-validator-identifier" "^7.24.7" chalk "^2.4.2" js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.0", "@babel/parser@^7.24.5", "@babel/parser@^7.7.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790" - integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg== +"@babel/parser@^7.0.0-beta.54", "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.24.7", "@babel/parser@^7.7.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85" + integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz#4c3685eb9cd790bcad2843900fe0250c91ccf895" - integrity sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw== +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055" + integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz#b645d9ba8c2bc5b7af50f0fe949f9edbeb07c8cf" - integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107" + integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz#da8261f2697f0f41b0855b91d3a20a1fbfd271d3" - integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89" + integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - "@babel/plugin-transform-optional-chaining" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz#1181d9685984c91d657b8ddf14f0487a6bab2988" - integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec" + integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-proposal-class-properties@^7.13.0": version "7.18.6" @@ -333,29 +340,29 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.13.15": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz#bab2b9e174a2680f0a80f341f3ec70f809f8bb4b" - integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3" + integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-decorators" "^7.24.1" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-decorators" "^7.24.7" "@babel/plugin-proposal-do-expressions@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.1.tgz#580e97ffb93d537933df3b8d2e6bef67d0beaa0e" - integrity sha512-tVYbJAE3Duz/T0lV5P27aAgpg2vTfUuV0dXN4NNbnoRk7G989IcgjYIA+1pMHUMMLij7Gun42CC15UN5jWm4LA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.24.7.tgz#09ab8037ef28d71578b1734dc8a88fd00887c98a" + integrity sha512-M9pJwhoROof4rc4WzDdMoftv8JrtYfBVurvReacQ8lit+qUd0d71+1zUltb6/zCI7HBW4+KZbtBGmcudXw0GDQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-do-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-do-expressions" "^7.24.7" "@babel/plugin-proposal-export-default-from@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.1.tgz#d242019488277c9a5a8035e5b70de54402644b89" - integrity sha512-+0hrgGGV3xyYIjOrD/bUZk/iUwOIGuoANfRfVg1cPhYBxF+TIXSEcc42DqzBICmWsnAQ+SfKedY0bj8QD+LuMg== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6" + integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-export-default-from" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-export-default-from" "^7.24.7" "@babel/plugin-proposal-export-namespace-from@^7.12.13": version "7.18.9" @@ -366,21 +373,21 @@ "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-proposal-function-bind@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.1.tgz#e3e265ec2f1324dbe29b249c35fab58b5c15a684" - integrity sha512-GDz3lXY623E+SMhloR0HDKYfFjLnqYEHjxIHo3SvpJTV3SV89974Y3mADXSYnO1N+UP7bioAFKqpOmsD9aOnuw== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.24.7.tgz#8b4fcef3fd90bd5671a940693683c76ab0984df8" + integrity sha512-cq2mwxcvNAWWL+IiqiSiVhCeqTQs532Ktl3N2FMuW0bQVF/N0W6QNyywO+KkM3Yr/jwYmjeSS+yKQQUh79VOxQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-function-bind" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-function-bind" "^7.24.7" "@babel/plugin-proposal-function-sent@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.1.tgz#228c85798b62fc1c1a84c8ab512d46c41885f4bd" - integrity sha512-GxHpB7jATDZWYEuYkR5jv5aiHbwkmbvk3fJP5G2Dvl7va+kewfbYxpnU1BadIHd3kXlLPQj4CKbLKoWxX4nTtA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-sent/-/plugin-proposal-function-sent-7.24.7.tgz#522a49543a278e1f28eba36e753201f72ae18a11" + integrity sha512-42Pq9d8fV5CrjygcVAA7aAEFpkAJluWWvlO7bvOMDEutxIS44COcFU61V92VBzUZvOkjIoQrPJNUtmY/d9XMgA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-wrap-function" "^7.22.20" - "@babel/plugin-syntax-function-sent" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-wrap-function" "^7.24.7" + "@babel/plugin-syntax-function-sent" "^7.24.7" "@babel/plugin-proposal-json-strings@^7.13.8": version "7.18.6" @@ -424,12 +431,12 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-proposal-pipeline-operator@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.1.tgz#a8ea2b281b68cdb676270298f32d46da61c22a6b" - integrity sha512-JFqo+VsSosYxzo1PPfrbeoIi0IcAJnjGpDXeVABNl5bH6/Zvn84Kd8utGEA1eT3gLsynyt1+TfQ/opGXtb0Y/A== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.24.7.tgz#a96009e358eb357f88301ab74e4788812a5957fa" + integrity sha512-cJOSXlieT6/Yul8yEkbBRzhyf/J4jeeqUREw8HCf8nxT4DTP5FCdC0EXf+b8+vBt34IMYYvTDiC8uC91KSSLpA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-pipeline-operator" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-pipeline-operator" "^7.24.7" "@babel/plugin-proposal-private-methods@^7.13.0": version "7.18.6" @@ -445,12 +452,12 @@ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-proposal-throw-expressions@^7.12.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.1.tgz#7f08e07de51463fd302860e7928cccdcb4fa1d48" - integrity sha512-wiae/VkKNX1WuM+wXIeAZY1cvbVKJJIf92eA23s2ufpp4w+vOlp+/4T3yfxN6nzN+hIwT15AsdwujAelIqNW+w== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.24.7.tgz#8a386bcb77965d82f5b926508b27919d9ac9450f" + integrity sha512-Rh4WoHyWKgsxvdkEMqDEZtKuGnZw+JwicMCvcZaIjYaQ3fK+a8JZYLhgcac9dKcL47Xqf+SG3MopTx+8BACdrQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/plugin-syntax-throw-expressions" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-throw-expressions" "^7.24.7" "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -480,19 +487,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-decorators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz#71d9ad06063a6ac5430db126b5df48c70ee885fa" - integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== +"@babel/plugin-syntax-decorators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf" + integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-do-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.1.tgz#8e423c79355797e2dbdac26e03c248be27391795" - integrity sha512-l5ZJA2DB2s/pM3SQzwf1ykWOiBaqN6Eb07EoZ/mH8dUR5RnaWlmPLoav6y4OT8A9Pkl615osBMZOedFbErdOOA== +"@babel/plugin-syntax-do-expressions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-do-expressions/-/plugin-syntax-do-expressions-7.24.7.tgz#c8aa7471fa25286fede4c12a464a49d286de8362" + integrity sha512-lQee+garSbTjCvXdzfjXeSzPd03pyBXALfB2C4bW7SwORrZAs5CDt67toH8MRPuvQFYvWpkXYe07AhHDY3tWfQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -501,12 +508,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.1.tgz#a92852e694910ae4295e6e51e87b83507ed5e6e8" - integrity sha512-cNXSxv9eTkGUtd0PsNMK8Yx5xeScxfpWOUAxE+ZPAXXEcAMOC3fk7LRdXq5fvpra2pLx2p1YtkAhpUbB2SwaRA== +"@babel/plugin-syntax-export-default-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac" + integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -515,33 +522,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-function-bind@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.1.tgz#5a3ba1b9ab91286822373fb1dc34b468d8510ea2" - integrity sha512-7K+uzNJ5ZuL6g4Ud/UhbIxghwN2FAj8NBrzEO+eM0g9YddjOv+BD81ar/N7Es5sH+G8z9tnTYcfCu6EaPrkSDw== +"@babel/plugin-syntax-function-bind@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.24.7.tgz#60103187663fb121976d972b23bfb097d9d0234a" + integrity sha512-dqm7VhgJ2sXCEc0WDJV+q8OI1Qzwn4OFbqsHTVtYoc4L7jJYtF6pEQYcbmlMMWBZjw0tJYuXeyiTQVboWIwAKg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-function-sent@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.1.tgz#cd3fd5fa9fce0f53d6dcb78999dd7201561c2304" - integrity sha512-aVwkxqagsGCI8vtuyMI+LnZ2SWtGP4+v9T/T88j2MwKRsGYzc9FAaEzsNMu1Htu6SsHPcfwQ7uZ7pYPGrVmG+g== +"@babel/plugin-syntax-function-sent@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-sent/-/plugin-syntax-function-sent-7.24.7.tgz#4d5e647ca67bee243f58a9a596352dc2920434a6" + integrity sha512-me5EHEx4GXxAE8mnlZaWA+ARIyMSPOXcw6WlqWGIfTg36oeWm4FxR/Djs1DGPbmSIwJqMboiN7gK8eCyzyNK2A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-assertions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz#db3aad724153a00eaac115a3fb898de544e34971" - integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== +"@babel/plugin-syntax-import-assertions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778" + integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-syntax-import-attributes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz#c66b966c63b714c4eec508fcf5763b1f2d381093" - integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca" + integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" @@ -557,12 +564,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.23.3": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz#3f6ca04b8c841811dbc3c5c5f837934e0d626c10" - integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== +"@babel/plugin-syntax-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d" + integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -606,12 +613,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-pipeline-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.1.tgz#149bacade7594288dd9ad373bcbfe2927ea750cc" - integrity sha512-UU7uLj95zh6oMQiREvkTmXAvWy9pJI9p76SFkNsXTesDwQ67YM1UU1Bkx576djA6ZDcPSbzM/MqTJNcYeQ0G2g== +"@babel/plugin-syntax-pipeline-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.24.7.tgz#1558f683508708d0528eaab7e4bf13b6ae793b1f" + integrity sha512-PnW47ro0vPh4Raqabn3FM7opwdKbNQoFJKSNfCj7lmqcQlVMYFcJ6b+rhMyfB/g1SlWRwnodffVzLcee1FDHYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" @@ -620,12 +627,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-throw-expressions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.1.tgz#f8b18a0126cb2991e4f093c6fdab662ef46d7eee" - integrity sha512-o4dN/9/hUAC6RuX1QZDlauBG2nmSmUMk0K7/IOIFxjM8V16FS1JTHHiBWqGkkIjK4myeHucJbBHurqjtWFAdsw== +"@babel/plugin-syntax-throw-expressions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.24.7.tgz#30887b54c478120831bc95881e73ec1984584930" + integrity sha512-b1bdlAmUTy9VQ/g2cnBuJFwd7jeARNW2F65c9Gcn8qyNYGuVy/cYyqpiSL6SVmUAJTDbIYL2FzlZ8nH1qUCBXA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": version "7.14.5" @@ -635,11 +642,11 @@ "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-typescript@^7.7.2": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz#b3bcc51f396d15f3591683f90239de143c076844" - integrity sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c" + integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -649,459 +656,459 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz#2bf263617060c9cc45bcdbf492b8cc805082bf27" - integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== +"@babel/plugin-transform-arrow-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514" + integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-async-generator-functions@^7.24.3": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz#8fa7ae481b100768cc9842c8617808c5352b8b89" - integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== +"@babel/plugin-transform-async-generator-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd" + integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g== dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-to-generator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz#0e220703b89f2216800ce7b1c53cb0cf521c37f4" - integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== +"@babel/plugin-transform-async-to-generator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc" + integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA== dependencies: - "@babel/helper-module-imports" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-remap-async-to-generator" "^7.24.7" -"@babel/plugin-transform-block-scoped-functions@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz#1c94799e20fcd5c4d4589523bbc57b7692979380" - integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== +"@babel/plugin-transform-block-scoped-functions@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f" + integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-block-scoping@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz#89574191397f85661d6f748d4b89ee4d9ee69a2a" - integrity sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw== +"@babel/plugin-transform-block-scoping@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02" + integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz#bcbf1aef6ba6085cfddec9fc8d58871cf011fc29" - integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== +"@babel/plugin-transform-class-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834" + integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-class-static-block@^7.24.4": - version "7.24.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz#1a4653c0cf8ac46441ec406dece6e9bc590356a4" - integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== +"@babel/plugin-transform-class-static-block@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d" + integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.4" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz#05e04a09df49a46348299a0e24bfd7e901129339" - integrity sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-replace-supers" "^7.24.1" - "@babel/helper-split-export-declaration" "^7.24.5" +"@babel/plugin-transform-classes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf" + integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz#bc7e787f8e021eccfb677af5f13c29a9934ed8a7" - integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== +"@babel/plugin-transform-computed-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707" + integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/template" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/template" "^7.24.7" -"@babel/plugin-transform-destructuring@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz#80843ee6a520f7362686d1a97a7b53544ede453c" - integrity sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg== +"@babel/plugin-transform-destructuring@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e" + integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dotall-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz#d56913d2f12795cc9930801b84c6f8c47513ac13" - integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== +"@babel/plugin-transform-dotall-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0" + integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-duplicate-keys@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz#5347a797fe82b8d09749d10e9f5b83665adbca88" - integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== +"@babel/plugin-transform-duplicate-keys@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee" + integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-dynamic-import@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz#2a5a49959201970dd09a5fca856cb651e44439dd" - integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== +"@babel/plugin-transform-dynamic-import@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4" + integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-exponentiation-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz#6650ebeb5bd5c012d5f5f90a26613a08162e8ba4" - integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== +"@babel/plugin-transform-exponentiation-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d" + integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-export-namespace-from@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz#f033541fc036e3efb2dcb58eedafd4f6b8078acd" - integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== +"@babel/plugin-transform-export-namespace-from@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197" + integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-for-of@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz#67448446b67ab6c091360ce3717e7d3a59e202fd" - integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== +"@babel/plugin-transform-for-of@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70" + integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-function-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz#8cba6f7730626cc4dfe4ca2fa516215a0592b361" - integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== +"@babel/plugin-transform-function-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6" + integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-json-strings@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz#08e6369b62ab3e8a7b61089151b161180c8299f7" - integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== +"@babel/plugin-transform-json-strings@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a" + integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz#0a1982297af83e6b3c94972686067df588c5c096" - integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== +"@babel/plugin-transform-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c" + integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-logical-assignment-operators@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz#719d8aded1aa94b8fb34e3a785ae8518e24cfa40" - integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== +"@babel/plugin-transform-logical-assignment-operators@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0" + integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-member-expression-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz#896d23601c92f437af8b01371ad34beb75df4489" - integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== +"@babel/plugin-transform-member-expression-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df" + integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-amd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz#b6d829ed15258536977e9c7cc6437814871ffa39" - integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== +"@babel/plugin-transform-modules-amd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7" + integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-modules-commonjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz#e71ba1d0d69e049a22bf90b3867e263823d3f1b9" - integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== +"@babel/plugin-transform-modules-commonjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab" + integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-simple-access" "^7.24.7" -"@babel/plugin-transform-modules-systemjs@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz#2b9625a3d4e445babac9788daec39094e6b11e3e" - integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== +"@babel/plugin-transform-modules-systemjs@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7" + integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw== dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-identifier" "^7.22.20" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" -"@babel/plugin-transform-modules-umd@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz#69220c66653a19cf2c0872b9c762b9a48b8bebef" - integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== +"@babel/plugin-transform-modules-umd@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8" + integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A== dependencies: - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-transforms" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== +"@babel/plugin-transform-named-capturing-groups-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923" + integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-new-target@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz#29c59988fa3d0157de1c871a28cd83096363cc34" - integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== +"@babel/plugin-transform-new-target@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00" + integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz#0cd494bb97cb07d428bd651632cb9d4140513988" - integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== +"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120" + integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-transform-numeric-separator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz#5bc019ce5b3435c1cadf37215e55e433d674d4e8" - integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== +"@babel/plugin-transform-numeric-separator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63" + integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-transform-object-rest-spread@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz#f91bbcb092ff957c54b4091c86bda8372f0b10ef" - integrity sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA== +"@babel/plugin-transform-object-rest-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6" + integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q== dependencies: - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.24.5" + "@babel/plugin-transform-parameters" "^7.24.7" -"@babel/plugin-transform-object-super@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz#e71d6ab13483cca89ed95a474f542bbfc20a0520" - integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== +"@babel/plugin-transform-object-super@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be" + integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-replace-supers" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-replace-supers" "^7.24.7" -"@babel/plugin-transform-optional-catch-binding@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz#92a3d0efe847ba722f1a4508669b23134669e2da" - integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== +"@babel/plugin-transform-optional-catch-binding@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4" + integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-optional-chaining@^7.24.1", "@babel/plugin-transform-optional-chaining@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz#a6334bebd7f9dd3df37447880d0bd64b778e600f" - integrity sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg== +"@babel/plugin-transform-optional-chaining@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454" + integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-parameters@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz#5c3b23f3a6b8fed090f9b98f2926896d3153cc62" - integrity sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA== +"@babel/plugin-transform-parameters@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68" + integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-methods@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz#a0faa1ae87eff077e1e47a5ec81c3aef383dc15a" - integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== +"@babel/plugin-transform-private-methods@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e" + integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.24.1" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-private-property-in-object@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz#f5d1fcad36e30c960134cb479f1ca98a5b06eda5" - integrity sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ== +"@babel/plugin-transform-private-property-in-object@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061" + integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.24.5" - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-create-class-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz#d6a9aeab96f03749f4eebeb0b6ea8e90ec958825" - integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== +"@babel/plugin-transform-property-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc" + integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-display-name@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz#554e3e1a25d181f040cf698b93fd289a03bfdcdb" - integrity sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw== +"@babel/plugin-transform-react-display-name@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b" + integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== +"@babel/plugin-transform-react-jsx-development@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b" + integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.24.7" -"@babel/plugin-transform-react-jsx@^7.22.5", "@babel/plugin-transform-react-jsx@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz#393f99185110cea87184ea47bcb4a7b0c2e39312" - integrity sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA== +"@babel/plugin-transform-react-jsx@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4" + integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.15" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.23.3" - "@babel/types" "^7.23.4" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/plugin-syntax-jsx" "^7.24.7" + "@babel/types" "^7.24.7" -"@babel/plugin-transform-react-pure-annotations@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz#c86bce22a53956331210d268e49a0ff06e392470" - integrity sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA== +"@babel/plugin-transform-react-pure-annotations@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595" + integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-annotate-as-pure" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-regenerator@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz#625b7545bae52363bdc1fbbdc7252b5046409c8c" - integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== +"@babel/plugin-transform-regenerator@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8" + integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz#8de729f5ecbaaf5cf83b67de13bad38a21be57c1" - integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== +"@babel/plugin-transform-reserved-words@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4" + integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/plugin-transform-runtime@^7.18.5": - version "7.24.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz#dc58ad4a31810a890550365cc922e1ff5acb5d7f" - integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca" + integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw== dependencies: - "@babel/helper-module-imports" "^7.24.3" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-module-imports" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.1" babel-plugin-polyfill-regenerator "^0.6.1" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz#ba9a09144cf55d35ec6b93a32253becad8ee5b55" - integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== +"@babel/plugin-transform-shorthand-properties@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73" + integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-spread@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz#a1acf9152cbf690e4da0ba10790b3ac7d2b2b391" - integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== +"@babel/plugin-transform-spread@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3" + integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7" -"@babel/plugin-transform-sticky-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz#f03e672912c6e203ed8d6e0271d9c2113dc031b9" - integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== +"@babel/plugin-transform-sticky-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb" + integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-template-literals@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz#15e2166873a30d8617e3e2ccadb86643d327aab7" - integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== +"@babel/plugin-transform-template-literals@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8" + integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-typeof-symbol@^7.24.5": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz#703cace5ef74155fb5eecab63cbfc39bdd25fe12" - integrity sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg== +"@babel/plugin-transform-typeof-symbol@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0" + integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg== dependencies: - "@babel/helper-plugin-utils" "^7.24.5" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-escapes@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz#fb3fa16676549ac7c7449db9b342614985c2a3a4" - integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== +"@babel/plugin-transform-unicode-escapes@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e" + integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-property-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz#56704fd4d99da81e5e9f0c0c93cabd91dbc4889e" - integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== +"@babel/plugin-transform-unicode-property-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd" + integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz#57c3c191d68f998ac46b708380c1ce4d13536385" - integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== +"@babel/plugin-transform-unicode-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f" + integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" -"@babel/plugin-transform-unicode-sets-regex@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz#c1ea175b02afcffc9cf57a9c4658326625165b7f" - integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== +"@babel/plugin-transform-unicode-sets-regex@^7.24.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9" + integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.15" - "@babel/helper-plugin-utils" "^7.24.0" + "@babel/helper-create-regexp-features-plugin" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" "@babel/preset-env@^7.11.0", "@babel/preset-env@^7.13.15": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.5.tgz#6a9ac90bd5a5a9dae502af60dfc58c190551bbcd" - integrity sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ== - dependencies: - "@babel/compat-data" "^7.24.4" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.24.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37" + integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ== + dependencies: + "@babel/compat-data" "^7.24.7" + "@babel/helper-compilation-targets" "^7.24.7" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.24.1" - "@babel/plugin-syntax-import-attributes" "^7.24.1" + "@babel/plugin-syntax-import-assertions" "^7.24.7" + "@babel/plugin-syntax-import-attributes" "^7.24.7" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" @@ -1113,54 +1120,54 @@ "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.24.1" - "@babel/plugin-transform-async-generator-functions" "^7.24.3" - "@babel/plugin-transform-async-to-generator" "^7.24.1" - "@babel/plugin-transform-block-scoped-functions" "^7.24.1" - "@babel/plugin-transform-block-scoping" "^7.24.5" - "@babel/plugin-transform-class-properties" "^7.24.1" - "@babel/plugin-transform-class-static-block" "^7.24.4" - "@babel/plugin-transform-classes" "^7.24.5" - "@babel/plugin-transform-computed-properties" "^7.24.1" - "@babel/plugin-transform-destructuring" "^7.24.5" - "@babel/plugin-transform-dotall-regex" "^7.24.1" - "@babel/plugin-transform-duplicate-keys" "^7.24.1" - "@babel/plugin-transform-dynamic-import" "^7.24.1" - "@babel/plugin-transform-exponentiation-operator" "^7.24.1" - "@babel/plugin-transform-export-namespace-from" "^7.24.1" - "@babel/plugin-transform-for-of" "^7.24.1" - "@babel/plugin-transform-function-name" "^7.24.1" - "@babel/plugin-transform-json-strings" "^7.24.1" - "@babel/plugin-transform-literals" "^7.24.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" - "@babel/plugin-transform-member-expression-literals" "^7.24.1" - "@babel/plugin-transform-modules-amd" "^7.24.1" - "@babel/plugin-transform-modules-commonjs" "^7.24.1" - "@babel/plugin-transform-modules-systemjs" "^7.24.1" - "@babel/plugin-transform-modules-umd" "^7.24.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.24.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" - "@babel/plugin-transform-numeric-separator" "^7.24.1" - "@babel/plugin-transform-object-rest-spread" "^7.24.5" - "@babel/plugin-transform-object-super" "^7.24.1" - "@babel/plugin-transform-optional-catch-binding" "^7.24.1" - "@babel/plugin-transform-optional-chaining" "^7.24.5" - "@babel/plugin-transform-parameters" "^7.24.5" - "@babel/plugin-transform-private-methods" "^7.24.1" - "@babel/plugin-transform-private-property-in-object" "^7.24.5" - "@babel/plugin-transform-property-literals" "^7.24.1" - "@babel/plugin-transform-regenerator" "^7.24.1" - "@babel/plugin-transform-reserved-words" "^7.24.1" - "@babel/plugin-transform-shorthand-properties" "^7.24.1" - "@babel/plugin-transform-spread" "^7.24.1" - "@babel/plugin-transform-sticky-regex" "^7.24.1" - "@babel/plugin-transform-template-literals" "^7.24.1" - "@babel/plugin-transform-typeof-symbol" "^7.24.5" - "@babel/plugin-transform-unicode-escapes" "^7.24.1" - "@babel/plugin-transform-unicode-property-regex" "^7.24.1" - "@babel/plugin-transform-unicode-regex" "^7.24.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" + "@babel/plugin-transform-arrow-functions" "^7.24.7" + "@babel/plugin-transform-async-generator-functions" "^7.24.7" + "@babel/plugin-transform-async-to-generator" "^7.24.7" + "@babel/plugin-transform-block-scoped-functions" "^7.24.7" + "@babel/plugin-transform-block-scoping" "^7.24.7" + "@babel/plugin-transform-class-properties" "^7.24.7" + "@babel/plugin-transform-class-static-block" "^7.24.7" + "@babel/plugin-transform-classes" "^7.24.7" + "@babel/plugin-transform-computed-properties" "^7.24.7" + "@babel/plugin-transform-destructuring" "^7.24.7" + "@babel/plugin-transform-dotall-regex" "^7.24.7" + "@babel/plugin-transform-duplicate-keys" "^7.24.7" + "@babel/plugin-transform-dynamic-import" "^7.24.7" + "@babel/plugin-transform-exponentiation-operator" "^7.24.7" + "@babel/plugin-transform-export-namespace-from" "^7.24.7" + "@babel/plugin-transform-for-of" "^7.24.7" + "@babel/plugin-transform-function-name" "^7.24.7" + "@babel/plugin-transform-json-strings" "^7.24.7" + "@babel/plugin-transform-literals" "^7.24.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.24.7" + "@babel/plugin-transform-member-expression-literals" "^7.24.7" + "@babel/plugin-transform-modules-amd" "^7.24.7" + "@babel/plugin-transform-modules-commonjs" "^7.24.7" + "@babel/plugin-transform-modules-systemjs" "^7.24.7" + "@babel/plugin-transform-modules-umd" "^7.24.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7" + "@babel/plugin-transform-new-target" "^7.24.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7" + "@babel/plugin-transform-numeric-separator" "^7.24.7" + "@babel/plugin-transform-object-rest-spread" "^7.24.7" + "@babel/plugin-transform-object-super" "^7.24.7" + "@babel/plugin-transform-optional-catch-binding" "^7.24.7" + "@babel/plugin-transform-optional-chaining" "^7.24.7" + "@babel/plugin-transform-parameters" "^7.24.7" + "@babel/plugin-transform-private-methods" "^7.24.7" + "@babel/plugin-transform-private-property-in-object" "^7.24.7" + "@babel/plugin-transform-property-literals" "^7.24.7" + "@babel/plugin-transform-regenerator" "^7.24.7" + "@babel/plugin-transform-reserved-words" "^7.24.7" + "@babel/plugin-transform-shorthand-properties" "^7.24.7" + "@babel/plugin-transform-spread" "^7.24.7" + "@babel/plugin-transform-sticky-regex" "^7.24.7" + "@babel/plugin-transform-template-literals" "^7.24.7" + "@babel/plugin-transform-typeof-symbol" "^7.24.7" + "@babel/plugin-transform-unicode-escapes" "^7.24.7" + "@babel/plugin-transform-unicode-property-regex" "^7.24.7" + "@babel/plugin-transform-unicode-regex" "^7.24.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.24.7" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" @@ -1178,61 +1185,61 @@ esutils "^2.0.2" "@babel/preset-react@^7.13.13": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.1.tgz#2450c2ac5cc498ef6101a6ca5474de251e33aa95" - integrity sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA== + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc" + integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag== dependencies: - "@babel/helper-plugin-utils" "^7.24.0" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-transform-react-display-name" "^7.24.1" - "@babel/plugin-transform-react-jsx" "^7.23.4" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.24.1" + "@babel/helper-plugin-utils" "^7.24.7" + "@babel/helper-validator-option" "^7.24.7" + "@babel/plugin-transform-react-display-name" "^7.24.7" + "@babel/plugin-transform-react-jsx" "^7.24.7" + "@babel/plugin-transform-react-jsx-development" "^7.24.7" + "@babel/plugin-transform-react-pure-annotations" "^7.24.7" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.23.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.5.tgz#230946857c053a36ccc66e1dd03b17dd0c4ed02c" - integrity sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g== +"@babel/runtime@^7.11.2", "@babel/runtime@^7.13.17", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" + integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.24.0", "@babel/template@^7.3.3": - version "7.24.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" - integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.24.0" - "@babel/types" "^7.24.0" - -"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.5", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.5.tgz#972aa0bc45f16983bf64aa1f877b2dd0eea7e6f8" - integrity sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA== - dependencies: - "@babel/code-frame" "^7.24.2" - "@babel/generator" "^7.24.5" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.24.5" - "@babel/parser" "^7.24.5" - "@babel/types" "^7.24.5" +"@babel/template@^7.24.7", "@babel/template@^7.3.3": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315" + integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" + +"@babel/traverse@^7.0.0-beta.54", "@babel/traverse@^7.24.7", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5" + integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== + dependencies: + "@babel/code-frame" "^7.24.7" + "@babel/generator" "^7.24.7" + "@babel/helper-environment-visitor" "^7.24.7" + "@babel/helper-function-name" "^7.24.7" + "@babel/helper-hoist-variables" "^7.24.7" + "@babel/helper-split-export-declaration" "^7.24.7" + "@babel/parser" "^7.24.7" + "@babel/types" "^7.24.7" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.24.0", "@babel/types@^7.24.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.24.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.5.tgz#7661930afc638a5383eb0c4aee59b74f38db84d7" - integrity sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ== +"@babel/types@^7.0.0", "@babel/types@^7.0.0-beta.49", "@babel/types@^7.0.0-beta.54", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": + version "7.24.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2" + integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== dependencies: - "@babel/helper-string-parser" "^7.24.1" - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-string-parser" "^7.24.7" + "@babel/helper-validator-identifier" "^7.24.7" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1253,9 +1260,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz#361461e5cb3845d874e61731c11cfedd664d83a0" + integrity sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA== "@eslint/eslintrc@^2.1.4": version "2.1.4" @@ -2038,9 +2045,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" - integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== + version "7.20.6" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" + integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== dependencies: "@babel/types" "^7.20.7" @@ -2108,9 +2115,9 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" - integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + version "4.19.5" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz#218064e321126fcf9048d1ca25dd2465da55d9c6" + integrity sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2230,9 +2237,9 @@ "@types/node" "*" "@types/node@*": - version "20.12.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.10.tgz#8f0c3f12b0f075eee1fe20c1afb417e9765bef76" - integrity sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw== + version "20.14.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.8.tgz#45c26a2a5de26c3534a9504530ddb3b27ce031ac" + integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== dependencies: undici-types "~5.26.4" @@ -2569,10 +2576,10 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== +acorn-import-attributes@^1.9.5: + version "1.9.5" + resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef" + integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: version "5.3.2" @@ -2580,19 +2587,21 @@ acorn-jsx@^5.0.0, acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.3.2" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" - integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== + version "8.3.3" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.3.tgz#9caeac29eefaa0c41e3d4c65137de4d6f34df43e" + integrity sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== + dependencies: + acorn "^8.11.0" acorn@^6.0.7: version "6.4.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: - version "8.11.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" - integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.12.0.tgz#1627bfa2e058148036133b8d9b51a700663c294c" + integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== agent-base@6, agent-base@^6.0.2: version "6.0.2" @@ -2646,9 +2655,9 @@ ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1: uri-js "^4.2.2" ajv@^8.0.0, ajv@^8.6.0, ajv@^8.9.0: - version "8.13.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.13.0.tgz#a3939eaec9fb80d217ddf0c3376948c023f28c91" - integrity sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA== + version "8.16.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" + integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== dependencies: fast-deep-equal "^3.1.3" json-schema-traverse "^1.0.0" @@ -2757,12 +2766,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== +aria-query@~5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" arr-diff@^4.0.0: version "4.0.0" @@ -2779,7 +2788,7 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== -array-buffer-byte-length@^1.0.1: +array-buffer-byte-length@^1.0.0, array-buffer-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== @@ -2792,7 +2801,7 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== -array-includes@^3.1.6, array-includes@^3.1.7: +array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== @@ -2826,7 +2835,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== -array.prototype.findlast@^1.2.4: +array.prototype.findlast@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz#3e4fbcb30a15a7f5bf64cf2faae22d139c2e4904" integrity sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== @@ -2880,15 +2889,15 @@ array.prototype.toreversed@^1.1.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" - integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== +array.prototype.tosorted@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc" + integrity sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.1.0" + es-abstract "^1.23.3" + es-errors "^1.3.0" es-shim-unscopables "^1.0.2" arraybuffer.prototype.slice@^1.0.3: @@ -2975,21 +2984,21 @@ aws-sign2@~0.7.0: integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== + version "1.13.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.13.0.tgz#d9b802e9bb9c248d7be5f7f5ef178dc3684e9dcc" + integrity sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g== -axe-core@=4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" - integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== +axe-core@^4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.9.1.tgz#fcd0f4496dad09e0c899b44f6c4bb7848da912ae" + integrity sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== -axobject-query@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== +axobject-query@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - dequal "^2.0.3" + deep-equal "^2.0.5" babel-eslint@^10.0.3: version "10.1.0" @@ -3230,22 +3239,22 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - fill-range "^7.0.1" + fill-range "^7.1.1" browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.23.0: - version "4.23.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" - integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== + version "4.23.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96" + integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== dependencies: - caniuse-lite "^1.0.30001587" - electron-to-chromium "^1.4.668" + caniuse-lite "^1.0.30001629" + electron-to-chromium "^1.4.796" node-releases "^2.0.14" - update-browserslist-db "^1.0.13" + update-browserslist-db "^1.0.16" bser@2.1.1: version "2.1.1" @@ -3393,10 +3402,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001587: - version "1.0.30001616" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz#4342712750d35f71ebba9fcac65e2cf8870013c3" - integrity sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw== +caniuse-lite@^1.0.30001629: + version "1.0.30001636" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz#b15f52d2bdb95fad32c2f53c0b68032b85188a78" + integrity sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg== caseless@~0.12.0: version "0.12.0" @@ -3456,9 +3465,9 @@ chownr@^2.0.0: integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== ci-info@^2.0.0: version "2.0.0" @@ -3615,10 +3624,10 @@ commander@^2.19.0, commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" + integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== commander@^7.0.0, commander@^7.2.0: version "7.2.0" @@ -3742,9 +3751,9 @@ copy-webpack-plugin@^11.0.0: serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.36.1: - version "3.37.0" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.0.tgz#d9570e544163779bb4dff1031c7972f44918dc73" - integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== + version "3.37.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee" + integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg== dependencies: browserslist "^4.23.0" @@ -3897,9 +3906,9 @@ debug@2.6.9, debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== dependencies: ms "2.1.2" @@ -3940,6 +3949,30 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-equal@^2.0.5: + version "2.2.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.3.tgz#af89dafb23a396c7da3e862abc0be27cf51d56e1" + integrity sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.5" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.2" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.1" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.13" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -3971,7 +4004,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -4022,7 +4055,7 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== -dequal@^2.0.0, dequal@^2.0.3: +dequal@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== @@ -4180,10 +4213,10 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.668: - version "1.4.757" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.757.tgz#45f7c9341b538f8c4b9ca8af9692e0ed1a776a44" - integrity sha512-jftDaCknYSSt/+KKeXzH3LX5E2CvRLm75P3Hj+J/dv3CL0qUYcOt13d5FN1NiL5IJbbhzHrb3BomeG2tkSlZmw== +electron-to-chromium@^1.4.796: + version "1.4.810" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz#7dee01b090b9e048e6db752f7b30921790230654" + integrity sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ== emittery@^0.10.2: version "0.10.2" @@ -4229,10 +4262,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.16.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" - integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== +enhanced-resolve@^5.17.0: + version "5.17.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz#d037603789dd9555b89aaec7eb78845c49089bc5" + integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4264,7 +4297,7 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: +es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3: version "1.23.3" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== @@ -4323,12 +4356,27 @@ es-define-property@^1.0.0: dependencies: get-intrinsic "^1.2.4" -es-errors@^1.1.0, es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.2.1, es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.19: version "1.0.19" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8" integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== @@ -4349,9 +4397,9 @@ es-iterator-helpers@^1.0.15, es-iterator-helpers@^1.0.17: safe-array-concat "^1.1.2" es-module-lexer@^1.2.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.2.tgz#00b423304f2500ac59359cc9b6844951f372d497" - integrity sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA== + version "1.5.4" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.4.tgz#a8efec3a3da991e60efa6b633a7cad6ab8d26b78" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== es-object-atoms@^1.0.0: version "1.0.0" @@ -4481,26 +4529,26 @@ eslint-plugin-jest@^26.5.3: "@typescript-eslint/utils" "^5.10.0" eslint-plugin-jsx-a11y@^6.4.1: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz#2fa9c701d44fcd722b7c771ec322432857fcbad2" - integrity sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz#67ab8ff460d4d3d6a0b4a570e9c1670a0a8245c8" + integrity sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== dependencies: - "@babel/runtime" "^7.23.2" - aria-query "^5.3.0" - array-includes "^3.1.7" + aria-query "~5.1.3" + array-includes "^3.1.8" array.prototype.flatmap "^1.3.2" ast-types-flow "^0.0.8" - axe-core "=4.7.0" - axobject-query "^3.2.1" + axe-core "^4.9.1" + axobject-query "~3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" - es-iterator-helpers "^1.0.15" - hasown "^2.0.0" + es-iterator-helpers "^1.0.19" + hasown "^2.0.2" jsx-ast-utils "^3.3.5" language-tags "^1.0.9" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" + object.fromentries "^2.0.8" + safe-regex-test "^1.0.3" + string.prototype.includes "^2.0.0" eslint-plugin-prettier@^4.0.0: version "4.2.1" @@ -4515,28 +4563,28 @@ eslint-plugin-react-hooks@^4.6.0: integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== eslint-plugin-react@^7.23.2: - version "7.34.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz#6806b70c97796f5bbfb235a5d3379ece5f4da997" - integrity sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw== + version "7.34.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b" + integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== dependencies: - array-includes "^3.1.7" - array.prototype.findlast "^1.2.4" + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" array.prototype.flatmap "^1.3.2" array.prototype.toreversed "^1.1.2" - array.prototype.tosorted "^1.1.3" + array.prototype.tosorted "^1.1.4" doctrine "^2.1.0" - es-iterator-helpers "^1.0.17" + es-iterator-helpers "^1.0.19" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.7" - object.fromentries "^2.0.7" - object.hasown "^1.1.3" - object.values "^1.1.7" + object.entries "^1.1.8" + object.fromentries "^2.0.8" + object.hasown "^1.1.4" + object.values "^1.2.0" prop-types "^15.8.1" resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.10" + string.prototype.matchall "^4.0.11" eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" @@ -5033,10 +5081,10 @@ fill-range@^4.0.0: repeat-string "^1.6.1" to-regex-range "^2.1.0" -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" @@ -5294,7 +5342,7 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: +get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== @@ -5852,9 +5900,9 @@ immediate@~3.0.5: integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== immutable@^4.0.0, immutable@^4.0.0-rc.12: - version "4.3.5" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.5.tgz#f8b436e66d59f99760dc577f5c99a4fd2a5cc5a0" - integrity sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw== + version "4.3.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" + integrity sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ== import-fresh@^2.0.0: version "2.0.0" @@ -6009,7 +6057,7 @@ inquirer@^6.2.2: strip-ansi "^5.1.0" through "^2.3.6" -internal-slot@^1.0.7: +internal-slot@^1.0.4, internal-slot@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== @@ -6053,7 +6101,15 @@ is-accessor-descriptor@^1.0.1: dependencies: hasown "^2.0.0" -is-array-buffer@^3.0.4: +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== @@ -6125,11 +6181,11 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.5.0: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + version "2.14.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" + integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-descriptor@^1.0.1: version "1.0.1" @@ -6255,7 +6311,7 @@ is-lambda@^1.0.1: resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== -is-map@^2.0.3: +is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e" integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== @@ -6334,7 +6390,7 @@ is-regexp@^1.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== -is-set@^2.0.3: +is-set@^2.0.2, is-set@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d" integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== @@ -7131,9 +7187,9 @@ kleur@^4.0.3: integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== language-subtag-registry@^0.3.20: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + version "0.3.23" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz#23529e04d9e3b74679d70142df3fd2eb6ec572e7" + integrity sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== language-tags@^1.0.9: version "1.0.9" @@ -7143,9 +7199,9 @@ language-tags@^1.0.9: language-subtag-registry "^0.3.20" launch-editor@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.6.1.tgz#f259c9ef95cbc9425620bbbd14b468fcdb4ffe3c" - integrity sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw== + version "2.8.0" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.8.0.tgz#7255d90bdba414448e2138faa770a74f28451305" + integrity sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA== dependencies: picocolors "^1.0.0" shell-quote "^1.8.1" @@ -7295,6 +7351,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +luxon@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + magic-string@^0.25.0, magic-string@^0.25.7: version "0.25.9" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" @@ -7703,11 +7764,11 @@ micromatch@^3.1.10: to-regex "^3.0.2" micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== dependencies: - braces "^3.0.2" + braces "^3.0.3" picomatch "^2.3.1" mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": @@ -7912,9 +7973,9 @@ mute-stream@0.0.7: integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== nan@^2.13.2: - version "2.19.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0" - integrity sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw== + version "2.20.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.20.0.tgz#08c5ea813dd54ed16e5bd6505bf42af4f7838ca3" + integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== nanoid@^3.3.7: version "3.3.7" @@ -8123,9 +8184,17 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== + version "1.13.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.2.tgz#dea0088467fb991e67af4058147a24824a3043ff" + integrity sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== + +object-is@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== + dependencies: + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -8149,7 +8218,7 @@ object.assign@^4.1.2, object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.5, object.entries@^1.1.7: +object.entries@^1.1.5, object.entries@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.8.tgz#bffe6f282e01f4d17807204a24f8edd823599c41" integrity sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== @@ -8158,7 +8227,7 @@ object.entries@^1.1.5, object.entries@^1.1.7: define-properties "^1.2.1" es-object-atoms "^1.0.0" -object.fromentries@^2.0.7: +object.fromentries@^2.0.7, object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== @@ -8177,7 +8246,7 @@ object.groupby@^1.0.1: define-properties "^1.2.1" es-abstract "^1.23.2" -object.hasown@^1.1.3: +object.hasown@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc" integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== @@ -8193,7 +8262,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.6, object.values@^1.1.7: +object.values@^1.1.6, object.values@^1.1.7, object.values@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== @@ -8526,10 +8595,10 @@ phin@^2.9.1: resolved "https://registry.yarnpkg.com/phin/-/phin-2.9.3.tgz#f9b6ac10a035636fb65dfc576aaaa17b8743125c" integrity sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA== -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== +picocolors@^1.0.0, picocolors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" + integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: version "2.3.1" @@ -8609,9 +8678,9 @@ postcss-modules-values@^4.0.0: icss-utils "^5.0.0" postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.16" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz#3b88b9f5c5abd989ef4e2fc9ec8eedd34b20fb04" - integrity sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw== + version "6.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz#49694cb4e7c649299fea510a29fa6577104bcf53" + integrity sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9068,7 +9137,7 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.5.2: +regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== @@ -9392,18 +9461,18 @@ sass-loader@^13.0.0: neo-async "^2.6.2" sass@^1.52.3: - version "1.77.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.0.tgz#e736c69aff9fae4a4e6dae60a979eee9c942f321" - integrity sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw== + version "1.77.6" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.77.6.tgz#898845c1348078c2e6d1b64f9ee06b3f8bd489e4" + integrity sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" sax@>=0.6.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" - integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== scheduler@^0.23.2: version "0.23.2" @@ -9472,11 +9541,9 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4: - version "7.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" - integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== - dependencies: - lru-cache "^6.0.0" + version "7.6.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" + integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== send@0.18.0: version "0.18.0" @@ -9832,9 +9899,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.17" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz#887da8aa73218e51a1d917502d79863161a93f9c" - integrity sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg== + version "3.0.18" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz#22aa922dcf2f2885a6494a261f2d8b75345d0326" + integrity sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ== spdy-transport@^3.0.0: version "3.0.0" @@ -9935,6 +10002,13 @@ stdout-stream@^1.4.0: dependencies: readable-stream "^2.0.1" +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9983,7 +10057,15 @@ string-width@^3.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.matchall@^4.0.10, string.prototype.matchall@^4.0.6: +string.prototype.includes@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz#8986d57aee66d5460c144620a6d873778ad7289f" + integrity sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + +string.prototype.matchall@^4.0.11, string.prototype.matchall@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz#1092a72c59268d2abaad76582dccc687c0297e0a" integrity sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== @@ -10238,9 +10320,9 @@ terser-webpack-plugin@^5.3.10: terser "^5.26.0" terser@^5.0.0, terser@^5.10.0, terser@^5.26.0: - version "5.31.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.0.tgz#06eef86f17007dbad4593f11a574c7f5eb02c6a1" - integrity sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg== + version "5.31.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4" + integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -10411,9 +10493,9 @@ tslib@^1.8.1, tslib@^1.9.0: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + version "2.6.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" + integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== tsutils@^3.21.0: version "3.21.0" @@ -10688,13 +10770,13 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.13: - version "1.0.15" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz#60ed9f8cba4a728b7ecf7356f641a31e3a691d97" - integrity sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA== +update-browserslist-db@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz#f6d489ed90fb2f07d67784eb3f53d7891f736356" + integrity sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ== dependencies: escalade "^3.1.2" - picocolors "^1.0.0" + picocolors "^1.0.1" uri-js@^4.2.2, uri-js@^4.4.1: version "4.4.1" @@ -10763,9 +10845,9 @@ uvu@^0.5.0: sade "^1.7.3" v8-to-istanbul@^9.0.1: - version "9.2.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" - integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" @@ -10967,9 +11049,9 @@ webpack-sources@^3.2.3: integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack@^5.73.0: - version "5.91.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" - integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== + version "5.92.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.92.1.tgz#eca5c1725b9e189cffbd86e8b6c3c7400efc5788" + integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" @@ -10977,10 +11059,10 @@ webpack@^5.73.0: "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.9.0" + acorn-import-attributes "^1.9.5" browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.16.0" + enhanced-resolve "^5.17.0" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -11071,7 +11153,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: +which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9: version "1.1.15" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== @@ -11320,14 +11402,14 @@ write@1.0.3: mkdirp "^0.5.1" ws@^7.3.1: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + version "7.5.10" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.0.tgz#d145d18eca2ed25aaf791a183903f7be5e295fea" - integrity sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== xhr@^2.0.1: version "2.6.0" diff --git a/start-site-verification/pom.xml b/start-site-verification/pom.xml index 6d15809c9a8..55da66153b2 100644 --- a/start-site-verification/pom.xml +++ b/start-site-verification/pom.xml @@ -28,6 +28,12 @@ + + + io.spring.start + test-support + test + diff --git a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java index 025fe5f38e8..3efb658d728 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java +++ b/start-site-verification/src/test/java/io/spring/start/site/DependencyResolver.java @@ -16,11 +16,8 @@ package io.spring.start.site; -import java.io.IOException; -import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -28,6 +25,7 @@ import java.util.stream.Stream; import io.spring.initializr.metadata.BillOfMaterials; +import io.spring.start.testsupport.Homes; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; @@ -58,36 +56,23 @@ import org.eclipse.aether.util.graph.visitor.FilteringDependencyVisitor; import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy; -import org.springframework.util.FileSystemUtils; - final class DependencyResolver { - private static final Collection instances = new ArrayList<>(); - - private static final ThreadLocal instanceForThread = ThreadLocal.withInitial(() -> { - DependencyResolver instance = new DependencyResolver(); - instances.add(instance); - return instance; - }); - static final RemoteRepository mavenCentral = createRemoteRepository("central", "https://repo1.maven.org/maven2", false); private static final Map> managedDependencies = new ConcurrentHashMap<>(); - private final Path localRepositoryLocation; - private final RepositorySystemSession repositorySystemSession; private final RepositorySystem repositorySystem; - DependencyResolver() { + DependencyResolver(Path localRepositoryLocation) { try { ServiceLocator serviceLocator = createServiceLocator(); DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); session.setArtifactDescriptorPolicy(new SimpleArtifactDescriptorPolicy(false, false)); - this.localRepositoryLocation = Files.createTempDirectory("metadata-validation-m2"); - LocalRepository localRepository = new LocalRepository(this.localRepositoryLocation.toFile()); + LocalRepository localRepository = new LocalRepository(localRepositoryLocation.toFile()); this.repositorySystem = serviceLocator.getService(RepositorySystem.class); session .setLocalRepositoryManager(this.repositorySystem.newLocalRepositoryManager(session, localRepository)); @@ -112,33 +97,26 @@ static RemoteRepository createRemoteRepository(String id, String url, boolean sn return repositoryBuilder.build(); } - static List resolveDependencies(String groupId, String artifactId, String version, + static List resolveDependencies(Homes homes, String groupId, String artifactId, String version, List boms, List repositories) { - DependencyResolver instance = instanceForThread.get(); - List managedDependencies = instance.getManagedDependencies(boms, repositories); - Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", - instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); - CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); - collectRequest.setManagedDependencies(managedDependencies); - try { - CollectResult result = instance.collectDependencies(collectRequest); - return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); - } - catch (DependencyCollectionException ex) { - throw new RuntimeException(ex); - } - } - - static void cleanUp() { - instances.forEach(DependencyResolver::deleteLocalRepository); - } - - void deleteLocalRepository() { + Path home = homes.acquire(); try { - FileSystemUtils.deleteRecursively(this.localRepositoryLocation); + DependencyResolver instance = new DependencyResolver(home.resolve("repository")); + List managedDependencies = instance.getManagedDependencies(boms, repositories); + Dependency aetherDependency = new Dependency(new DefaultArtifact(groupId, artifactId, "pom", + instance.getVersion(groupId, artifactId, version, managedDependencies)), "compile"); + CollectRequest collectRequest = new CollectRequest(aetherDependency, repositories); + collectRequest.setManagedDependencies(managedDependencies); + try { + CollectResult result = instance.collectDependencies(collectRequest); + return DependencyCollector.collect(result.getRoot(), RuntimeTransitiveOnlyDependencyFilter.INSTANCE); + } + catch (DependencyCollectionException ex) { + throw new RuntimeException(ex); + } } - catch (IOException ex) { - // Continue + finally { + homes.release(home); } } diff --git a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java index 7d689ebea60..e77d6ddd2d2 100644 --- a/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java +++ b/start-site-verification/src/test/java/io/spring/start/site/MetadataVerificationTests.java @@ -16,7 +16,6 @@ package io.spring.start.site; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -35,8 +34,8 @@ import io.spring.initializr.metadata.InitializrMetadata; import io.spring.initializr.metadata.InitializrMetadataProvider; import io.spring.initializr.metadata.Repository; +import io.spring.start.testsupport.Homes; import org.eclipse.aether.repository.RemoteRepository; -import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -47,6 +46,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; import static org.assertj.core.api.Assertions.assertThat; @@ -58,19 +58,15 @@ @SpringBootTest @TestInstance(Lifecycle.PER_CLASS) @Execution(ExecutionMode.CONCURRENT) +@ActiveProfiles("test") class MetadataVerificationTests { private final InitializrMetadata metadata; - MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) throws IOException { + MetadataVerificationTests(@Autowired InitializrMetadataProvider metadataProvider) { this.metadata = metadataProvider.get(); } - @AfterAll - static void cleanUp() { - DependencyResolver.cleanUp(); - } - @ParameterizedTest(name = "{3}") @MethodSource("parameters") void dependencyStarterConfigurationIsCorrect(Dependency dependency, List boms, @@ -88,24 +84,8 @@ void dependencyStarterConfigurationIsCorrect(Dependency dependency, List collectDependencies(Dependency dependency, List boms, List repositories) { - try { - return DependencyResolver.resolveDependencies(dependency.getGroupId(), dependency.getArtifactId(), - dependency.getVersion(), boms, repositories); - } - catch (RuntimeException ex) { - // ActiveMQ starter does not exist with Spring Boot 3.0 - if (ex.getMessage().contains("rg.springframework.boot:spring-boot-starter-activemq:pom:")) { - return null; - } - // Known issue with Spring Cloud Contract to be fixed in the next release - // See - // https://github.com/spring-cloud/spring-cloud-contract/commit/13c7d477fbbc856b319600874a11aabcef283df7 - if (ex.getMessage() - .contains("org.springframework.cloud:spring-cloud-starter-contract-verifier:pom:2.2.3.RELEASE")) { - return null; - } - throw ex; - } + return DependencyResolver.resolveDependencies(Homes.MAVEN, dependency.getGroupId(), dependency.getArtifactId(), + dependency.getVersion(), boms, repositories); } Stream parameters() { diff --git a/start-site-verification/src/test/resources/application-test.yml b/start-site-verification/src/test/resources/application-test.yml new file mode 100644 index 00000000000..604ee888f61 --- /dev/null +++ b/start-site-verification/src/test/resources/application-test.yml @@ -0,0 +1,3 @@ +application: + maven-version-resolver: + cache-directory: "${START_SPRING_IO_TMPDIR:${java.io.tmpdir}}/maven-version-resolver-cache" diff --git a/start-site-verification/src/test/resources/junit-platform.properties b/start-site-verification/src/test/resources/junit-platform.properties index 1d27b78fbbb..5c068dfbba1 100644 --- a/start-site-verification/src/test/resources/junit-platform.properties +++ b/start-site-verification/src/test/resources/junit-platform.properties @@ -1 +1,19 @@ +# +# Copyright 2012-2024 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + junit.jupiter.execution.parallel.enabled=true +junit.jupiter.execution.parallel.config.strategy=custom +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/start-site/pom.xml b/start-site/pom.xml index 322e5e48e2a..044ab775b61 100644 --- a/start-site/pom.xml +++ b/start-site/pom.xml @@ -92,6 +92,11 @@ initializr-generator-test test + + io.spring.start + test-support + test + diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java index 35052ee14b9..b645a5cb974 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizer.java @@ -20,6 +20,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Gradle. @@ -29,6 +31,10 @@ */ class GradleBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; + + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version springBootVersion; GradleBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -42,14 +48,19 @@ public void customize(HelpDocument document) { "Gradle Build Scans – insights for your project's build"); document.gettingStarted().addReferenceDocLink("https://docs.gradle.org", "Official Gradle documentation"); document.gettingStarted() - .addReferenceDocLink( - String.format("https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/", - this.springBootVersion), - "Spring Boot Gradle Plugin Reference Guide"); + .addReferenceDocLink(generateReferenceGuideUrl(), "Spring Boot Gradle Plugin Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/gradle-plugin/reference/html/#build-image", - this.springBootVersion), "Create an OCI image"); + .addReferenceDocLink( + String + .format(generateReferenceGuideUrl() + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/packaging-oci-image.html" : "#build-image"), this.springBootVersion), + "Create an OCI image"); + } + + private String generateReferenceGuideUrl() { + String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/%s/gradle-plugin" : "/docs/%s/gradle-plugin/reference/html/"); + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java index 3d8ef234871..e4fe3d8d715 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizer.java @@ -20,6 +20,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * A {@link HelpDocumentCustomizer} that adds reference links for Apache Maven. @@ -29,6 +31,10 @@ */ class MavenBuildSystemHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final String SPRING_BOOT_DOCS_URL = "https://docs.spring.io/spring-boot"; + + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version springBootVersion; MavenBuildSystemHelpDocumentCustomizer(ProjectDescription description) { @@ -41,13 +47,15 @@ public void customize(HelpDocument document) { .addReferenceDocLink("https://maven.apache.org/guides/index.html", "Official Apache Maven documentation"); String referenceGuideUrl = generateReferenceGuideUrl(); document.gettingStarted().addReferenceDocLink(referenceGuideUrl, "Spring Boot Maven Plugin Reference Guide"); - String buildImageSection = referenceGuideUrl + "#build-image"; + String buildImageSection = referenceGuideUrl + + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) ? "/build-image.html" : "#build-image"); document.gettingStarted().addReferenceDocLink(buildImageSection, "Create an OCI image"); } private String generateReferenceGuideUrl() { - String baseUrlFormat = "https://docs.spring.io/spring-boot/docs/%s/maven-plugin/reference/html/"; - return String.format(baseUrlFormat, this.springBootVersion); + String baseUrlFormat = SPRING_BOOT_DOCS_URL + (SPRING_BOOT_3_3_0_OR_LATER.match(this.springBootVersion) + ? "/%s/maven-plugin" : "/docs/%s/maven-plugin/reference/html/"); + return baseUrlFormat.formatted(this.springBootVersion); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java index 88fcf4bb19d..3634d8ce933 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinCoroutinesCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,7 +41,7 @@ public class KotlinCoroutinesCustomizer { public KotlinCoroutinesCustomizer(InitializrMetadata metadata, ProjectDescription description, MavenVersionResolver versionResolver) { - this.buildResolver = new BuildMetadataResolver(metadata); + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.description = description; this.versionResolver = versionResolver; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java index 67a42b90244..54d7310c285 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/KotlinProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,8 +50,9 @@ KotlinVersionResolver kotlinVersionResolver(MavenVersionResolver versionResolver } @Bean - ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - return new ReactorKotlinExtensionsCustomizer(metadata); + ReactorKotlinExtensionsCustomizer reactorKotlinExtensionsCustomizer(InitializrMetadata metadata, + ProjectDescription description) { + return new ReactorKotlinExtensionsCustomizer(metadata, description); } @Configuration diff --git a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java index d813c431967..12673ac2257 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/code/kotlin/ReactorKotlinExtensionsCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -32,8 +33,8 @@ class ReactorKotlinExtensionsCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + ReactorKotlinExtensionsCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java index 4a42b1a1b7c..62a456c9e29 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/DependencyProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +20,7 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.io.template.MustacheTemplateRenderer; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; import io.spring.initializr.generator.spring.build.gradle.ConditionalOnGradleVersion; import io.spring.initializr.metadata.InitializrMetadata; @@ -45,6 +46,7 @@ * @author Stephane Nicoll * @author Eddú Meléndez * @author Kazuki Shimizu + * @author Moritz Halbritter */ @ProjectGenerationConfiguration public class DependencyProjectGenerationConfiguration { @@ -56,8 +58,8 @@ public DependencyProjectGenerationConfiguration(InitializrMetadata metadata) { } @Bean - public ReactorTestBuildCustomizer reactorTestBuildCustomizer() { - return new ReactorTestBuildCustomizer(this.metadata); + public ReactorTestBuildCustomizer reactorTestBuildCustomizer(ProjectDescription description) { + return new ReactorTestBuildCustomizer(this.metadata, description); } @Bean @@ -66,6 +68,12 @@ public SpringSecurityTestBuildCustomizer securityTestBuildCustomizer() { return new SpringSecurityTestBuildCustomizer(); } + @Bean + @ConditionalOnRequestedDependency("oauth2-client") + SpringSecurityTestBuildCustomizer oauth2ClientTestBuildCustomizer() { + return new SpringSecurityTestBuildCustomizer(); + } + @Bean @ConditionalOnRequestedDependency("security") public SpringSecurityRSocketBuildCustomizer securityRSocketBuildCustomizer() { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java new file mode 100644 index 00000000000..349ba5b9213 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizer.java @@ -0,0 +1,40 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that automatically adds + * "graphql-dgs-spring-graphql-starter-test" when the {@code dgs} dependency is present. + * + * @author Brian Clozel + */ +class DgsBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies() + .add("graphql-dgs-spring-graphql-starter-test", + Dependency.withCoordinates("com.netflix.graphql.dgs", "graphql-dgs-spring-graphql-starter-test") + .scope(DependencyScope.TEST_COMPILE)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java index 06f0252df42..48b7ffe7ce4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenGroovyDslGradleBuildCustomizer.java @@ -38,14 +38,10 @@ class DgsCodegenGroovyDslGradleBuildCustomizer implements BuildCustomizer plugin.setVersion(this.pluginVersion)); - build.snippets().add((writer) -> { - writer.println("generateJava {"); - writer.indented(() -> { - writer.println("schemaPaths = [\"${projectDir}/src/main/resources/graphql-client\"]"); - writer.println("packageName = '" + this.packageName + ".codegen'"); - writer.println("generateClient = true"); - }); - writer.println("}"); + build.extensions().customize("generateJava", (generateJava) -> { + generateJava.attribute("schemaPaths", "[\"${projectDir}/src/main/resources/graphql-client\"]"); + generateJava.attribute("packageName", "'" + this.packageName + ".codegen'"); + generateJava.attribute("generateClient", "true"); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java index b64eb82b93f..85dd43bf708 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenKotlinDslGradleBuildCustomizer.java @@ -38,14 +38,10 @@ class DgsCodegenKotlinDslGradleBuildCustomizer implements BuildCustomizer plugin.setVersion(this.pluginVersion)); - build.snippets().add((writer) -> { - writer.println("tasks.generateJava {"); - writer.indented(() -> { - writer.println("schemaPaths.add(\"${projectDir}/src/main/resources/graphql-client\")"); - writer.println("packageName = \"" + this.packageName + ".codegen\""); - writer.println("generateClient = true"); - }); - writer.println("}"); + build.extensions().customize("tasks.generateJava", (generateJava) -> { + generateJava.invoke("schemaPaths.add", "\"${projectDir}/src/main/resources/graphql-client\""); + generateJava.attribute("packageName", "\"" + this.packageName + ".codegen\""); + generateJava.attribute("generateClient", "true"); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java index d126cc9e463..7fd96a0c266 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenVersionResolver.java @@ -36,7 +36,7 @@ static String resolve(InitializrMetadata metadata, Version platformVersion, Buil } else if (MavenBuildSystem.ID.equals(build.id())) { // https://github.com/deweyjose/graphqlcodegen/releases - return "1.50"; + return "1.61.5"; } throw new IllegalArgumentException("Could not resolve DGS Codegen version for build system " + build.id()); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java new file mode 100644 index 00000000000..be1387b6c1c --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/dgs/DgsProjectGenerationConfiguration.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectGenerationConfiguration; + +import org.springframework.context.annotation.Bean; + +/** + * {@link ProjectGenerationConfiguration} for generation of projects that use the Netflix + * DGS. + * + * @author Brian Clozel + */ +@ProjectGenerationConfiguration +@ConditionalOnRequestedDependency("netflix-dgs") +class DgsProjectGenerationConfiguration { + + @Bean + DgsBuildCustomizer dgsBuildCustomizer() { + return new DgsBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java index e1af26e55eb..9a962a914f4 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,11 +22,14 @@ import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.initializr.metadata.Dependency; import io.spring.initializr.metadata.InitializrMetadata; @@ -37,6 +40,8 @@ */ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final InitializrMetadata metadata; private final ProjectDescription description; @@ -55,15 +60,20 @@ class GraalVmHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", + .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) + ? "https://docs.spring.io/spring-boot/%s/reference/packaging/native-image/introducing-graalvm-native-images.html" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/native-image.html#native-image", this.platformVersion), "GraalVM Native Image Support"); boolean mavenBuild = this.build instanceof MavenBuild; - String url = String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", - this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); + boolean gradleBuild = this.build instanceof GradleBuild; + String url = SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) + ? String.format("https://docs.spring.io/spring-boot/%s/how-to/aot.html", this.platformVersion) + : String.format("https://docs.spring.io/spring-boot/docs/%s/%s/reference/htmlsingle/#aot", + this.platformVersion, (mavenBuild) ? "maven-plugin" : "gradle-plugin"); document.gettingStarted().addAdditionalLink(url, "Configure AOT settings in Build Plugin"); Map model = new HashMap<>(); + model.put("gradleBuild", gradleBuild); // Cloud native buildpacks model.put("cnbBuildImageCommand", mavenBuild ? "./mvnw spring-boot:build-image -Pnative" : "./gradlew bootBuildImage"); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java index ce41dda8725..ff53be87021 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -97,17 +97,10 @@ HibernatePluginMavenBuildCustomizer hibernatePluginMavenBuildCustomizer() { } @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_GROOVY) - HibernatePluginGroovyDslGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + HibernatePluginGradleBuildCustomizer hibernatePluginGroovyDslGradleBuildCustomizer( MavenVersionResolver versionResolver) { - return new HibernatePluginGroovyDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); - } - - @Bean - @ConditionalOnBuildSystem(value = GradleBuildSystem.ID, dialect = GradleBuildSystem.DIALECT_KOTLIN) - HibernatePluginKotlinDslGradleBuildCustomizer hibernatePluginKotlinDslGradleBuildCustomizer( - MavenVersionResolver versionResolver) { - return new HibernatePluginKotlinDslGradleBuildCustomizer(determineHibernateVersion(versionResolver)); + return new HibernatePluginGradleBuildCustomizer(determineHibernateVersion(versionResolver)); } private Version determineHibernateVersion(MavenVersionResolver versionResolver) { diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java similarity index 70% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java index 46427aa5d6b..52b6bae816f 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,26 +25,20 @@ * * @author Stephane Nicoll */ -class HibernatePluginGroovyDslGradleBuildCustomizer implements BuildCustomizer { +class HibernatePluginGradleBuildCustomizer implements BuildCustomizer { private final Version hibernateVersion; - HibernatePluginGroovyDslGradleBuildCustomizer(Version hibernateVersion) { + HibernatePluginGradleBuildCustomizer(Version hibernateVersion) { this.hibernateVersion = hibernateVersion; } @Override public void customize(GradleBuild build) { build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); - build.snippets().add((writer) -> { - writer.println("hibernate {"); - writer.indented(() -> { - writer.println("enhancement {"); - writer.indented(() -> writer.println("enableAssociationManagement = true")); - writer.println("}"); - }); - writer.println("}"); - }); + build.extensions() + .customize("hibernate", (hibernate) -> hibernate.nested("enhancement", + (enhancement) -> enhancement.attribute("enableAssociationManagement", "true"))); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java deleted file mode 100644 index 683ec763a59..00000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizer.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; - -/** - * A {@link BuildCustomizer} for projects using the Kotlin DSL with GraalVm and Hibernate. - * - * @author Stephane Nicoll - */ -class HibernatePluginKotlinDslGradleBuildCustomizer implements BuildCustomizer { - - private final Version hibernateVersion; - - HibernatePluginKotlinDslGradleBuildCustomizer(Version hibernateVersion) { - this.hibernateVersion = hibernateVersion; - } - - @Override - public void customize(GradleBuild build) { - build.plugins().add("org.hibernate.orm", (plugin) -> plugin.setVersion(this.hibernateVersion.toString())); - build.snippets().add((writer) -> { - writer.println("hibernate {"); - writer.indented(() -> { - writer.println("enhancement {"); - writer.indented(() -> writer.println("enableAssociationManagement.set(true)")); - writer.println("}"); - }); - writer.println("}"); - }); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java index 57a22722eea..e07bf524716 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ class SpringGraphQlBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - SpringGraphQlBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + SpringGraphQlBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java index 6fd3c04195a..f676f89fad3 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/graphql/SpringGraphQlProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package io.spring.start.site.extension.dependency.graphql; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; @@ -37,8 +38,9 @@ SpringGraphQlProjectContributor SpringGraphQlProjectContributor() { } @Bean - SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata) { - return new SpringGraphQlBuildCustomizer(initializrMetadata); + SpringGraphQlBuildCustomizer SpringGraphQlBuildCustomizer(InitializrMetadata initializrMetadata, + ProjectDescription description) { + return new SpringGraphQlBuildCustomizer(initializrMetadata, description); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java deleted file mode 100644 index f9ff726fe89..00000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaMavenBuildCustomizer.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.generator.buildsystem.maven.MavenBuild; -import io.spring.initializr.generator.spring.build.BuildCustomizer; - -/** - * A {@link BuildCustomizer} that adds a production profile to enable Hilla's production - * mode. - * - * @author Luciano Vernaschi - * @author Stephane Nicoll - */ -class HillaMavenBuildCustomizer implements BuildCustomizer { - - @Override - public void customize(MavenBuild build) { - build.plugins() - .add("dev.hilla", "hilla-maven-plugin", (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", (execution) -> execution.goal("prepare-frontend"))); - build.profiles() - .id("production") - .plugins() - .add("dev.hilla", "hilla-maven-plugin", - (plugin) -> plugin.version("${hilla.version}") - .execution("frontend", - (execution) -> execution.goal("build-frontend") - .phase("compile") - .configuration((configuration) -> configuration.add("productionMode", "true")))); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java new file mode 100644 index 00000000000..456646c24ef --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizer.java @@ -0,0 +1,44 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.buildsystem.Dependency; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * A {@link BuildCustomizer} that replaces {@code htmx-spring-boot} with + * {@code htmx-spring-boot-thymeleaf} if Thymeleaf is selected. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + if (build.dependencies().has("thymeleaf")) { + Dependency htmx = build.dependencies().get("htmx"); + build.dependencies().remove("htmx"); + build.dependencies() + .add("htmx-thymeleaf", + Dependency.withCoordinates(htmx.getGroupId(), "htmx-spring-boot-thymeleaf") + .version(htmx.getVersion()) + .build()); + } + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java new file mode 100644 index 00000000000..7360d24bd9d --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/HtmxProjectGenerationConfiguration.java @@ -0,0 +1,38 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configuration for generation of projects that depend on htmx. + * + * @author Moritz Halbritter + */ +@Configuration(proxyBeanMethods = false) +@ConditionalOnRequestedDependency("htmx") +class HtmxProjectGenerationConfiguration { + + @Bean + HtmxBuildCustomizer htmxBuildCustomizer() { + return new HtmxBuildCustomizer(); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java similarity index 84% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java index 342c0856b6f..b0e25f8f188 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/package-info.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/htmx/package-info.java @@ -15,6 +15,6 @@ */ /** - * Extensions for generation of projects that depend on Hilla. + * Extensions for generation of projects that depend on htmx. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.htmx; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java index a14175982aa..0b82d7e30b0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizer.java @@ -21,6 +21,8 @@ import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; import io.spring.initializr.generator.version.Version; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; /** * {@link HelpDocumentCustomizer} implementation for Observability. @@ -29,6 +31,8 @@ */ public class ObservabilityHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final Version platformVersion; private final Build build; @@ -42,10 +46,12 @@ public ObservabilityHelpDocumentCustomizer(ProjectDescription description, Build public void customize(HelpDocument document) { if (this.build.dependencies().has("distributed-tracing")) { document.gettingStarted() - .addReferenceDocLink("https://micrometer.io/docs/tracing", "Distributed Tracing Reference Guide"); + .addReferenceDocLink("https://docs.micrometer.io/tracing/reference/index.html", + "Distributed Tracing Reference Guide"); document.gettingStarted() - .addReferenceDocLink(String.format( - "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", + .addReferenceDocLink(String.format(SPRING_BOOT_3_3_0_OR_LATER.match(this.platformVersion) + ? "https://docs.spring.io/spring-boot/%s/reference/actuator/tracing.html" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/actuator.html#actuator.micrometer-tracing.getting-started", this.platformVersion), "Getting Started with Distributed Tracing"); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java index 4c6b2e0cf39..7d5ace1bc9b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/ObservabilityProjectGenerationConfiguration.java @@ -17,8 +17,6 @@ package io.spring.start.site.extension.dependency.observability; import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.condition.ConditionalOnPlatformVersion; -import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; @@ -48,11 +46,4 @@ ObservabilityHelpDocumentCustomizer observabilityHelpDocumentCustomizer(ProjectD return new ObservabilityHelpDocumentCustomizer(description, build); } - @Bean - @ConditionalOnRequestedDependency("wavefront") - @ConditionalOnPlatformVersion("[3.2.0, 3.3.0-M1)") - WavefrontHelpDocumentCustomizer wavefrontHelpDocumentCustomizer(Build build) { - return new WavefrontHelpDocumentCustomizer("https://docs.wavefront.com/wavefront_springboot3.html", build); - } - } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java deleted file mode 100644 index 94d7533466d..00000000000 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizer.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.buildsystem.Build; -import io.spring.initializr.generator.spring.documentation.HelpDocument; -import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; - -/** - * A {@link HelpDocumentCustomizer} that provides additional references when Wavefront is - * selected. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizer implements HelpDocumentCustomizer { - - private final Build build; - - private final String referenceLink; - - WavefrontHelpDocumentCustomizer(String referenceLink, Build build) { - this.referenceLink = referenceLink; - this.build = build; - } - - @Override - public void customize(HelpDocument document) { - document.gettingStarted().addReferenceDocLink(this.referenceLink, "Wavefront for Spring Boot documentation"); - - StringBuilder sb = new StringBuilder(); - sb.append(String.format("## Observability with Wavefront%n%n")); - sb.append(String - .format("If you don't have a Wavefront account, the starter will create a freemium account for you.%n")); - sb.append(String.format("The URL to access the Wavefront Service dashboard is logged on startup.%n")); - - if (this.build.dependencies().has("web") || this.build.dependencies().has("webflux")) { - sb.append( - String.format("%nYou can also access your dashboard using the `/actuator/wavefront` endpoint.%n")); - } - - if (!this.build.dependencies().has("distributed-tracing")) { - sb.append(String.format( - "%nFinally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry.%n")); - } - document.addSection((writer) -> writer.print(sb)); - } - -} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java index 277c8227c0e..6b0eed8b204 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/reactor/ReactorTestBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,7 @@ import io.spring.initializr.generator.buildsystem.Build; import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.DependencyScope; +import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.build.BuildCustomizer; import io.spring.initializr.generator.spring.build.BuildMetadataResolver; import io.spring.initializr.metadata.InitializrMetadata; @@ -34,8 +35,8 @@ public class ReactorTestBuildCustomizer implements BuildCustomizer { private final BuildMetadataResolver buildResolver; - public ReactorTestBuildCustomizer(InitializrMetadata metadata) { - this.buildResolver = new BuildMetadataResolver(metadata); + public ReactorTestBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java new file mode 100644 index 00000000000..0b08f1d88ca --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxBuildCustomizer.java @@ -0,0 +1,42 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.Build; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +import org.springframework.core.Ordered; + +/** + * {@link BuildCustomizer} that removes the CycloneDX SBOM dependency as SBOM support does + * not require any dependency. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(Build build) { + build.dependencies().remove("sbom-cyclone-dx"); + } + + @Override + public int getOrder() { + return Ordered.LOWEST_PRECEDENCE - 10; + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java similarity index 50% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java index 7280f736519..879875bf545 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,35 +14,23 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.sbom; import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.spring.build.BuildCustomizer; -import io.spring.initializr.generator.version.Version; -import io.spring.initializr.metadata.InitializrMetadata; /** - * A {@link BuildCustomizer} that registers Hilla's Gradle plugin. + * {@link BuildCustomizer} that adds the CycloneDX Gradle plugin. * - * @author Luciano Vernaschi - * @author Stephane Nicoll + * @author Moritz Halbritter */ -class HillaGradleBuildCustomizer implements BuildCustomizer { +class SbomCycloneDxGradleBuildCustomizer implements BuildCustomizer { - private final String hillaVersion; - - HillaGradleBuildCustomizer(InitializrMetadata metadata, Version platformVersion) { - this.hillaVersion = metadata.getConfiguration() - .getEnv() - .getBoms() - .get("hilla") - .resolve(platformVersion) - .getVersion(); - } + private static final String PLUGIN_VERSION = "1.10.0"; @Override public void customize(GradleBuild build) { - build.plugins().add("dev.hilla", (plugin) -> plugin.setVersion(this.hillaVersion)); + build.plugins().add("org.cyclonedx.bom", (plugin) -> plugin.setVersion(PLUGIN_VERSION)); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java new file mode 100644 index 00000000000..3282385f4f7 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomCycloneDxMavenBuildCustomizer.java @@ -0,0 +1,34 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.spring.build.BuildCustomizer; + +/** + * {@link BuildCustomizer} that adds the CycloneDX Maven plugin. + * + * @author Moritz Halbritter + */ +class SbomCycloneDxMavenBuildCustomizer implements BuildCustomizer { + + @Override + public void customize(MavenBuild build) { + build.plugins().add("org.cyclonedx", "cyclonedx-maven-plugin"); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java similarity index 55% rename from start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java rename to start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java index f910ff521f5..d6d5528155a 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,44 +14,40 @@ * limitations under the License. */ -package io.spring.start.site.extension.dependency.hilla; +package io.spring.start.site.extension.dependency.sbom; import io.spring.initializr.generator.buildsystem.gradle.GradleBuildSystem; import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; -import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.project.ProjectGenerationConfiguration; -import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; -import io.spring.initializr.metadata.InitializrMetadata; import org.springframework.context.annotation.Bean; /** - * Configuration for generation of projects that depend on Hilla. + * {@link ProjectGenerationConfiguration} for generation of projects that use SBOMs. * - * @author Luciano Vernaschi - * @author Stephane Nicoll + * @author Moritz Halbritter */ @ProjectGenerationConfiguration -@ConditionalOnRequestedDependency("hilla") -class HillaProjectGenerationConfiguration { +@ConditionalOnRequestedDependency("sbom-cyclone-dx") +class SbomProjectGenerationConfiguration { @Bean - @ConditionalOnBuildSystem(MavenBuildSystem.ID) - HillaMavenBuildCustomizer hillaMavenBuildCustomizer() { - return new HillaMavenBuildCustomizer(); + SbomCycloneDxBuildCustomizer sbomBuildCustomizer() { + return new SbomCycloneDxBuildCustomizer(); } @Bean - @ConditionalOnBuildSystem(GradleBuildSystem.ID) - HillaGradleBuildCustomizer hillaGradleBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - return new HillaGradleBuildCustomizer(metadata, description.getPlatformVersion()); + @ConditionalOnBuildSystem(MavenBuildSystem.ID) + SbomCycloneDxMavenBuildCustomizer sbomCycloneDxMavenBuildCustomizer() { + return new SbomCycloneDxMavenBuildCustomizer(); } @Bean - GitIgnoreCustomizer hillaGitIgnoreCustomizer() { - return (gitignore) -> gitignore.getGeneral().add("node_modules/", "frontend/generated/"); + @ConditionalOnBuildSystem(GradleBuildSystem.ID) + SbomCycloneDxGradleBuildCustomizer sbomCycloneDxGradleBuildCustomizer() { + return new SbomCycloneDxGradleBuildCustomizer(); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java new file mode 100644 index 00000000000..81b08a0254b --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/sbom/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Extensions for generation of projects that use SBOMs. + */ +package io.spring.start.site.extension.dependency.sbom; diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java index 6d24a1a40c7..eecae228c65 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springboot/SpringBootProjectGenerationConfiguration.java @@ -36,24 +36,20 @@ @ProjectGenerationConfiguration class SpringBootProjectGenerationConfiguration { - private static final String DEVTOOLS_ID = "devtools"; - - private static final String DOCKER_COMPOSE_ID = "docker-compose"; - @Configuration(proxyBeanMethods = false) @ConditionalOnBuildSystem(MavenBuildSystem.ID) static class MavenConfiguration { @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @ConditionalOnRequestedDependency("devtools") OptionalDependencyMavenBuildCustomizer devToolsMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DEVTOOLS_ID); + return new OptionalDependencyMavenBuildCustomizer("devtools"); } @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + @ConditionalOnRequestedDependency("docker-compose") OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { - return new OptionalDependencyMavenBuildCustomizer(DOCKER_COMPOSE_ID); + return new OptionalDependencyMavenBuildCustomizer("docker-compose"); } } @@ -63,15 +59,15 @@ OptionalDependencyMavenBuildCustomizer dockerComposeMavenBuildCustomizer() { static class GradleConfiguration { @Bean - @ConditionalOnRequestedDependency(DEVTOOLS_ID) + @ConditionalOnRequestedDependency("devtools") DevelopmentOnlyDependencyGradleBuildCustomizer devToolsGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DEVTOOLS_ID); + return new DevelopmentOnlyDependencyGradleBuildCustomizer("devtools"); } @Bean - @ConditionalOnRequestedDependency(DOCKER_COMPOSE_ID) + @ConditionalOnRequestedDependency("docker-compose") DevelopmentOnlyDependencyGradleBuildCustomizer dockerComposeGradleBuildCustomizer() { - return new DevelopmentOnlyDependencyGradleBuildCustomizer(DOCKER_COMPOSE_ID); + return new DevelopmentOnlyDependencyGradleBuildCustomizer("docker-compose"); } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java index 420374e0201..569cd725e6b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ public class SpringCloudCircuitBreakerBuildCustomizer implements BuildCustomizer private final ProjectDescription description; public SpringCloudCircuitBreakerBuildCustomizer(InitializrMetadata metadata, ProjectDescription description) { - this.buildResolver = new BuildMetadataResolver(metadata); + this.buildResolver = new BuildMetadataResolver(metadata, description.getPlatformVersion()); this.metadata = metadata; this.description = description; } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java index cdb092ff199..08c3f655093 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGroovyDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,14 +33,10 @@ class SpringCloudContractGroovyDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - build.snippets().add((indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (build.dependencies().has("webflux")) { - indentingWriter.println("testMode = 'WebTestClient'"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attribute("testMode", "'WebTestClient'"); + } }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java index 91b8b098877..1e7d064934b 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractKotlinDslGradleBuildCustomizer.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2022 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,9 +16,6 @@ package io.spring.start.site.extension.dependency.springcloud; -import java.util.LinkedHashSet; -import java.util.Set; - import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; import io.spring.initializr.generator.project.ProjectDescription; @@ -36,19 +33,11 @@ class SpringCloudContractKotlinDslGradleBuildCustomizer extends SpringCloudContr @Override protected void configureContractsDsl(GradleBuild build) { - boolean hasWebflux = build.dependencies().has("webflux"); - Set imports = new LinkedHashSet<>(); - if (hasWebflux) { - imports.add("org.springframework.cloud.contract.verifier.config.TestMode"); - } - build.snippets().add(imports, (indentingWriter) -> { - indentingWriter.println("contracts {"); - indentingWriter.indented(() -> { - if (hasWebflux) { - indentingWriter.println("testMode.set(TestMode.WEBTESTCLIENT)"); - } - }); - indentingWriter.println("}"); + build.extensions().customize("contracts", (contracts) -> { + if (build.dependencies().has("webflux")) { + contracts.attributeWithType("testMode", "TestMode.WEBTESTCLIENT", + "org.springframework.cloud.contract.verifier.config.TestMode"); + } }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java index 38cde136772..91604af4cd3 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizer.java @@ -39,6 +39,10 @@ class SpringModulithBuildCustomizer implements BuildCustomizer { private static final Collection OBSERVABILITY_DEPENDENCIES = List.of("actuator", "datadog", "graphite", "influx", "new-relic", "prometheus", "wavefront", "zipkin"); + private static final Collection PERSISTENCE = List.of("jdbc", "jpa", "mongodb"); + + private static final Collection BROKERS = List.of("activemq", "amqp", "artemis", "kafka"); + @Override public void customize(Build build) { DependencyContainer dependencies = build.dependencies(); @@ -50,25 +54,49 @@ public void customize(Build build) { modulithDependency("observability").scope(DependencyScope.RUNTIME)); } addEventPublicationRegistryBackend(build); + if (addEventExternalizationDependency(build)) { + dependencies.add("modulith-events-api", modulithDependency("events-api")); + } dependencies.add("modulith-starter-test", modulithDependency("starter-test").scope(DependencyScope.TEST_COMPILE)); } - private void addEventPublicationRegistryBackend(Build build) { + private boolean addEventPublicationRegistryBackend(Build build) { DependencyContainer dependencies = build.dependencies(); - if (dependencies.has("data-mongodb")) { - dependencies.add("modulith-starter-mongodb", modulithDependency("starter-mongodb")); - } - if (dependencies.has("data-jdbc")) { - dependencies.add("modulith-starter-jdbc", modulithDependency("starter-jdbc")); - } - if (dependencies.has("data-jpa")) { - dependencies.add("modulith-starter-jpa", modulithDependency("starter-jpa")); + return PERSISTENCE.stream() + .map((persistence) -> addPersistenceDependency(persistence, dependencies)) + .reduce(false, (l, r) -> l || r); + } + + private boolean addPersistenceDependency(String store, DependencyContainer dependencies) { + if (!dependencies.has("data-" + store)) { + return false; } + dependencies.add("modulith-starter-" + store, modulithDependency("starter-" + store)); + return true; } private Builder modulithDependency(String name) { return Dependency.withCoordinates("org.springframework.modulith", "spring-modulith-" + name); } + private boolean addEventExternalizationDependency(Build build) { + DependencyContainer dependencies = build.dependencies(); + return BROKERS.stream() + .filter(dependencies::has) + .map(this::getModulithBrokerKey) + .peek((it) -> dependencies.add("modulith-events-" + it, + modulithDependency("events-" + it).scope(DependencyScope.RUNTIME))) + .findAny() + .isPresent(); + } + + private String getModulithBrokerKey(String broker) { + return switch (broker) { + case "kafka", "amqp" -> broker; + case "artemis", "activemq" -> "jms"; + default -> throw new IllegalArgumentException("Unsupported broker!"); + }; + } + } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java index cee6236a488..460aabba432 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/GroovyTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class GroovyTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(GroovySourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(GroovyMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java new file mode 100644 index 00000000000..98fedf75945 --- /dev/null +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/ImportTestcontainersConfigurationTestApplicationTypeCustomizer.java @@ -0,0 +1,39 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.testcontainers; + +import io.spring.initializr.generator.language.ClassName; +import io.spring.initializr.generator.language.TypeDeclaration; +import io.spring.initializr.generator.spring.code.TestApplicationTypeCustomizer; + +/** + * {@link TestApplicationTypeCustomizer} that imports the generated Testcontainers test + * configuration. + * + * @author Moritz Halbritter + */ +class ImportTestcontainersConfigurationTestApplicationTypeCustomizer + implements TestApplicationTypeCustomizer { + + @Override + public void customize(TypeDeclaration typeDeclaration) { + typeDeclaration.annotations() + .add(ClassName.of("org.springframework.context.annotation.Import"), (annotation) -> annotation.set("value", + TestContainersApplicationCodeProjectContributor.TESTCONTAINERS_CONFIGURATION_CLASS_NAME)); + } + +} diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java index 774cf4ac3ca..6bd9717be1e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/JavaTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -52,14 +52,15 @@ class JavaTestContainersApplicationCodeProjectContributor extends @Override protected void contributeCode(JavaSourceCode sourceCode) { + super.contributeCode(sourceCode); customizeApplicationTypeDeclaration(sourceCode, (type) -> { type.modifiers(Modifier.PUBLIC); type.addMethodDeclaration(JavaMethodDeclaration.method("main") .modifiers(Modifier.PUBLIC | Modifier.STATIC) .returning("void") .parameters(Parameter.of("args", String[].class)) - .body(CodeBlock.ofStatement("$T.from($L::main).with($L.class).run(args)", SpringApplication.class, - getDescription().getApplicationName(), getTestApplicationName()))); + .body(CodeBlock.ofStatement("$T.from($L::main).with($T.class).run(args)", SpringApplication.class, + getDescription().getApplicationName(), TESTCONTAINERS_CONFIGURATION_CLASS_NAME))); }); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java index 715d462022c..bd9ba8b5e91 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/KotlinTestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,7 +17,6 @@ package io.spring.start.site.extension.dependency.testcontainers; import java.util.Arrays; -import java.util.function.Consumer; import java.util.stream.Collectors; import io.spring.initializr.generator.io.IndentingWriterFactory; @@ -25,7 +24,6 @@ import io.spring.initializr.generator.language.Parameter; import io.spring.initializr.generator.language.kotlin.KotlinCompilationUnit; import io.spring.initializr.generator.language.kotlin.KotlinFunctionDeclaration; -import io.spring.initializr.generator.language.kotlin.KotlinModifier; import io.spring.initializr.generator.language.kotlin.KotlinSourceCode; import io.spring.initializr.generator.language.kotlin.KotlinSourceCodeWriter; import io.spring.initializr.generator.language.kotlin.KotlinTypeDeclaration; @@ -48,23 +46,18 @@ class KotlinTestContainersApplicationCodeProjectContributor extends KotlinTestContainersApplicationCodeProjectContributor(IndentingWriterFactory indentingWriterFactory, ProjectDescription description, ServiceConnections serviceConnections) { super(description, serviceConnections, KotlinSourceCode::new, - new KotlinSourceCodeWriter(indentingWriterFactory)); + new KotlinSourceCodeWriter(description.getLanguage(), indentingWriterFactory)); } @Override protected void contributeCode(KotlinSourceCode sourceCode) { - customizeApplicationTypeDeclaration(sourceCode, (type) -> type.modifiers(KotlinModifier.PUBLIC)); - } - - @Override - protected void customizeApplicationCompilationUnit(KotlinSourceCode sourceCode, - Consumer customizer) { - super.customizeApplicationCompilationUnit(sourceCode, customizer - .andThen((compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") - .parameters(Parameter.of("args", "Array")) - .body(CodeBlock.ofStatement("$T<$L>().$T($L::class).run(*args)", - "org.springframework.boot.fromApplication", getDescription().getApplicationName(), - "org.springframework.boot.with", getTestApplicationName()))))); + super.contributeCode(sourceCode); + customizeApplicationCompilationUnit(sourceCode, + (compilationUnit) -> compilationUnit.addTopLevelFunction(KotlinFunctionDeclaration.function("main") + .parameters(Parameter.of("args", "Array")) + .body(CodeBlock.ofStatement("$T<$L>().$T($T::class).run(*args)", + "org.springframework.boot.fromApplication", getDescription().getApplicationName(), + "org.springframework.boot.with", TESTCONTAINERS_CONFIGURATION_CLASS_NAME)))); } @Override diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java index 6e5667c39ed..1d878580374 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersApplicationCodeProjectContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -40,6 +40,7 @@ * @param language-specific compilation unit * @param language-specific source code * @author Stephane Nicoll + * @author Moritz Halbritter */ abstract class TestContainersApplicationCodeProjectContributor, S extends SourceCode> implements ProjectContributor { @@ -55,6 +56,8 @@ abstract class TestContainersApplicationCodeProjectContributor annotation.set("proxyBeanMethods", false)); + this.serviceConnections.values() + .forEach((serviceConnection) -> configureServiceConnection(testcontainersConfiguration, serviceConnection)); + } protected abstract void configureServiceConnection(T typeDeclaration, ServiceConnection serviceConnection); @@ -101,10 +117,6 @@ protected void customizeApplicationCompilationUnit(S sourceCode, Consumer cus protected void customizeApplicationTypeDeclaration(S sourceCode, Consumer customizer) { customizeApplicationCompilationUnit(sourceCode, (compilationUnit) -> { T applicationType = compilationUnit.createTypeDeclaration(getTestApplicationName()); - applicationType.annotations() - .add(TEST_CONFIGURATION_CLASS_NAME, (annotation) -> annotation.set("proxyBeanMethods", false)); - this.serviceConnections.values() - .forEach((serviceConnection) -> configureServiceConnection(applicationType, serviceConnection)); customizer.accept(applicationType); }); } @@ -118,7 +130,7 @@ protected void annotateContainerMethod(Annotatable annotable, String name) { }); } - protected String getTestApplicationName() { + private String getTestApplicationName() { return "Test" + this.description.getApplicationName(); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java index 91f34224247..cbe847d9f0e 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestContainersHelpDocumentCustomizer.java @@ -23,6 +23,8 @@ import io.spring.initializr.generator.project.ProjectDescription; import io.spring.initializr.generator.spring.documentation.HelpDocument; import io.spring.initializr.generator.spring.documentation.HelpDocumentCustomizer; +import io.spring.initializr.generator.version.VersionParser; +import io.spring.initializr.generator.version.VersionRange; import io.spring.start.site.container.DockerService; import io.spring.start.site.container.ServiceConnections; import io.spring.start.site.container.ServiceConnections.ServiceConnection; @@ -35,6 +37,8 @@ */ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { + private static final VersionRange SPRING_BOOT_3_3_0_OR_LATER = VersionParser.DEFAULT.parseRange("3.3.0"); + private final ProjectDescription description; private final ServiceConnections serviceConnections; @@ -46,18 +50,21 @@ class TestContainersHelpDocumentCustomizer implements HelpDocumentCustomizer { @Override public void customize(HelpDocument document) { - String referenceDocUrl = "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers" + String referenceDocUrl = (SPRING_BOOT_3_3_0_OR_LATER.match(this.description.getPlatformVersion()) + ? "https://docs.spring.io/spring-boot/%s/reference/testing/testcontainers.html#testing.testcontainers" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers") .formatted(this.description.getPlatformVersion()); document.gettingStarted().addReferenceDocLink(referenceDocUrl, "Spring Boot Testcontainers support"); - Map model = new HashMap<>(); List dockerServices = this.serviceConnections.values() .map(ServiceConnection::dockerService) .toList(); model.put("services", dockerServices); - model.put("testcontainersAtDevelopmentTimeLink", - "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time" - .formatted(this.description.getPlatformVersion())); + model.put("testcontainersAtDevelopmentTimeLink", (SPRING_BOOT_3_3_0_OR_LATER + .match(this.description.getPlatformVersion()) + ? "https://docs.spring.io/spring-boot/%s/reference/features/dev-services.html#features.dev-services.testcontainers" + : "https://docs.spring.io/spring-boot/docs/%s/reference/html/features.html#features.testing.testcontainers.at-development-time") + .formatted(this.description.getPlatformVersion())); document.addSection("testcontainers", model); } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java index 4cedcf17a67..3de0c8dfab8 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -127,6 +127,11 @@ JavaTestContainersApplicationCodeProjectContributor javaTestContainersApplicatio this.description, serviceConnections); } + @Bean + ImportTestcontainersConfigurationTestApplicationTypeCustomizer importTestcontainersConfigurationTestApplicationTypeCustomizer() { + return new ImportTestcontainersConfigurationTestApplicationTypeCustomizer(); + } + } } diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java index 47d17d7606a..236bdfd0ea0 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizer.java @@ -24,12 +24,13 @@ * A {@link BuildCustomizer} for Thymeleaf. * * @author Stephane Nicoll + * @author Moritz Halbritter */ public class ThymeleafBuildCustomizer implements BuildCustomizer { @Override public void customize(Build build) { - if (build.dependencies().has("security")) { + if (build.dependencies().has("security") || build.dependencies().has("oauth2-client")) { build.dependencies() .add("thymeleaf-extras-spring-security", Dependency.withCoordinates("org.thymeleaf.extras", "thymeleaf-extras-springsecurity6")); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java index a1889d1822c..740cde0ae46 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizer.java @@ -16,7 +16,9 @@ package io.spring.start.site.extension.dependency.vaadin; +import io.spring.initializr.generator.buildsystem.Dependency; import io.spring.initializr.generator.buildsystem.maven.MavenBuild; +import io.spring.initializr.generator.buildsystem.maven.MavenProfile; import io.spring.initializr.generator.spring.build.BuildCustomizer; /** @@ -24,14 +26,19 @@ * mode. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinMavenBuildCustomizer implements BuildCustomizer { @Override public void customize(MavenBuild build) { - build.profiles() - .id("production") - .plugins() + MavenProfile profile = build.profiles().id("production"); + profile.dependencies() + .add("vaadin-core", + Dependency.withCoordinates("com.vaadin", "vaadin-core") + .exclusions(new Dependency.Exclusion("com.vaadin", "vaadin-dev")) + .build()); + profile.plugins() .add("com.vaadin", "vaadin-maven-plugin", (plugin) -> plugin.version("${vaadin.version}") .execution("frontend", (execution) -> execution.goal("prepare-frontend").goal("build-frontend").phase("compile"))); diff --git a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java index 8c1435fd15b..5415099a7e9 100644 --- a/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java +++ b/start-site/src/main/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfiguration.java @@ -21,6 +21,7 @@ import io.spring.initializr.generator.condition.ConditionalOnBuildSystem; import io.spring.initializr.generator.condition.ConditionalOnRequestedDependency; import io.spring.initializr.generator.project.ProjectDescription; +import io.spring.initializr.generator.spring.properties.ApplicationPropertiesCustomizer; import io.spring.initializr.generator.spring.scm.git.GitIgnoreCustomizer; import io.spring.initializr.metadata.InitializrMetadata; @@ -31,6 +32,7 @@ * Configuration for generation of projects that depend on Vaadin. * * @author Stephane Nicoll + * @author Moritz Halbritter */ @Configuration(proxyBeanMethods = false) @ConditionalOnRequestedDependency("vaadin") @@ -54,4 +56,9 @@ GitIgnoreCustomizer vaadinGitIgnoreCustomizer() { return (gitignore) -> gitignore.getGeneral().add("node_modules"); } + @Bean + ApplicationPropertiesCustomizer launchBrowserApplicationPropertiesCustomizer() { + return (properties) -> properties.add("vaadin.launch-browser", true); + } + } diff --git a/start-site/src/main/resources/META-INF/spring.factories b/start-site/src/main/resources/META-INF/spring.factories index 181db41f023..40924849fc3 100644 --- a/start-site/src/main/resources/META-INF/spring.factories +++ b/start-site/src/main/resources/META-INF/spring.factories @@ -7,13 +7,14 @@ io.spring.start.site.extension.dependency.activemq.ActiveMQProjectGenerationConf io.spring.start.site.extension.dependency.activemq.ArtemisProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.cassandra.CassandraProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.derby.DerbyProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.dgs.DgsProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dgs.DgsCodegenProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.dockercompose.DockerComposeProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.elasticsearch.ElasticsearchProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.flyway.FlywayProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graalvm.GraalVmProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.graphql.SpringGraphQlProjectGenerationConfiguration,\ -io.spring.start.site.extension.dependency.hilla.HillaProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.htmx.HtmxProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mariadb.MariaDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mongodb.MongoDbProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.mysql.MysqlProjectGenerationConfiguration,\ @@ -23,6 +24,7 @@ io.spring.start.site.extension.dependency.oracle.OracleProjectGenerationConfigur io.spring.start.site.extension.dependency.postgresql.PgVectorProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.postgresql.PostgresqlProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.redis.RedisProjectGenerationConfiguration,\ +io.spring.start.site.extension.dependency.sbom.SbomProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.solace.SolaceProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springamqp.SpringAmqpProjectGenerationConfiguration,\ io.spring.start.site.extension.dependency.springazure.SpringAzureProjectGenerationConfiguration,\ diff --git a/start-site/src/main/resources/application.yml b/start-site/src/main/resources/application.yml index 225169c8d5c..1c364b78d23 100644 --- a/start-site/src/main/resources/application.yml +++ b/start-site/src/main/resources/application.yml @@ -48,48 +48,47 @@ initializr: mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" version: 3.2.3 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 3.3.3 netflix-dgs: groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-platform-dependencies versionProperty: netflix-dgs.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 8.6.1 - hilla: - groupId: dev.hilla - artifactId: hilla-bom - versionProperty: hilla.version - mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 2.5.5 + version: 8.7.1 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 9.1.0 sentry: groupId: io.sentry artifactId: sentry-bom versionProperty: sentry.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 7.3.0 + version: 7.14.0 solace-spring-boot: groupId: com.solace.spring.boot artifactId: solace-spring-boot-bom versionProperty: solace-spring-boot.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 2.0.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 2.2.0 solace-spring-cloud: groupId: com.solace.spring.cloud artifactId: solace-spring-cloud-bom versionProperty: solace-spring-cloud.version mappings: - - compatibilityRange: "[3.2.0, 3.3.0-M1)" - version: 4.0.0 + - compatibilityRange: "[3.2.0,3.3.0-M1)" + version: 4.1.0 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 4.4.0 spring-ai: groupId: org.springframework.ai artifactId: spring-ai-bom versionProperty: spring-ai.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 0.8.1 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 1.0.0-M2 repositories: spring-milestones spring-cloud: groupId: org.springframework.cloud @@ -97,40 +96,45 @@ initializr: versionProperty: spring-cloud.version order: 50 mappings: - - compatibilityRange: "3.2.0" - version: 2023.0.1 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 2023.0.3 + - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + version: 2024.0.0-M1 + repositories: spring-milestones spring-cloud-azure: groupId: com.azure.spring artifactId: spring-cloud-azure-dependencies versionProperty: spring-cloud-azure.version mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.12.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 5.15.0 spring-cloud-gcp: groupId: com.google.cloud artifactId: spring-cloud-gcp-dependencies versionProperty: spring-cloud-gcp.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 5.3.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 5.6.0 spring-cloud-services: groupId: io.pivotal.spring.cloud artifactId: spring-cloud-services-dependencies versionProperty: spring-cloud-services.version additionalBoms: [ spring-cloud ] mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 4.1.0 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 4.1.5 spring-modulith: groupId: org.springframework.modulith artifactId: spring-modulith-bom versionProperty: spring-modulith.version mappings: - - compatibility-range: "[3.2.0,3.3.0-M1)" - version: 1.1.4 - - compatibility-range: "3.3.0-M1" - version: 1.2.0-RC1 + - compatibilityRange: "[3.2.0,3.3.0-M1)" + version: 1.1.8 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 1.2.3 + - compatibilityRange: "[3.4.0-M1,3.5.0-M1)" + version: 1.3.0-M2 repositories: spring-milestones spring-shell: groupId: org.springframework.shell @@ -138,28 +142,27 @@ initializr: versionProperty: spring-shell.version mappings: - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.2.4 - - compatibility-range: "3.3.0-M1" - version: 3.3.0-M1 - repositories: spring-milestones + version: 3.2.7 + - compatibilityRange: "[3.3.0,3.4.0-M1)" + version: 3.3.2 timefold-solver: groupId: ai.timefold.solver artifactId: timefold-solver-bom versionProperty: timefold-solver.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 1.10.0 + version: 1.13.0 vaadin: groupId: com.vaadin artifactId: vaadin-bom versionProperty: vaadin.version mappings: - compatibilityRange: "[3.2.0,3.4.0-M1)" - version: 24.3.12 + version: 24.4.11 gradle: dependency-management-plugin-version: 1.0.14.RELEASE platform: - compatibility-range: "3.2.0" + compatibilityRange: "3.2.0" dependencies: - name: Developer Tools content: @@ -171,12 +174,9 @@ initializr: starter: false - name: GraphQL DGS Code Generation id: dgs-codegen - compatibilityRange: "3.2.0" groupId: com.netflix.graphql.dgs.codegen artifactId: graphql-dgs-codegen-gradle - mappings: - - compatibilityRange: "3.2.0" - version: 6.2.1 + version: 6.2.1 description: Generate data types and type-safe APIs for querying GraphQL APIs by parsing schema files. starter: false - name: Spring Boot DevTools @@ -208,7 +208,6 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#appendix.configuration-metadata.annotation-processor - name: Docker Compose Support id: docker-compose - compatibilityRange: "3.2.0" groupId: org.springframework.boot artifactId: spring-boot-docker-compose scope: runtime @@ -220,7 +219,7 @@ initializr: - name: Spring Modulith id: modulith bom: spring-modulith - compatibility-range: "3.2.0" + compatibilityRange: "[3.2.0,3.5.0-M1)" group-id: org.springframework.modulith artifact-id: spring-modulith-starter-core description: Support for building modular monolithic applications. @@ -336,7 +335,7 @@ initializr: - web groupId: com.vaadin artifactId: vaadin-spring-boot-starter - description: A web framework that allows you to write UI in pure Java without getting bogged down in JS, HTML, and CSS. + description: The full-stack web app platform for Spring. Build views fully in Java with Flow, or in React using Hilla. bom: vaadin compatibilityRange: "[3.2.0,3.4.0-M1)" links: @@ -345,31 +344,30 @@ initializr: description: Creating CRUD UI with Vaadin - rel: reference href: https://vaadin.com/docs - - name: Hilla - id: hilla - bom: hilla - compatibilityRange: "[3.2.0,3.3.0-M1)" - facets: - - web - groupId: dev.hilla - artifactId: hilla-react-spring-boot-starter - description: An open source framework that integrates a Spring Boot Java backend with a reactive TypeScript frontend. - links: - - rel: guide - href: https://hilla.dev/docs/react/start/quick/#coming-from-spring-initializr - description: Next Steps with Hilla - - rel: reference - href: https://hilla.dev/ - name: Netflix DGS id: netflix-dgs groupId: com.netflix.graphql.dgs artifactId: graphql-dgs-spring-graphql-starter description: Build GraphQL applications with Netflix DGS and Spring for GraphQL. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: netflix-dgs links: - rel: reference href: https://netflix.github.io/dgs/ + - name: htmx + id: htmx + facets: + - web + groupId: io.github.wimdeblauwe + artifactId: htmx-spring-boot + description: Build modern user interfaces with the simplicity and power of hypertext. + compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 3.5.0 + links: + - rel: reference + href: https://github.com/wimdeblauwe/htmx-spring-boot + - rel: guide + href: https://www.youtube.com/watch?v=j-rfPoXe5aE - name: Template Engines content: - name: Thymeleaf @@ -427,7 +425,6 @@ initializr: - name: OAuth2 Authorization Server id: oauth2-authorization-server description: Spring Boot integration for Spring Authorization Server. - compatibilityRange: "3.2.0-RC1" links: - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#web.security.oauth2.authorization-server @@ -445,13 +442,13 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap - name: Okta id: okta - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Okta specific configuration for Spring Security/Spring Boot OAuth2 features. Enable your Spring Boot application to work with Okta via OAuth 2.0/OIDC. groupId: com.okta.spring artifactId: okta-spring-boot-starter mappings: - - compatibilityRange: "[3.2.0,3.3.0-M1)" - version: 3.0.6 + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 3.0.7 links: - rel: guide href: https://github.com/okta/samples-java-spring/tree/master/okta-hosted-login @@ -517,19 +514,19 @@ initializr: description: R2DBC Homepage - name: MyBatis Framework id: mybatis - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis couples objects with stored procedures or SQL statements using a XML descriptor or annotations. + groupId: org.mybatis.spring.boot + artifactId: mybatis-spring-boot-starter + mappings: + - compatibilityRange: "[3.2.0,3.4.0-M1)" + version: 3.0.3 links: - rel: guide href: https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start description: MyBatis Quick Start - rel: reference href: https://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/ - groupId: org.mybatis.spring.boot - artifactId: mybatis-spring-boot-starter - mappings: - - compatibilityRange: "3.2.0" - version: 3.0.3 - name: Liquibase Migration id: liquibase description: Liquibase database migration and source control library. @@ -831,7 +828,7 @@ initializr: - name: Solace PubSub+ bom: solace-spring-boot id: solace - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" description: Connect to a Solace PubSub+ Advanced Event Broker to publish, subscribe, request/reply and store/replay messages groupId: com.solace.spring.boot artifactId: solace-spring-boot-starter @@ -903,12 +900,22 @@ initializr: description: Building a RESTful Web Service with Spring Boot Actuator - rel: reference href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#actuator + - name: CycloneDX SBOM support + id: sbom-cyclone-dx + description: Creates a Software Bill of Materials in CycloneDX format. + groupId: org.springframework.boot + artifactId: spring-boot + starter: false + compatibilityRange: "3.3.0" + links: + - rel: reference + href: https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints.sbom - name: codecentric's Spring Boot Admin (Client) id: codecentric-spring-boot-admin-client groupId: de.codecentric artifactId: spring-boot-admin-starter-client description: Required for your application to register with a Codecentric's Spring Boot Admin Server instance. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -918,7 +925,7 @@ initializr: groupId: de.codecentric artifactId: spring-boot-admin-starter-server description: A community project to manage and monitor your Spring Boot applications. Provides a UI on top of the Spring Boot Actuator endpoints. - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" bom: codecentric-spring-boot-admin links: - rel: reference @@ -1007,16 +1014,9 @@ initializr: - name: Wavefront id: wavefront description: Publish metrics and optionally distributed traces to Tanzu Observability by Wavefront, a SaaS-based metrics monitoring and analytics platform that lets you visualize, query, and alert over data from across your entire stack. - mappings: - - compatibility-range: "[3.2.0, 3.3.0-M1)" - groupId: com.wavefront - artifactId: wavefront-spring-boot-starter - version: 3.2.0 - starter: true - - compatibility-range: "3.3.0-M1" - groupId: io.micrometer - artifactId: micrometer-registry-wavefront - starter: false + groupId: io.micrometer + artifactId: micrometer-registry-wavefront + starter: false - name: Zipkin id: zipkin description: Enable and expose span and trace IDs to Zipkin. @@ -1047,6 +1047,7 @@ initializr: href: https://java.testcontainers.org/ - name: Contract Verifier bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" id: cloud-contract-verifier description: Moves TDD to the level of software architecture by enabling Consumer Driven Contract (CDC) development. groupId: org.springframework.cloud @@ -1057,6 +1058,7 @@ initializr: href: https://cloud.spring.io/spring-cloud-contract/reference/htmlsingle/ - name: Contract Stub Runner bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" id: cloud-contract-stub-runner description: Stub Runner for HTTP/Messaging based communication. Allows creating WireMock stubs from RestDocs tests. groupId: org.springframework.cloud @@ -1077,6 +1079,7 @@ initializr: href: https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/index.html#data.nosql.ldap.embedded - name: Spring Cloud bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Cloud Bootstrap id: cloud-starter @@ -1108,6 +1111,7 @@ initializr: href: https://docs.spring.io/spring-cloud-task/docs/current/reference/html/ - name: Spring Cloud Config bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Config Client id: cloud-config-client @@ -1158,6 +1162,7 @@ initializr: description: Spring Cloud Consul Quick Start - name: Spring Cloud Discovery bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Eureka Discovery Client id: cloud-eureka @@ -1199,12 +1204,12 @@ initializr: href: https://docs.spring.io/spring-cloud-consul/docs/current/reference/html/#spring-cloud-consul-discovery - name: Spring Cloud Routing bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Gateway id: cloud-gateway groupId: org.springframework.cloud artifactId: spring-cloud-starter-gateway-mvc - compatibilityRange: "3.2.0" description: Provides a simple, yet effective way to route to APIs in Servlet-based applications. Provides cross-cutting concerns to those APIs such as security, monitoring/metrics, and resiliency. links: - rel: reference @@ -1246,6 +1251,7 @@ initializr: href: https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer - name: Spring Cloud Circuit Breaker bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Resilience4J id: cloud-resilience4j @@ -1257,6 +1263,7 @@ initializr: href: https://docs.spring.io/spring-cloud-circuitbreaker/docs/current/reference/html/#configuring-resilience4j-circuit-breakers - name: Spring Cloud Messaging bom: spring-cloud + compatibilityRange: "[3.2.0,3.5.0-M1)" content: - name: Cloud Bus id: cloud-bus @@ -1276,7 +1283,7 @@ initializr: href: https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing - name: VMware Tanzu Application Service bom: spring-cloud-services - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Config Client (TAS) id: scs-config-client @@ -1296,7 +1303,7 @@ initializr: href: https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html - name: Microsoft Azure bom: spring-cloud-azure - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Azure Support id: azure-support @@ -1374,7 +1381,7 @@ initializr: description: Azure Storage Sample - name: Google Cloud bom: spring-cloud-gcp - compatibilityRange: "[3.2.0,3.3.0-M1)" + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Google Cloud Support id: cloud-gcp @@ -1409,10 +1416,10 @@ initializr: - rel: guide href: https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample - name: AI + compatibilityRange: "[3.2.0,3.4.0-M1)" content: - name: Azure OpenAI id: spring-ai-azure-openai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-azure-openai-spring-boot-starter description: Spring AI support for Azure’s OpenAI offering, powered by ChatGPT. It extends beyond traditional OpenAI capabilities, delivering AI-driven text generation with enhanced functionality. @@ -1423,9 +1430,8 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/azure-openai-chat.html - name: Azure AI Search id: spring-ai-vectordb-azure - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai - artifact-id: spring-ai-azure-vector-store-spring-boot-starter + artifact-id: spring-ai-azure-store-spring-boot-starter description: Spring AI vector database support for Azure AI Search. It is an AI-powered information retrieval platform and part of Microsoft’s larger AI platform. Among other features, it allows users to query information using vector-based storage and retrieval. bom: spring-ai starter: true @@ -1434,7 +1440,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/azure.html - name: Amazon Bedrock id: spring-ai-bedrock - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-bedrock-ai-spring-boot-starter description: Spring AI support for Amazon Bedrock. It is a managed service that provides foundation models from various AI providers, available through a unified API. @@ -1445,7 +1450,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/bedrock-chat.html - name: Chroma Vector Database id: spring-ai-vectordb-chroma - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-chroma-store-spring-boot-starter description: Spring AI vector database support for Chroma. It is an open-source embedding database and gives you the tools to store document embeddings, content, and metadata. It also allows to search through those embeddings, including metadata filtering. @@ -1456,7 +1460,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/chroma.html - name: Milvus Vector Database id: spring-ai-vectordb-milvus - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-milvus-store-spring-boot-starter description: Spring AI vector database support for Milvus. It is an open-source vector database that has garnered significant attention in the fields of data science and machine learning. One of its standout features lies in its robust support for vector indexing and querying. @@ -1467,7 +1470,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/milvus.html - name: Mistral AI id: spring-ai-mistral - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-mistral-ai-spring-boot-starter description: Spring AI support for Mistral AI, the open and portable generative AI for devs and businesses. @@ -1476,9 +1478,18 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/clients/mistralai-chat.html - - name: Neo4J Vector Database + - name: MongoDB Atlas Vector Database + id: spring-ai-vectordb-mongodb-atlas + group-id: org.springframework.ai + artifact-id: spring-ai-mongodb-atlas-store-spring-boot-starter + description: Spring AI vector database support for MongoDB Atlas. Is is a fully managed cloud database service that provides an easy way to deploy, operate, and scale a MongoDB database in the cloud. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html + - name: Neo4j Vector Database id: spring-ai-vectordb-neo4j - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-neo4j-store-spring-boot-starter description: Spring AI vector database support for Neo4j's Vector Search. It allows users to query vector embeddings from large datasets. @@ -1489,7 +1500,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/neo4j.html - name: Ollama id: spring-ai-ollama - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-ollama-spring-boot-starter description: Spring AI support for Ollama. It allows you to run various Large Language Models (LLMs) locally and generate text from them. @@ -1500,7 +1510,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/ollama-chat.html - name: OpenAI id: spring-ai-openai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-openai-spring-boot-starter description: Spring AI support for ChatGPT, the AI language model and DALL-E, the Image generation model from OpenAI. @@ -1509,9 +1518,18 @@ initializr: links: - rel: reference href: https://docs.spring.io/spring-ai/reference/api/clients/openai-chat.html + - name: Oracle Vector Database + id: spring-ai-vectordb-oracle + group-id: org.springframework.ai + artifact-id: spring-ai-oracle-store-spring-boot-starter + description: Spring AI vector database support for Oracle. Enables storing, indexing and searching vector embeddings in Oracle Database 23ai. + bom: spring-ai + starter: true + links: + - rel: reference + href: https://docs.spring.io/spring-ai/reference/api/vectordbs/oracle.html - name: PGvector Vector Database id: spring-ai-vectordb-pgvector - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pgvector-store-spring-boot-starter description: Spring AI vector database support for PGvector. It is an open-source extension for PostgreSQL that enables storing and searching over machine learning-generated embeddings. @@ -1522,7 +1540,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pgvector.html - name: Pinecone Vector Database id: spring-ai-vectordb-pinecone - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-pinecone-store-spring-boot-starter description: Spring AI vector database support for Pinecone. It is a popular cloud-based vector database and allows you to store and search vectors efficiently. @@ -1533,7 +1550,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/pinecone.html - name: PostgresML id: spring-ai-postgresml - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-postgresml-spring-boot-starter description: Spring AI support for the PostgresML text embeddings models. @@ -1544,9 +1560,8 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/postgresml-embeddings.html - name: Redis Search and Query Vector Database id: spring-ai-vectordb-redis - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai - artifact-id: spring-ai-redis-spring-boot-starter + artifact-id: spring-ai-redis-store-spring-boot-starter description: Spring AI vector database support for Redis Search and Query.It extends the core features of Redis OSS and allows you to use Redis as a vector database. bom: spring-ai starter: true @@ -1555,7 +1570,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/redis.html - name: Stability AI id: spring-ai-stabilityai - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-stability-ai-spring-boot-starter description: Spring AI support for Stability AI's text to image generation model. @@ -1566,7 +1580,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/image/stabilityai-image.html - name: Transformers (ONNX) Embeddings id: spring-ai-transformers - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-transformers-spring-boot-starter description: Spring AI support for pre-trained transformer models, serialized into the Open Neural Network Exchange (ONNX) format. @@ -1577,7 +1590,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/embeddings/onnx.html - name: Vertex AI PaLM2 id: spring-ai-vertexai-palm2 - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-palm2-spring-boot-starter description: Spring AI support for Google Vertex PaLM2 chat and embedding models. @@ -1588,7 +1600,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-palm2-chat.html - name: Vertex AI Gemini id: spring-ai-vertexai-gemini - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-vertex-ai-gemini-spring-boot-starter description: Spring AI support for Google Vertex Gemini chat. @@ -1599,7 +1610,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/clients/vertexai-gemini-chat.html - name: Qdrant Vector Database id: spring-ai-vectordb-qdrant - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-qdrant-store-spring-boot-starter description: Spring AI vector database support for Qdrant. It is an open-source, high-performance vector search engine/database. @@ -1610,7 +1620,6 @@ initializr: href: https://docs.spring.io/spring-ai/reference/api/vectordbs/qdrant.html - name: Weaviate Vector Database id: spring-ai-vectordb-weaviate - compatibility-range: "[3.2.0,3.3.0-M1)" group-id: org.springframework.ai artifact-id: spring-ai-weaviate-store-spring-boot-starter description: Spring AI vector database support for Weaviate, an open-source vector database. It allows you to store data objects and vector embeddings from your favorite ML-models and scale seamlessly into billions of data objects. diff --git a/start-site/src/main/resources/templates/graalvm.mustache b/start-site/src/main/resources/templates/graalvm.mustache index 9bda7dfc548..ff92955d5bb 100644 --- a/start-site/src/main/resources/templates/graalvm.mustache +++ b/start-site/src/main/resources/templates/graalvm.mustache @@ -44,3 +44,12 @@ To run your existing tests in a native image, run the following goal: ``` $ {{testsExecutionCommand}} ``` + +{{#gradleBuild}} +### Gradle Toolchain support + +There are some limitations regarding Native Build Tools and Gradle toolchains. +Native Build Tools disable toolchain support by default. +Effectively, native image compilation is done with the JDK used to execute Gradle. +You can read more about [toolchain support in the Native Build Tools here](https://graalvm.github.io/native-build-tools/latest/gradle-plugin.html#configuration-toolchains). +{{/gradleBuild}} diff --git a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java index e4c3d219f1c..314484e5828 100644 --- a/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java +++ b/start-site/src/test/java/io/spring/start/site/ProjectGenerationIntegrationTests.java @@ -17,17 +17,11 @@ package io.spring.start.site; import java.io.IOException; -import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Queue; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Stream; import io.spring.initializr.generator.buildsystem.BuildSystem; @@ -48,7 +42,8 @@ import io.spring.initializr.web.project.ProjectGenerationInvoker; import io.spring.initializr.web.project.ProjectRequest; import io.spring.initializr.web.project.WebProjectRequest; -import io.spring.start.site.test.TemporaryFiles; +import io.spring.start.testsupport.Homes; +import io.spring.start.testsupport.TemporaryFiles; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.parallel.Execution; @@ -61,7 +56,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.ActiveProfiles; -import org.springframework.util.Assert; import static org.assertj.core.api.Assertions.assertThat; @@ -78,10 +72,6 @@ @Execution(ExecutionMode.CONCURRENT) class ProjectGenerationIntegrationTests { - private static final Homes mavenHomes = new Homes("maven-home"); - - private static final Homes gradleHomes = new Homes("gradle-home"); - private final ProjectGenerationInvoker invoker; private final InitializrMetadata metadata; @@ -157,16 +147,16 @@ void projectBuilds(Version bootVersion, Packaging packaging, Language language, private Path acquireHome(BuildSystem buildSystem) { return switch (buildSystem.id()) { - case MavenBuildSystem.ID -> mavenHomes.acquire(); - case GradleBuildSystem.ID -> gradleHomes.acquire(); + case MavenBuildSystem.ID -> Homes.MAVEN.acquire(); + case GradleBuildSystem.ID -> Homes.GRADLE.acquire(); default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); }; } private void releaseHome(BuildSystem buildSystem, Path home) { switch (buildSystem.id()) { - case MavenBuildSystem.ID -> mavenHomes.release(home); - case GradleBuildSystem.ID -> gradleHomes.release(home); + case MavenBuildSystem.ID -> Homes.MAVEN.release(home); + case GradleBuildSystem.ID -> Homes.GRADLE.release(home); default -> throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); } } @@ -186,47 +176,4 @@ private ProcessBuilder createProcessBuilder(BuildSystem buildSystem, Path home) throw new IllegalStateException("Unknown build system '%s'".formatted(buildSystem.id())); } - private static final class Homes { - - private final Set homes = ConcurrentHashMap.newKeySet(); - - private final Queue freeHomes = new ConcurrentLinkedQueue<>(); - - private final AtomicInteger counter = new AtomicInteger(); - - private final String prefix; - - private Homes(String prefix) { - this.prefix = prefix; - } - - Path acquire() { - Path home = this.freeHomes.poll(); - if (home == null) { - home = createTempDirectory(); - this.homes.add(home); - } - return home; - } - - void release(Path home) { - Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); - this.freeHomes.add(home); - } - - private Path createTempDirectory() { - try { - Path path = TemporaryFiles.getTempDir() - .resolve("homes") - .resolve(this.prefix + "-" + this.counter.getAndIncrement()); - Files.createDirectories(path); - return path; - } - catch (IOException ex) { - throw new UncheckedIOException("Failed to create temp directory", ex); - } - } - - } - } diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java index cefd3029969..fe8970a452d 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/gradle/GradleBuildSystemHelpDocumentCustomizerTests.java @@ -28,9 +28,12 @@ * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class GradleBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test @@ -38,16 +41,22 @@ void linksAddedToHelpDocumentForGradleBuild() { assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/#build-image)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/gradle-plugin/packaging-oci-image.html)"); } @Test - void linksNotAddedToHelpDocumentForMavenBuild() { - assertHelpDocument("maven-build", SPRING_BOOT_VERSION).doesNotContain( + void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { + assertHelpDocument("gradle-build", OLD_SPRING_BOOT_VERSION).contains( "* [Official Gradle documentation](https://docs.gradle.org)", "* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle)", - "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/gradle-plugin/reference/html/)"); + "* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/gradle-plugin/reference/html/#build-image)"); + } + + @Test + void linksNotAddedToHelpDocumentForMavenBuild() { + assertHelpDocument("maven-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Gradle")); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java index 56a17532e5c..c430cb05b63 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/build/maven/MavenBuildSystemHelpDocumentCustomizerTests.java @@ -28,24 +28,33 @@ * * @author Jenn Strater * @author Andy Wilkinson + * @author Moritz Halbritter */ class MavenBuildSystemHelpDocumentCustomizerTests extends AbstractExtensionTests { private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + @Test void linksAddedToHelpDocumentForMavenBuild() { assertHelpDocument("maven-build", SPRING_BOOT_VERSION).contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/)", - "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/reference/html/#build-image)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/3.3.0/maven-plugin)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/3.3.0/maven-plugin/build-image.html)"); } @Test - void linksNotAddedToHelpDocumentForGradleBuild() { - assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).doesNotContain( + void linksAddedToHelpDocumentForMavenBuildWithOldSpringBootVersion() { + assertHelpDocument("maven-build", OLD_SPRING_BOOT_VERSION).contains( "* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)", - "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.3.0/maven-plugin/)"); + "* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/)", + "* [Create an OCI image](https://docs.spring.io/spring-boot/docs/3.2.0/maven-plugin/reference/html/#build-image)"); + } + + @Test + void linksNotAddedToHelpDocumentForGradleBuild() { + assertHelpDocument("gradle-build", SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Maven")); } private ListAssert assertHelpDocument(String type, String version) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java new file mode 100644 index 00000000000..0dd86da5b96 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsBuildCustomizerTests.java @@ -0,0 +1,47 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.dgs; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class DgsBuildCustomizerTests extends AbstractExtensionTests { + + private Dependency dgsTest; + + @BeforeEach + void setup() { + this.dgsTest = Dependency.withId("graphql-dgs-spring-graphql-starter-test", "com.netflix.graphql.dgs", + "graphql-dgs-spring-graphql-starter-test"); + this.dgsTest.setScope(Dependency.SCOPE_TEST); + } + + @Test + void shouldAddTestingDependency() { + ProjectRequest request = createProjectRequest("web", "netflix-dgs"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("web")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(this.dgsTest) + .hasDependenciesSize(4); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java index 538c2a573f4..cda1a9a94f4 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/dgs/DgsCodegenProjectGenerationConfigurationTests.java @@ -89,7 +89,7 @@ void mavenBuildConfiguresCodegenPlugin() { " ", " io.github.deweyjose", " graphqlcodegen-maven-plugin", - " 1.50", + " 1.61.5", " ", " ", " dgs-codegen", diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java index ceaad5ab429..0ec9c9e0409 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmHelpDocumentCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,16 +38,32 @@ * Tests for {@link GraalVmHelpDocumentCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class GraalVmHelpDocumentCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + @Autowired private MustacheTemplateRenderer templateRenderer; @Test void mavenBuildAddLinkToMavenAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + HelpDocument document = customize(description, new MavenBuild()); + assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { + assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); + }); + } + + @Test + void mavenBuildAddLinkToMavenAotPluginWithOldSpringBootVersion() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); HelpDocument document = customize(description, new MavenBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); @@ -59,7 +75,18 @@ void mavenBuildAddLinkToMavenAotPlugin() { @Test void gradleBuildAddLinkToGradleAotPlugin() { MutableProjectDescription description = new MutableProjectDescription(); - description.setPlatformVersion(Version.parse("3.2.0")); + description.setPlatformVersion(Version.parse(SPRING_BOOT_VERSION)); + HelpDocument document = customize(description, new GradleBuild()); + assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { + assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); + assertThat(link.getHref()).isEqualTo("https://docs.spring.io/spring-boot/3.3.0/how-to/aot.html"); + }); + } + + @Test + void gradleBuildAddLinkToGradleAotPluginWithOldSpringBootVersion() { + MutableProjectDescription description = new MutableProjectDescription(); + description.setPlatformVersion(Version.parse(OLD_SPRING_BOOT_VERSION)); HelpDocument document = customize(description, new GradleBuild()); assertThat(document.gettingStarted().additionalLinks().getItems()).singleElement().satisfies((link) -> { assertThat(link.getDescription()).isEqualTo("Configure AOT settings in Build Plugin"); @@ -102,6 +129,22 @@ void nativeSectionWithWebExposesPort() { assertHelpDocument(request).contains("$ docker run --rm -p 8080:8080 another-project:2.0.0-SNAPSHOT"); } + @Test + void shouldDocumentGradleToolchainLimitations() { + ProjectRequest request = createProjectRequest("native"); + request.setType("gradle-project"); + assertHelpDocument(request) + .contains("There are some limitations regarding Native Build Tools and Gradle toolchains."); + } + + @Test + void shouldNotDocumentGradleToolchainLimitationsWhenUsingMaven() { + ProjectRequest request = createProjectRequest("native"); + request.setType("maven-project"); + assertHelpDocument(request) + .doesNotContain("There are some limitations regarding Native Build Tools and Gradle toolchains."); + } + private TextAssert assertHelpDocument(ProjectRequest request) { ProjectStructure project = generateProject(request); return new TextAssert(project.getProjectDirectory().resolve("HELP.md")); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java index f4044405954..535210101c6 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/GraalVmProjectGenerationConfigurationTests.java @@ -94,7 +94,7 @@ void gradleBuildAndKotlinDslWithJpaConfiguresHibernateEnhancePlugin() { // @formatter:off "hibernate {", " enhancement {", - " enableAssociationManagement.set(true)", + " enableAssociationManagement = true", " }", "}"); // @formatter:on diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java similarity index 84% rename from start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java rename to start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java index b52ac3b86d3..431efea4455 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginKotlinDslGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,15 +25,15 @@ import static org.assertj.core.api.Assertions.assertThat; /** - * Tests for {@link HibernatePluginKotlinDslGradleBuildCustomizer}. + * Tests for {@link HibernatePluginGradleBuildCustomizer}. * * @author Stephane Nicoll */ -class HibernatePluginKotlinDslGradleBuildCustomizerTests { +class HibernatePluginGradleBuildCustomizerTests { @Test void customizerAppliesHibernateEnhancePlugin() { - HibernatePluginKotlinDslGradleBuildCustomizer customizer = new HibernatePluginKotlinDslGradleBuildCustomizer( + HibernatePluginGradleBuildCustomizer customizer = new HibernatePluginGradleBuildCustomizer( Version.parse("6.1.0.Final")); GradleBuild build = new GradleBuild(); customizer.customize(build); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java deleted file mode 100644 index 61d7007e4e4..00000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/graalvm/HibernatePluginGroovyDslGradleBuildCustomizerTests.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.graalvm; - -import io.spring.initializr.generator.buildsystem.gradle.GradleBuild; -import io.spring.initializr.generator.buildsystem.gradle.GradlePlugin; -import io.spring.initializr.generator.buildsystem.gradle.StandardGradlePlugin; -import io.spring.initializr.generator.version.Version; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HibernatePluginGroovyDslGradleBuildCustomizer}. - * - * @author Stephane Nicoll - */ -class HibernatePluginGroovyDslGradleBuildCustomizerTests { - - @Test - void customizerAppliesHibernateEnhancePlugin() { - HibernatePluginGroovyDslGradleBuildCustomizer customizer = new HibernatePluginGroovyDslGradleBuildCustomizer( - Version.parse("6.1.0.Final")); - GradleBuild build = new GradleBuild(); - customizer.customize(build); - GradlePlugin hibernatePlugin = build.plugins() - .values() - .filter((plugin) -> plugin.getId().equals("org.hibernate.orm")) - .findAny() - .orElse(null); - assertThat(hibernatePlugin).isNotNull(); - assertThat(hibernatePlugin).isInstanceOf(StandardGradlePlugin.class) - .satisfies((plugin) -> assertThat(((StandardGradlePlugin) plugin).getVersion()).isEqualTo("6.1.0.Final")); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java deleted file mode 100644 index e28c24445b1..00000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/hilla/HillaProjectGenerationConfigurationTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012-2023 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.hilla; - -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.junit.jupiter.api.Test; - -import org.springframework.core.io.ClassPathResource; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for {@link HillaProjectGenerationConfiguration}. - * - * @author Stephane Nicoll - */ -class HillaProjectGenerationConfigurationTests extends AbstractExtensionTests { - - private static final String SPRING_BOOT_VERSION = "3.2.0"; - - @Test - void mavenBuildWithHillaAddProductionProfile() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).hasProfile("production") - .contains(new ClassPathResource("dependency/hilla/hilla-maven-profile.xml")); - } - - @Test - void mavenBuildWithoutHillaDoesNotAddProductionProfile() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).doesNotContain("hilla"); - } - - @Test - void gradleBuildWithHillaConfigurePlugin() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(gradleBuild(request)).hasPlugin("dev.hilla"); - } - - @Test - void gradleBuildWithHillaConfigureTask() { - ProjectRequest request = createProjectRequest("data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(gradleBuild(request)).doesNotContain("hilla"); - } - - @Test - void projectWithHillaCustomizesGitIgnore() { - ProjectRequest request = createProjectRequest("hilla", "data-jpa"); - request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(generateProject(request)).textFile(".gitignore").contains("node_modules/", "frontend/generated/"); - } - - @Test - void projectWithoutHillaDoesNotCustomizeGitIgnore() { - assertThat(generateProject(createProjectRequest("data-jpa"))).textFile(".gitignore") - .doesNotContain("frontend/generated/"); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java new file mode 100644 index 00000000000..ada2bc088de --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/htmx/HtmxBuildCustomizerTests.java @@ -0,0 +1,60 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.htmx; + +import io.spring.initializr.metadata.Dependency; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link HtmxBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class HtmxBuildCustomizerTests extends AbstractExtensionTests { + + private final Dependency htmx = Dependency.withId("htmx", "io.github.wimdeblauwe", "htmx-spring-boot"); + + private final Dependency htmxThymeleaf = Dependency.withId("htmx", "io.github.wimdeblauwe", + "htmx-spring-boot-thymeleaf"); + + @Test + void shouldUseHtmxThymleafIfThymeleafIsSelected() { + ProjectRequest request = createProjectRequest("htmx", "thymeleaf"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .hasDependency(this.htmxThymeleaf); + } + + @Test + void shouldUsePlainHtmxIfThymeleafIsNotSelected() { + ProjectRequest request = createProjectRequest("htmx"); + assertThat(mavenPom(request)) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()) + .hasDependency(this.htmx); + } + + @Test + void shouldNotAddHtmx() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotHaveDependency(this.htmx.getGroupId(), this.htmx.getArtifactId()) + .doesNotHaveDependency(this.htmxThymeleaf.getGroupId(), this.htmxThymeleaf.getArtifactId()); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java index 31e04066a56..c25c843f853 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/mybatis/MyBatisTestBuildCustomizerTests.java @@ -30,7 +30,7 @@ */ class MyBatisTestBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void mybatisIsAddedWithSecurity() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java new file mode 100644 index 00000000000..9b1dae50d95 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/ObservabilityHelpDocumentCustomizerTests.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.observability; + +import io.spring.initializr.generator.test.io.TextAssert; +import io.spring.initializr.generator.test.project.ProjectStructure; +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.assertj.core.api.ListAssert; +import org.junit.jupiter.api.Test; + +/** + * Tests for {@link ObservabilityHelpDocumentCustomizer}. + * + * @author Moritz Halbritter + */ +class ObservabilityHelpDocumentCustomizerTests extends AbstractExtensionTests { + + private static final String OLD_SPRING_BOOT_VERSION = "3.2.0"; + + private static final String SPRING_BOOT_VERSION = "3.3.0"; + + @Test + void linksAddedToHelpDocumentForGradleBuild() { + assertHelpDocument(SPRING_BOOT_VERSION, "distributed-tracing").contains( + "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/3.3.0/reference/actuator/tracing.html)"); + } + + @Test + void linksAddedToHelpDocumentForGradleBuildWithOldSpringBootVersion() { + assertHelpDocument(OLD_SPRING_BOOT_VERSION, "distributed-tracing").contains( + "* [Distributed Tracing Reference Guide](https://docs.micrometer.io/tracing/reference/index.html)", + "* [Getting Started with Distributed Tracing](https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/actuator.html#actuator.micrometer-tracing.getting-started)"); + } + + @Test + void linksNotAddedToHelpDocumentForBuildWithoutTracing() { + assertHelpDocument(SPRING_BOOT_VERSION).noneMatch((line) -> line.contains("Tracing")); + } + + private ListAssert assertHelpDocument(String version, String... dependencies) { + ProjectRequest request = createProjectRequest(dependencies); + request.setType("gradle-build"); + request.setBootVersion(version); + ProjectStructure project = generateProject(request); + return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java deleted file mode 100644 index e2721825666..00000000000 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/observability/WavefrontHelpDocumentCustomizerTests.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright 2012-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.spring.start.site.extension.dependency.observability; - -import io.spring.initializr.generator.test.io.TextAssert; -import io.spring.initializr.generator.test.project.ProjectStructure; -import io.spring.initializr.web.project.ProjectRequest; -import io.spring.start.site.extension.AbstractExtensionTests; -import org.assertj.core.api.ListAssert; -import org.junit.jupiter.api.Test; - -/** - * Tests for {@link WavefrontHelpDocumentCustomizer}. - * - * @author Stephane Nicoll - * @author Brian Clozel - */ -class WavefrontHelpDocumentCustomizerTests extends AbstractExtensionTests { - - @Test - void wavefrontAddGeneralSection() { - assertHelpDocument("3.2.0", "wavefront").contains("## Observability with Wavefront", "", - "If you don't have a Wavefront account, the starter will create a freemium account for you.", - "The URL to access the Wavefront Service dashboard is logged on startup."); - } - - @Test - void wavefrontWithoutWebApplicationDoesNotAddActuatorSection() { - assertHelpDocument("3.2.0", "wavefront") - .doesNotContain("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithWebApplicationAddActuatorSection() { - assertHelpDocument("3.2.0", "wavefront", "web") - .contains("You can also access your dashboard using the `/actuator/wavefront` endpoint."); - } - - @Test - void wavefrontWithoutDistributedTracingAddTracingNote() { - assertHelpDocument("3.2.0", "wavefront") - .contains("Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void wavefrontWithDistributedTracingDoesNotAddTracingNote() { - assertHelpDocument("3.2.0", "wavefront", "distributed-tracing").doesNotContain( - "Finally, you can opt-in for distributed tracing by adding the 'Distributed Tracing' entry."); - } - - @Test - void springBoot3xWavefrontReference() { - assertHelpDocument("3.2.0", "wavefront").contains( - "* [Wavefront for Spring Boot documentation](https://docs.wavefront.com/wavefront_springboot3.html)"); - } - - private ListAssert assertHelpDocument(String version, String... dependencies) { - ProjectRequest request = createProjectRequest(dependencies); - request.setBootVersion(version); - ProjectStructure project = generateProject(request); - return new TextAssert(project.getProjectDirectory().resolve("HELP.md")).lines(); - } - -} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java index 5fe3cdec208..921908539bf 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/okta/OktaHelpDocumentCustomizerTests.java @@ -29,7 +29,7 @@ */ class OktaHelpDocumentCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void oktaSectionWithOktaDependencyIsPresent() { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java index 4531d3e4c8e..a1793037343 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/oracle/OracleProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ void declaresOracleFreeContainerBeanWithBoot32() { ProjectRequest request = createProjectRequest("testcontainers", "oracle"); request.setBootVersion(SPRING_BOOT_VERSION); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .contains("import org.testcontainers.oracle.OracleContainer;") .contains(" return new OracleContainer(DockerImageName.parse(\"gvenzl/oracle-free:latest\"));"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java new file mode 100644 index 00000000000..89bfe1eb4ac --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/sbom/SbomProjectGenerationConfigurationTests.java @@ -0,0 +1,70 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.sbom; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link SbomProjectGenerationConfiguration}. + * + * @author Moritz Halbritter + */ +class SbomProjectGenerationConfigurationTests extends AbstractExtensionTests { + + @Test + void shouldNotAddGradlePluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(gradleBuild(request)).doesNotContain("org.cyclonedx.bom"); + } + + @Test + void shouldNotAddMavenPluginIfSbomIsNotSelected() { + ProjectRequest request = createProjectRequest("web"); + assertThat(mavenPom(request)).doesNotContain("cyclonedx-maven-plugin"); + } + + @Test + void shouldRemoveArtificalDependency() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).doesNotHaveDependency("org.springframework.boot", "spring-boot"); + assertThat(gradleBuild(request)).doesNotContain("'org.springframework.boot:spring-boot'"); + } + + @Test + void shouldAddMavenPlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(mavenPom(request)).lines().containsSequence( + // @formatter:off + " ", + " org.cyclonedx", + " cyclonedx-maven-plugin", + " " + // @formatter:on + ); + } + + @Test + void shouldAddGradlePlugin() { + ProjectRequest request = createProjectRequest("sbom-cyclone-dx"); + assertThat(gradleBuild(request)).hasPlugin("org.cyclonedx.bom", "1.10.0"); + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java index decdbcb3c85..6179c263ddb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/solace/SolaceBinderBuildCustomizerTests.java @@ -35,7 +35,9 @@ class SolaceBinderBuildCustomizerTests extends AbstractExtensionTests { @Test void binderNotAddedWhenSolaceNotSelected() { - ProjectStructure project = generateProject(createProjectRequest("cloud-stream")); + ProjectRequest request = createProjectRequest("cloud-stream"); + request.setBootVersion(BOOT_VERSION); + ProjectStructure project = generateProject(request); assertNoBinder(project); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java index 17edd1cbe2d..4590531a982 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springazure/SpringAzureProjectGenerationConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ */ class SpringAzureProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @ParameterizedTest @MethodSource("azureDependencies") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java index 0aeb6e74fec..b9ffe3178cd 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudCircuitBreakerBuildCustomizerTests.java @@ -30,12 +30,15 @@ */ class SpringCloudCircuitBreakerBuildCustomizerTests extends AbstractExtensionTests { - static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", + private static final String SPRING_BOOT_VERSION = "3.3.0"; + + private static final Dependency REACTIVE_CLOUD_CIRCUIT_BREAKER = Dependency.withId("cloud-resilience4j-reactive", "org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j"); @Test void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() { ProjectRequest request = createProjectRequest("webflux", "cloud-resilience4j"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(REACTIVE_CLOUD_CIRCUIT_BREAKER) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-resilience4j") @@ -46,6 +49,7 @@ void replacesCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetPresent() @Test void doesNotReplaceCircuitBreakerWithReactiveCircuitBreakerWhenReactiveFacetNotPresent() { ProjectRequest request = createProjectRequest("cloud-resilience4j"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-resilience4j")) .doesNotHaveDependency("org.springframework.cloud", "spring-cloud-starter-circuitbreaker-reactor-resilience4j") diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java index dcd71a87ae2..de74a948eb8 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractConfigurationTests.java @@ -31,9 +31,12 @@ */ class SpringCloudContractConfigurationTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).exists().isDirectory(); @@ -42,6 +45,7 @@ void contractsDirectoryWithMavenIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/test/resources/contracts")).doesNotExist(); @@ -50,6 +54,7 @@ void contractsDirectoryWithMavenIsNotCreatedIfSpringCloudContractVerifierIsNotRe @Test void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { ProjectRequest request = createProjectRequest("web", "cloud-contract-verifier"); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).exists() @@ -59,6 +64,7 @@ void contractsDirectoryWithGradleIsCreatedWithSpringCloudContractVerifier() { @Test void contractsDirectoryWithGradleIsNotCreatedIfSpringCloudContractVerifierIsNotRequested() { ProjectRequest request = createProjectRequest("web"); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-project"); ProjectStructure structure = generateProject(request); assertThat(structure.getProjectDirectory().resolve("src/contractTest/resources/contracts")).doesNotExist(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java index ad6ae59982f..3e87a7d55aa 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractGradleBuildCustomizerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2023 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,43 +31,50 @@ */ class SpringCloudContractGradleBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(gradleBuild(projectRequest)).contains("id 'org.springframework.cloud.contract' version '"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleBuild(request)).contains("id 'org.springframework.cloud.contract' version '"); } @Test void springCloudContractVerifierPluginNotAddedWhenSCCDependencyAbsent() { - ProjectRequest projectRequest = createProjectRequest(); - assertThat(gradleBuild(projectRequest)).doesNotContain("org.springframework.cloud.contract"); + ProjectRequest request = createProjectRequest(); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleBuild(request)).doesNotContain("org.springframework.cloud.contract"); } @Test void springCloudContractVerifierPluginContractTestWithJUnit5ByDefault() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("tasks.named('contractTest') {", - "useJUnitPlatform()"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleBuild(request)).containsSubsequence("tasks.named('contractTest') {", "useJUnitPlatform()"); } @Test void springCloudContractVerifierPluginWithGroovyDslAndWithTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleBuild(request)).containsSubsequence("contracts {", "testMode = 'WebTestClient'"); } @Test void springCloudContractVerifierPluginWithKotlinDslAndTestModeSetWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleKotlinDslBuild(projectRequest)) + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleKotlinDslBuild(request)) .contains("import org.springframework.cloud.contract.verifier.config.TestMode") - .containsSubsequence("contracts {", "testMode.set(TestMode.WEBTESTCLIENT)"); + .containsSubsequence("contracts {", "testMode = TestMode.WEBTESTCLIENT"); } @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); - assertThat(gradleBuild(projectRequest)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(SPRING_BOOT_VERSION); + assertThat(gradleBuild(request)).contains("testImplementation 'io.rest-assured:spring-web-test-client'"); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java index c847cc03d16..3b54637905e 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudContractMavenBuildCustomizerTests.java @@ -32,7 +32,7 @@ */ class SpringCloudContractMavenBuildCustomizerTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void springCloudContractVerifierPluginAddedWhenSCCDependencyPresent() { @@ -70,11 +70,12 @@ void springCloudContractVerifierPluginWithTestModeSetWhenWebFluxIsPresent() { @Test void springWebTestClientDependencyAddedWhenWebFluxIsPresent() { - ProjectRequest projectRequest = createProjectRequest("cloud-contract-verifier", "webflux"); + ProjectRequest request = createProjectRequest("cloud-contract-verifier", "webflux"); + request.setBootVersion(SPRING_BOOT_VERSION); Dependency springWebTestClientDep = Dependency.withId("rest-assured-spring-web-test-client", "io.rest-assured", "spring-web-test-client"); springWebTestClientDep.setScope(Dependency.SCOPE_TEST); - assertThat(mavenPom(projectRequest)).hasDependency(springWebTestClientDep); + assertThat(mavenPom(request)).hasDependency(springWebTestClientDep); } } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java index 8ca22758b4c..cdb9c9a60a9 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionBuildCustomizerTests.java @@ -32,12 +32,15 @@ */ class SpringCloudFunctionBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + static final Dependency WEB_ADAPTER = Dependency.withId("cloud-function-web", "org.springframework.cloud", "spring-cloud-function-web"); @Test void functionOnly() { ProjectRequest request = createProjectRequest("cloud-function"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-function")) .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) .hasDependency(Dependency.createSpringBootStarter("")) @@ -49,6 +52,7 @@ void functionOnly() { @Test void web() { ProjectRequest request = createProjectRequest("web", "cloud-function"); + request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("web")) .hasDependency(WEB_ADAPTER) @@ -61,6 +65,7 @@ void web() { @Test void webflux() { ProjectRequest request = createProjectRequest("webflux", "cloud-function"); + request.setBootVersion(SPRING_BOOT_VERSION); BillOfMaterials bom = getBom("spring-cloud", request.getBootVersion()); assertThat(mavenPom(request)).hasDependency(getDependency("webflux")) .hasDependency(WEB_ADAPTER) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java index 305a26645e2..54c63382e14 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudFunctionHelpDocumentCustomizerTests.java @@ -33,12 +33,12 @@ class SpringCloudFunctionHelpDocumentCustomizerTests extends AbstractExtensionTe private static final String AZURE_SECTION_TITLE = "## Running Spring Cloud Function applications on Microsoft Azure"; - private static final String BOOT_VERSION = "3.2.6"; + private static final String SPRING_BOOT_VERSION = "3.2.0"; @Test void functionBuildSetupInfoSectionAddedForMaven() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("maven-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); @@ -47,7 +47,7 @@ void functionBuildSetupInfoSectionAddedForMaven() { @Test void functionBuildSetupInfoSectionAddedForGradle() { ProjectRequest request = createProjectRequest(); - request.setBootVersion(BOOT_VERSION); + request.setBootVersion(SPRING_BOOT_VERSION); request.setType("gradle-build"); request.setDependencies(Arrays.asList("cloud-function", "azure-support")); assertThat(generateProject(request)).textFile("HELP.md").contains(AZURE_SECTION_TITLE); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java index 65af47a8182..715243845ff 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springcloud/SpringCloudStreamBuildCustomizerTests.java @@ -32,6 +32,8 @@ */ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { + private static final String SPRING_BOOT_VERSION = "3.3.0"; + private static final Dependency KAFKA_BINDER = Dependency.withId("cloud-stream-binder-kafka", "org.springframework.cloud", "spring-cloud-stream-binder-kafka"); @@ -50,6 +52,7 @@ class SpringCloudStreamBuildCustomizerTests extends AbstractExtensionTests { @Test void springCloudStreamWithRabbit() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -61,6 +64,7 @@ void springCloudStreamWithRabbit() { @Test void springCloudStreamWithKafka() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka")) .hasDependency(KAFKA_BINDER) @@ -72,6 +76,7 @@ void springCloudStreamWithKafka() { @Test void springCloudStreamWithKafkaStreams() { ProjectRequest request = createProjectRequest("cloud-stream", "kafka-streams"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("kafka-streams")) .hasDependency(KAFKA_STREAMS_BINDER) @@ -83,7 +88,7 @@ void springCloudStreamWithKafkaStreams() { @Test void springCloudStreamWithPulsar() { ProjectRequest request = createProjectRequest("cloud-stream", "pulsar"); - request.setBootVersion("3.2.0"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("pulsar")) .hasDependency(PULSAR_BINDER) @@ -93,6 +98,7 @@ void springCloudStreamWithPulsar() { @Test void springCloudStreamWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-stream", "amqp", "kafka", "kafka-streams"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-stream")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) @@ -108,6 +114,7 @@ void springCloudStreamWithAllBinders() { @Test void springCloudBusWithRabbit() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -118,6 +125,7 @@ void springCloudBusWithRabbit() { @Test void springCloudBusWithKafka() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(RABBIT_BINDER) @@ -128,6 +136,7 @@ void springCloudBusWithKafka() { @Test void springCloudBusWithAllBinders() { ProjectRequest request = createProjectRequest("cloud-bus", "amqp", "kafka", "kafka-streams"); + request.setBootVersion(SPRING_BOOT_VERSION); assertThat(mavenPom(request)).hasDependency(getDependency("cloud-bus")) .hasDependency(getDependency("amqp")) .hasDependency(getDependency("kafka")) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java index e1ea2dd8d09..81ac376dfbe 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springmodulith/SpringModulithBuildCustomizerTests.java @@ -40,9 +40,10 @@ class SpringModulithBuildCustomizerTests extends AbstractExtensionTests { private final SpringModulithBuildCustomizer customizer = new SpringModulithBuildCustomizer(); @Test - void registersTestStarterWhenModulithIsSelected() { + void registersTestAndCoreStarterWhenModulithIsSelected() { Build build = createBuild("modulith"); this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith"); assertThat(build.dependencies().ids()).contains("modulith-starter-test"); } @@ -70,6 +71,25 @@ void presenceOfSpringDataModuleAddsModuleEventStarter(String store) { build.dependencies().add("data-" + store); this.customizer.customize(build); assertThat(build.dependencies().ids()).contains("modulith-starter-" + store); + assertThat(build.dependencies().ids()).doesNotContain("modulith-starter-core"); + } + + @ParameterizedTest + @ValueSource(strings = { "amqp", "kafka" }) + void addsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-" + broker); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); + } + + @ParameterizedTest + @ValueSource(strings = { "activemq", "artemis" }) + void addsJmsExternalizationDependency(String broker) { + Build build = createBuild("modulith", broker); + this.customizer.customize(build); + assertThat(build.dependencies().ids()).contains("modulith-events-jms"); + assertThat(build.dependencies().ids()).contains("modulith-events-api"); } private Build createBuild(String... dependencies) { diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java index 56263f84d2a..a0fbf82ced0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleGroovyBuildCustomizerTests.java @@ -35,6 +35,7 @@ class SpringRestDocsGradleGroovyBuildCustomizerTests { private final SpringRestDocsGradleGroovyBuildCustomizer customizer = new SpringRestDocsGradleGroovyBuildCustomizer(); @Test + @SuppressWarnings("removal") void customizesGradleBuild() { GradleBuild build = new GradleBuild(); this.customizer.customize(build); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java index 743c07652b0..42a7917e630 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springrestdocs/SpringRestDocsGradleKotlinBuildCustomizerTests.java @@ -30,6 +30,7 @@ * * @author Moritz Halbritter */ +@SuppressWarnings("removal") class SpringRestDocsGradleKotlinBuildCustomizerTests { private final SpringRestDocsGradleKotlinBuildCustomizer customizer = new SpringRestDocsGradleKotlinBuildCustomizer(); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java index 4f705726525..1f9f392ff1f 100755 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/springsecurity/SpringSecurityTestBuildCustomizerTests.java @@ -27,6 +27,7 @@ * Tests for {@link SpringSecurityTestBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class SpringSecurityTestBuildCustomizerTests extends AbstractExtensionTests { @@ -39,6 +40,15 @@ void securityTestIsAddedWithSecurity() { .hasDependenciesSize(3); } + @Test + void securityTestIsAddedWithOAuth2Client() { + ProjectRequest request = createProjectRequest("oauth2-client"); + assertThat(mavenPom(request)).hasDependency(Dependency.createSpringBootStarter("oauth2-client")) + .hasDependency(Dependency.createSpringBootStarter("test", Dependency.SCOPE_TEST)) + .hasDependency(springSecurityTest()) + .hasDependenciesSize(3); + } + @Test void securityTestIsNotAddedWithoutSpringSecurity() { ProjectRequest request = createProjectRequest("web"); diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java index fc29d6af52f..fe4ce4cfedb 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/testcontainers/TestcontainersProjectGenerationConfigurationTests.java @@ -187,11 +187,11 @@ void testApplicationWithGroovyAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") + assertThat(generateProject(request)) + .textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") .isEqualTo(""" package com.example.demo - import org.springframework.boot.SpringApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean @@ -199,7 +199,7 @@ void testApplicationWithGroovyAndGenericContainerIsContributed() { import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -207,10 +207,6 @@ GenericContainer redisContainer() { new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379) } - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) - } - } """); } @@ -220,11 +216,10 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .isEqualTo(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; @@ -232,7 +227,7 @@ void testApplicationWithJavaAndGenericContainerIsContributed() { import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -240,10 +235,6 @@ GenericContainer redisContainer() { return new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379); } - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); - } - } """); } @@ -253,20 +244,18 @@ void testApplicationWithKotlinAndGenericContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-redis"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") .isEqualTo(""" package com.example.demo - import org.springframework.boot.fromApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.GenericContainer import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection(name = "redis") @@ -275,10 +264,6 @@ fun redisContainer(): GenericContainer<*> { } } - - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) - } """); } @@ -287,11 +272,25 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("groovy"); - assertThat(generateProject(request)).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestDemoApplication.groovy") .isEqualTo(""" package com.example.demo import org.springframework.boot.SpringApplication + + class TestDemoApplication { + + static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration).run(args) + } + + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/TestcontainersConfiguration.groovy") + .isEqualTo(""" + package com.example.demo + import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection import org.springframework.context.annotation.Bean @@ -299,7 +298,7 @@ void testApplicationWithGroovyAndSpecificContainerIsContributed() { import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -307,8 +306,22 @@ CassandraContainer cassandraContainer() { new CassandraContainer<>(DockerImageName.parse("cassandra:latest")) } - static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication).run(args) + } + """); + assertThat(projectStructure).textFile("src/test/groovy/com/example/demo/DemoApplicationTests.groovy") + .isEqualTo(""" + package com.example.demo + + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import + + @Import(TestcontainersConfiguration) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { } } @@ -320,11 +333,24 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("java"); - assertThat(generateProject(request)).textFile("src/test/java/com/example/demo/TestDemoApplication.java") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestDemoApplication.java").isEqualTo(""" + package com.example.demo; + + import org.springframework.boot.SpringApplication; + + public class TestDemoApplication { + + public static void main(String[] args) { + SpringApplication.from(DemoApplication::main).with(TestcontainersConfiguration.class).run(args); + } + + } + """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/TestcontainersConfiguration.java") .isEqualTo(""" package com.example.demo; - import org.springframework.boot.SpringApplication; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.testcontainers.service.connection.ServiceConnection; import org.springframework.context.annotation.Bean; @@ -332,7 +358,7 @@ void testApplicationWithJavaAndSpecificContainerIsContributed() { import org.testcontainers.utility.DockerImageName; @TestConfiguration(proxyBeanMethods = false) - public class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -340,12 +366,25 @@ CassandraContainer cassandraContainer() { return new CassandraContainer<>(DockerImageName.parse("cassandra:latest")); } - public static void main(String[] args) { - SpringApplication.from(DemoApplication::main).with(TestDemoApplication.class).run(args); - } - } """); + assertThat(projectStructure).textFile("src/test/java/com/example/demo/DemoApplicationTests.java").isEqualTo(""" + package com.example.demo; + + import org.junit.jupiter.api.Test; + import org.springframework.boot.test.context.SpringBootTest; + import org.springframework.context.annotation.Import; + + @Import(TestcontainersConfiguration.class) + @SpringBootTest + class DemoApplicationTests { + + @Test + void contextLoads() { + } + + } + """); } @Test @@ -353,20 +392,30 @@ void testApplicationWithKotlinAndSpecificContainerIsContributed() { ProjectRequest request = createProjectRequest("testcontainers", "data-cassandra"); request.setBootVersion(SPRING_BOOT_VERSION_3_3); request.setLanguage("kotlin"); - assertThat(generateProject(request)).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt") + ProjectStructure projectStructure = generateProject(request); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestDemoApplication.kt").isEqualTo(""" + package com.example.demo + + import org.springframework.boot.fromApplication + import org.springframework.boot.with + + + fun main(args: Array) { + fromApplication().with(TestcontainersConfiguration::class).run(*args) + } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/TestcontainersConfiguration.kt") .isEqualTo(""" package com.example.demo - import org.springframework.boot.fromApplication import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.testcontainers.service.connection.ServiceConnection - import org.springframework.boot.with import org.springframework.context.annotation.Bean import org.testcontainers.containers.CassandraContainer import org.testcontainers.utility.DockerImageName @TestConfiguration(proxyBeanMethods = false) - class TestDemoApplication { + class TestcontainersConfiguration { @Bean @ServiceConnection @@ -375,19 +424,42 @@ fun cassandraContainer(): CassandraContainer<*> { } } + """); + assertThat(projectStructure).textFile("src/test/kotlin/com/example/demo/DemoApplicationTests.kt").isEqualTo(""" + package com.example.demo - fun main(args: Array) { - fromApplication().with(TestDemoApplication::class).run(*args) + import org.junit.jupiter.api.Test + import org.springframework.boot.test.context.SpringBootTest + import org.springframework.context.annotation.Import + + @Import(TestcontainersConfiguration::class) + @SpringBootTest + class DemoApplicationTests { + + @Test + fun contextLoads() { } - """); + + } + """); } @Test void shouldAddHelpSection() { assertHelpDocument(SPRING_BOOT_VERSION_3_3, "testcontainers", "data-mongodb", "postgresql").contains( - "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers") + "https://docs.spring.io/spring-boot/3.3.0/reference/testing/testcontainers.html#testing.testcontainers") + .contains( + "https://docs.spring.io/spring-boot/3.3.0/reference/features/dev-services.html#features.dev-services.testcontainers") + .contains("mongo:latest") + .contains("postgres:latest"); + } + + @Test + void shouldAddHelpSectionWithOldSpringBoot() { + assertHelpDocument(SPRING_BOOT_VERSION_3_2, "testcontainers", "data-mongodb", "postgresql").contains( + "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers") .contains( - "https://docs.spring.io/spring-boot/docs/3.3.0/reference/html/features.html#features.testing.testcontainers.at-development-time") + "https://docs.spring.io/spring-boot/docs/3.2.0/reference/html/features.html#features.testing.testcontainers.at-development-time") .contains("mongo:latest") .contains("postgres:latest"); } diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java index 97482ed6c07..9a4eda8b6c0 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/thymeleaf/ThymeleafBuildCustomizerTests.java @@ -27,6 +27,7 @@ * Tests for {@link ThymeleafBuildCustomizer}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class ThymeleafBuildCustomizerTests extends AbstractExtensionTests { @@ -39,6 +40,15 @@ void thymeleafWithSpringSecurityAndSpringBootAddsExtrasDependency() { "thymeleaf-extras-springsecurity6")); } + @Test + void thymeleafWithOAuth2ClientAndSpringBootAddsExtrasDependency() { + ProjectRequest projectRequest = createProjectRequest("thymeleaf", "oauth2-client"); + assertThat(mavenPom(projectRequest)).hasDependency(Dependency.createSpringBootStarter("thymeleaf")) + .hasDependency(Dependency.createSpringBootStarter("oauth2-client")) + .hasDependency(Dependency.withId("thymeleaf-extras-spring-security", "org.thymeleaf.extras", + "thymeleaf-extras-springsecurity6")); + } + @Test void thymeleafWithoutSpringSecurityDoesNotAddExtrasDependency() { assertThat(mavenPom(createProjectRequest("thymeleaf", "web"))) diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java new file mode 100644 index 00000000000..f9ffe3ea943 --- /dev/null +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinMavenBuildCustomizerTests.java @@ -0,0 +1,76 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.site.extension.dependency.vaadin; + +import io.spring.initializr.web.project.ProjectRequest; +import io.spring.start.site.extension.AbstractExtensionTests; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link VaadinMavenBuildCustomizer}. + * + * @author Moritz Halbritter + */ +class VaadinMavenBuildCustomizerTests extends AbstractExtensionTests { + + @Test + void shouldAddProductionProfile() { + ProjectRequest projectRequest = createProjectRequest("vaadin", "web"); + assertThat(mavenPom(projectRequest)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); + // @formatter:on + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java index 4c6b9d31340..67da3174585 100644 --- a/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java +++ b/start-site/src/test/java/io/spring/start/site/extension/dependency/vaadin/VaadinProjectGenerationConfigurationTests.java @@ -27,30 +27,54 @@ * Tests for {@link VaadinProjectGenerationConfiguration}. * * @author Stephane Nicoll + * @author Moritz Halbritter */ class VaadinProjectGenerationConfigurationTests extends AbstractExtensionTests { - private static final String SPRING_BOOT_VERSION = "3.2.0"; + private static final String SPRING_BOOT_VERSION = "3.3.0"; @Test void mavenBuildWithVaadinAddProductionProfileWithoutProductionModeFlag() { ProjectRequest request = createProjectRequest("vaadin", "data-jpa"); request.setBootVersion(SPRING_BOOT_VERSION); - assertThat(mavenPom(request)).hasProfile("production") - .lines() - .containsSequence(" ", " production", " ", - " ", " ", - " com.vaadin", - " vaadin-maven-plugin", - " ${vaadin.version}", - " ", " ", - " frontend", - " compile", " ", - " prepare-frontend", - " build-frontend", - " ", " ", - " ", " ", " ", - " ", " "); + assertThat(mavenPom(request)).hasProfile("production").lines().containsSequence( + // @formatter:off + " ", + " production", + " ", + " ", + " com.vaadin", + " vaadin-core", + " ", + " ", + " com.vaadin", + " vaadin-dev", + " ", + " ", + " ", + "", + " ", + " ", + " ", + " ", + " com.vaadin", + " vaadin-maven-plugin", + " ${vaadin.version}", + " ", + " ", + " frontend", + " compile", + " ", + " prepare-frontend", + " build-frontend", + " ", + " ", + " ", + " ", + " ", + " ", + " " + ); } @Test @@ -87,6 +111,18 @@ void gitIgnoreWithoutVaadinDoesNotIgnoreNodeModules() { .doesNotContain("node_modules"); } + @Test + void shouldAddLaunchBrowserProperty() { + assertThat(generateProject(createProjectRequest("vaadin"))).textFile("src/main/resources/application.properties") + .contains("vaadin.launch-browser=true"); + } + + @Test + void shouldNotAddLaunchBrowserPropertyIfVaadinIsNotSelected() { + assertThat(generateProject(createProjectRequest("data-jpa"))).textFile("src/main/resources/application.properties") + .doesNotContain("vaadin.launch-browser=true"); + } + @Override protected ProjectRequest createProjectRequest(String... dependencies) { ProjectRequest request = super.createProjectRequest(dependencies); diff --git a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java index d94d38668b9..6d83d76ab4e 100755 --- a/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java +++ b/start-site/src/test/java/io/spring/start/site/project/JavaVersionProjectDescriptionCustomizerTests.java @@ -58,7 +58,7 @@ void mavenBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, @MethodSource("supportedGradleGroovyParameters") void gradleGroovyBuildWithSupportedOptionsDoesNotDowngradeJavaVersion(String language, String javaVersion, String springBootVersion) { - assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasSourceCompatibility(javaVersion); + assertThat(gradleBuild(project(language, javaVersion, springBootVersion))).hasToolchainForJava(javaVersion); } @Test diff --git a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java index 3c6fedb07fd..49cac911690 100644 --- a/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java +++ b/start-site/src/test/java/io/spring/start/site/test/TestMavenVersionResolver.java @@ -19,6 +19,7 @@ import java.util.Map; import io.spring.initializr.versionresolver.MavenVersionResolver; +import io.spring.start.testsupport.TemporaryFiles; /** * A {@link MavenVersionResolver} for tests, which uses a fixed directory for the cache. diff --git a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml b/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml deleted file mode 100644 index 6cc09429e49..00000000000 --- a/start-site/src/test/resources/dependency/hilla/hilla-maven-profile.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - production - - - - dev.hilla - hilla-maven-plugin - ${hilla.version} - - - frontend - compile - - build-frontend - - - true - - - - - - - - \ No newline at end of file diff --git a/start-site/src/test/resources/junit-platform.properties b/start-site/src/test/resources/junit-platform.properties index 308777dedba..5c068dfbba1 100644 --- a/start-site/src/test/resources/junit-platform.properties +++ b/start-site/src/test/resources/junit-platform.properties @@ -16,4 +16,4 @@ junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.config.strategy=custom -junit.jupiter.execution.parallel.config.custom.class=io.spring.start.site.test.JunitMaxParallelismStrategy +junit.jupiter.execution.parallel.config.custom.class=io.spring.start.testsupport.JunitMaxParallelismStrategy diff --git a/test-support/pom.xml b/test-support/pom.xml new file mode 100644 index 00000000000..29137b934e6 --- /dev/null +++ b/test-support/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + io.spring.start + start-parent + ${revision} + + test-support + Support utilities for tests + + + + org.springframework + spring-core + + + org.junit.jupiter + junit-jupiter-engine + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + io.spring.javaformat + spring-javaformat-maven-plugin + + + org.apache.maven.plugins + maven-checkstyle-plugin + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + + + diff --git a/test-support/src/main/java/io/spring/start/testsupport/Homes.java b/test-support/src/main/java/io/spring/start/testsupport/Homes.java new file mode 100644 index 00000000000..a13f24dabb8 --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/Homes.java @@ -0,0 +1,99 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Queue; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.atomic.AtomicInteger; + +import org.springframework.util.Assert; + +/** + * Manages Maven and Gradle home directories. + *

    + * The directories are reused, if possible. If no home is available for reuse, a new one + * will be created. + * + * @author Moritz Halbritter + */ +public class Homes { + + /** + * Maven homes. + */ + public static final Homes MAVEN = new Homes("maven-home"); + + /** + * Gradle homes. + */ + public static final Homes GRADLE = new Homes("gradle-home"); + + private final Set homes = ConcurrentHashMap.newKeySet(); + + private final Queue freeHomes = new ConcurrentLinkedQueue<>(); + + private final AtomicInteger counter = new AtomicInteger(); + + private final String prefix; + + public Homes(String prefix) { + this.prefix = prefix; + } + + /** + * Acquires a path to the home. Callers are responsible to call {@link #release(Path)} + * when done. + * @return the path to the home + */ + public Path acquire() { + Path home = this.freeHomes.poll(); + if (home == null) { + home = createTempDirectory(); + this.homes.add(home); + } + return home; + } + + /** + * Releases a path to the home. + * @param home the path to the home + */ + public void release(Path home) { + Assert.state(this.homes.contains(home), "Invalid home '%s'".formatted(home)); + this.freeHomes.add(home); + } + + private Path createTempDirectory() { + try { + Path path = TemporaryFiles.getTempDir() + .resolve("homes") + .resolve(this.prefix + "-" + this.counter.getAndIncrement()); + Files.createDirectories(path); + return path; + } + catch (IOException ex) { + throw new UncheckedIOException("Failed to create temp directory", ex); + } + } + +} diff --git a/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java similarity index 98% rename from start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java rename to test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java index 97d3c63bbf4..9b0e22f19fb 100644 --- a/start-site/src/test/java/io/spring/start/site/test/JunitMaxParallelismStrategy.java +++ b/test-support/src/main/java/io/spring/start/testsupport/JunitMaxParallelismStrategy.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.test; +package io.spring.start.testsupport; import java.util.concurrent.ForkJoinPool; import java.util.function.Predicate; diff --git a/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java similarity index 98% rename from start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java rename to test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java index 70151d6053c..92fab023fe3 100644 --- a/start-site/src/test/java/io/spring/start/site/test/TemporaryFiles.java +++ b/test-support/src/main/java/io/spring/start/testsupport/TemporaryFiles.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.spring.start.site.test; +package io.spring.start.testsupport; import java.io.IOException; import java.nio.file.Files; diff --git a/test-support/src/main/java/io/spring/start/testsupport/package-info.java b/test-support/src/main/java/io/spring/start/testsupport/package-info.java new file mode 100644 index 00000000000..1399b403a46 --- /dev/null +++ b/test-support/src/main/java/io/spring/start/testsupport/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Test support classes. + */ +package io.spring.start.testsupport; diff --git a/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java new file mode 100644 index 00000000000..3411d61ad40 --- /dev/null +++ b/test-support/src/test/java/io/spring/start/testsupport/HomesTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.spring.start.testsupport; + +import java.nio.file.Path; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link Homes}. + * + * @author Moritz Halbritter + */ +class HomesTests { + + @Test + void shouldAcquireNewHome() { + Homes homes = new Homes("test"); + Path home1 = homes.acquire(); + Path home2 = homes.acquire(); + assertThat(home1).isNotEqualTo(home2); + homes.release(home1); + Path home3 = homes.acquire(); + assertThat(home3).isEqualTo(home1); + } + +}