diff --git a/app/react/Charts/components/LibraryChart.js b/app/react/Charts/components/LibraryChart.js deleted file mode 100644 index 0e2d840b38..0000000000 --- a/app/react/Charts/components/LibraryChart.js +++ /dev/null @@ -1,88 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { Component } from 'react'; -import { connect } from 'react-redux'; -import { t } from 'app/I18N'; - -import { Pie, Bar } from 'app/Charts'; - -export class LibraryChartComponent extends Component { - constructor(props) { - super(props); - this.state = { type: 'pie' }; - this.maxPieItems = 14; - this.assignType = this.assignType.bind(this); - this.typeButton = this.typeButton.bind(this); - } - - assignType(type) { - return () => { - this.setState({ type }); - }; - } - - clusterResults(options) { - return options.reduce((_clusteredResults, option, optionIndex) => { - const clusteredResults = _clusteredResults; - if (optionIndex < this.maxPieItems) { - clusteredResults.push(option); - } - - if (optionIndex === this.maxPieItems) { - clusteredResults.push({ label: t('System', 'Other'), results: option.results }); - } - - if (optionIndex > this.maxPieItems) { - clusteredResults[clusteredResults.length - 1].results += option.results; - } - - return clusteredResults; - }, []); - } - - typeButton(type) { - const className = `btn btn-sm ${this.state.type === type ? 'btn-success' : 'btn-default'}`; - return ( - - ); - } - - render() { - if (!this.props.options) { - return null; - } - - const chart = - this.state.type === 'pie' ? ( - - ) : ( - - ); - - return ( -
-
-
- {this.typeButton('pie')} - {this.typeButton('bar')} -
-

{this.props.label}

- {chart} -
-
- ); - } -} - -LibraryChartComponent.defaultProps = { - options: [], - label: null, -}; - -LibraryChartComponent.propTypes = { - options: PropTypes.arrayOf(PropTypes.object), - label: PropTypes.string, -}; - -export default connect()(LibraryChartComponent); diff --git a/app/react/Charts/components/LibraryCharts.js b/app/react/Charts/components/LibraryCharts.js deleted file mode 100644 index aed6b37e57..0000000000 --- a/app/react/Charts/components/LibraryCharts.js +++ /dev/null @@ -1,131 +0,0 @@ -import React, { Component } from 'react'; -import PropTypes from 'prop-types'; -import { connect } from 'react-redux'; -import { t } from 'app/I18N'; - -import { parseWithAggregations } from 'app/Library/helpers/libraryFilters'; - -import { LibraryChart } from 'app/Charts'; -import arrayUtils from '../utils/arrayUtils'; - -function translateOptions(_property) { - const property = _property; - property.options = property.options.map(_option => { - const option = _option; - option.label = t(property.content, option.label, null, false); - return option; - }); - return property; -} - -function sortFields(_field) { - const field = _field; - field.options = arrayUtils.sortValues(field.options); - return field; -} - -export class LibraryCharts extends Component { - itemResults(item) { - const { aggregations } = this; - const buckets = - aggregations.all && aggregations.all.types ? aggregations.all.types.buckets : []; - const found = buckets.find(agg => agg.key === item.id); - - if (found) { - return found.filtered.doc_count; - } - - if (item.items) { - return item.items.reduce((result, _item) => result + this.itemResults(_item), 0); - } - - return 0; - } - - conformDocumentTypesToFields() { - let items = this.props.collection.toJS().filters || []; - - if (!items.length || this.props.storeKey === 'uploads') { - items = this.props.templates.toJS().map(tpl => ({ id: tpl._id, name: tpl.name })); - } - - if (this.props.storeKey === 'uploads') { - items.unshift({ id: 'missing', name: t('System', 'No type') }); - } - - const fields = [ - { - options: items.map(item => ({ - label: t(item.id, item.name), - results: this.itemResults(item), - })), - label: t('System', 'Document and entity types'), - }, - ]; - - return fields; - } - - render() { - let fields = []; - - if (this.props.aggregations) { - this.aggregations = this.props.aggregations.toJS(); - - if (this.props.fields.size) { - fields = parseWithAggregations(this.props.fields.toJS(), this.aggregations) - .filter( - field => - (field.type === 'select' || field.type === 'multiselect') && - field.options && - field.options.length - ) - .map(translateOptions) - .map(sortFields); - } - - fields = fields.length ? fields : this.conformDocumentTypesToFields(); - } - - return ( -
-
-
- {fields.map((field, index) => ( - - ))} -
-
-
- ); - } -} - -LibraryCharts.propTypes = { - aggregations: PropTypes.object, - fields: PropTypes.object, - collection: PropTypes.object, - templates: PropTypes.object, - storeKey: PropTypes.string, - translationContext: PropTypes.string, -}; - -export function mapStateToProps(state, props) { - const documentTypesExist = props.storeKey && state[props.storeKey].filters.get('documentTypes'); - - return { - aggregations: props.storeKey ? state[props.storeKey].aggregations : null, - fields: props.storeKey ? state[props.storeKey].filters.get('properties') : null, - collection: state.settings.collection, - templates: state.templates, - translationContext: documentTypesExist - ? state[props.storeKey].filters.getIn(['documentTypes', 0]) - : null, - }; -} - -export default connect(mapStateToProps)(LibraryCharts); diff --git a/app/react/Charts/components/specs/LibraryChart.spec.js b/app/react/Charts/components/specs/LibraryChart.spec.js deleted file mode 100644 index 4ea84f1a43..0000000000 --- a/app/react/Charts/components/specs/LibraryChart.spec.js +++ /dev/null @@ -1,114 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { Pie, Bar } from 'app/Charts'; -import { LibraryChartComponent } from '../LibraryChart'; - -describe('LibraryChart', () => { - let component; - let instance; - let props; - - const render = () => { - component = shallow(); - instance = component.instance(); - }; - - describe('render()', () => { - beforeEach(() => { - props = { - options: [], - label: 'chartLabel', - }; - }); - - it('should include label', () => { - render(); - expect(component.find('p').text()).toBe('chartLabel'); - }); - - describe('type toggle buttons', () => { - it('should switch between Pie and Bar', () => { - render(); - const toPieButton = component.find('button').at(0); - const toBarButton = component.find('button').at(1); - - expect(instance.state.type).toBe('pie'); - - toBarButton.simulate('click'); - expect(instance.state.type).toBe('bar'); - - toPieButton.simulate('click'); - expect(instance.state.type).toBe('pie'); - }); - }); - - it('should render a Pie by default', () => { - render(); - expect(component.find(Pie).length).toBe(1); - expect(component.find(Bar).length).toBe(0); - - expect(component.find(Pie).props().data).toEqual(props.options); - }); - - it('should render a Bar if set in type', () => { - render(); - component.setState({ type: 'chart' }); - - expect(component.find(Pie).length).toBe(0); - expect(component.find(Bar).length).toBe(1); - - expect(component.find(Bar).props().data).toEqual(props.options); - expect(component.find(Bar).props().chartLabel).toEqual('chartLabel'); - }); - - describe('result clustering', () => { - beforeEach(() => { - props.options = [ - { label: 'a', results: 1 }, - { label: 'b', results: 1 }, - { label: 'c', results: 3 }, - { label: 'd', results: 1 }, - { label: 'e', results: 1 }, - { label: 'f', results: 7 }, - { label: 'g', results: 1 }, - { label: 'h', results: 1 }, - { label: 'i', results: 1 }, - { label: 'j', results: 1 }, - { label: 'k', results: 1 }, - { label: 'l', results: 1 }, - { label: 'm', results: 1 }, - { label: 'n', results: 1 }, - { label: 'o', results: 1 }, - { label: 'p', results: 1 }, - { label: 'q', results: 1 }, - { label: 'r', results: 2 }, - { label: 's', results: 3 }, - ]; - }); - - it('should cluster the options for the Pie chart', () => { - render(); - - expect(component.find(Pie).props().data).not.toEqual(props.options); - expect(component.find(Pie).props().data[0]).toEqual(props.options[0]); - expect(component.find(Pie).props().data[2]).toEqual(props.options[2]); - expect(component.find(Pie).props().data[5]).toEqual(props.options[5]); - expect(component.find(Pie).props().data[instance.maxPieItems]).toEqual({ - label: 'Other', - results: 8, - }); - }); - - it('should not cluster the options for the Bar chart', () => { - render(); - component.setState({ type: 'chart' }); - - expect(component.find(Bar).props().data).toEqual(props.options); - expect(component.find(Bar).props().data[instance.maxPieItems]).not.toEqual({ - label: 'Other', - results: 8, - }); - }); - }); - }); -}); diff --git a/app/react/Charts/components/specs/LibraryCharts.spec.js b/app/react/Charts/components/specs/LibraryCharts.spec.js deleted file mode 100644 index 6b469b20f4..0000000000 --- a/app/react/Charts/components/specs/LibraryCharts.spec.js +++ /dev/null @@ -1,273 +0,0 @@ -import React from 'react'; -import { shallow } from 'enzyme'; -import { fromJS } from 'immutable'; -import { store } from 'app/store'; -import { t } from 'app/I18N'; - -import { LibraryCharts, mapStateToProps } from '../LibraryCharts'; -import LibraryChart from '../LibraryChart'; - -describe('LibraryCharts', () => { - let component; - let props; - let state; - - const render = () => { - component = shallow(); - }; - - beforeEach(() => { - t.resetCachedTranslation(); - state = { - locale: 'es', - translations: fromJS([ - { - locale: 'es', - contexts: [ - { - id: 'tcontext', - values: { 'Document and entity types': 'Document and entity types translated' }, - }, - { - id: 't2', - values: { t2name: 't2nameTranslated' }, - }, - { - id: 'cid', - values: { n: 'nTranslated' }, - }, - ], - }, - ]), - }; - - spyOn(store, 'getState').and.returnValue(state); - }); - - describe('When no fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 't1', label: 't1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 't2', label: 't2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 't3', label: 't3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'missing', label: 'No value', filtered: { doc_count: 13 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([]), - collection: fromJS({ filters: [] }), - templates: fromJS([ - { _id: 't1', name: 't1name' }, - { _id: 't2', name: 't2name' }, - { _id: 't3', name: 't3name' }, - ]), - translationContext: 'tcontext', - }; - }); - - it('should render templates types on LibraryChart', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().label).toBe('Document and entity types translated'); - expect(LibraryChartElement.props().options[0]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[1]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[2]).toEqual({ label: 't3name', results: 10 }); - }); - - it('should also include no-type when on uploads', () => { - props.storeKey = 'uploads'; - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 'No type', results: 13 }); - expect(LibraryChartElement.props().options[1]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[2]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[3]).toEqual({ label: 't3name', results: 10 }); - }); - - it('should add the results of sub-items in filters', () => { - props.collection = fromJS({ - filters: [ - { - id: 'g1', - name: 'group1', - items: [ - { id: 't1', filtered: { doc_count: 5 } }, - { id: 't2', filtered: { doc_count: 1 } }, - ], - }, // eslint-disable-line camelcase, max-len - { id: 't3', name: 't3name', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - ], - }); - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 'group1', results: 6 }); - expect(LibraryChartElement.props().options[1]).toEqual({ label: 't3name', results: 10 }); - }); - }); - - describe('When no valid fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 't1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 't2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 't3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'missing', filtered: { doc_count: 13 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([{ type: 'not-valid' }]), - collection: fromJS({ filters: [] }), - templates: fromJS([ - { _id: 't1', name: 't1name' }, - { _id: 't2', name: 't2name' }, - { _id: 't3', name: 't3name' }, - ]), - translationContext: 'tcontext', - }; - }); - - it('should render templates types on LibraryChart', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - const LibraryChartElement = component.find(LibraryChart); - - expect(LibraryChartElement.props().options[0]).toEqual({ label: 't1name', results: 5 }); - expect(LibraryChartElement.props().options[1]).toEqual({ - label: 't2nameTranslated', - results: 1, - }); - expect(LibraryChartElement.props().options[2]).toEqual({ label: 't3name', results: 10 }); - }); - }); - - describe('When fields found', () => { - beforeEach(() => { - props = { - aggregations: fromJS({ - all: { - types: { - buckets: [ - { key: 'f1', label: 'f1', filtered: { doc_count: 5 } }, // eslint-disable-line camelcase - { key: 'f2', label: 'f2', filtered: { doc_count: 1 } }, // eslint-disable-line camelcase - { key: 'f3', label: 'f3', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - ], - }, - pname: { - buckets: [ - { key: 'o1', label: 'a', filtered: { doc_count: 10 } }, // eslint-disable-line camelcase - { key: 'o2', label: 'z', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o3', label: 'c', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o4', label: 'n', filtered: { doc_count: 8 } }, // eslint-disable-line camelcase - { key: 'o5', label: 'a', filtered: { doc_count: 2 } }, // eslint-disable-line camelcase - ], - }, - }, - }), - fields: fromJS([ - { - type: 'select', - content: 'cid', - name: 'pname', - }, - { type: 'not-valid' }, - { - type: 'multiselect', - }, - { type: 'multiselect', options: [] }, - ]), - collection: fromJS({ filters: [] }), - translationContext: 'tcontext', - }; - }); - - it('should render one LibraryChart for each supported field with sorted options', () => { - render(); - expect(component.find(LibraryChart).length).toBe(1); - - const LibraryChartElement1 = component.find(LibraryChart).at(0); - - expect(LibraryChartElement1.props().options[0]).toEqual({ - id: 'o1', - value: 'o1', - label: 'a', - results: 10, - }); - expect(LibraryChartElement1.props().options[1]).toEqual({ - id: 'o3', - value: 'o3', - label: 'c', - results: 8, - }); - expect(LibraryChartElement1.props().options[2]).toEqual({ - id: 'o4', - value: 'o4', - label: 'nTranslated', - results: 8, - }); - expect(LibraryChartElement1.props().options[3]).toEqual({ - id: 'o2', - value: 'o2', - label: 'z', - results: 8, - }); - expect(LibraryChartElement1.props().options[4]).toEqual({ - id: 'o5', - value: 'o5', - label: 'a', - results: 2, - }); - }); - }); - - describe('mapStateToProps', () => { - beforeEach(() => { - state = { - a: { aggregations: 'a', filters: fromJS({ properties: 'a', documentTypes: ['dt1'] }) }, - b: { aggregations: 'b', filters: fromJS({ properties: 'b', documentTypes: ['dt2'] }) }, - settings: { collection: 'collection' }, - templates: 'templates', - }; - }); - - it('should return aggregations, fields and translation context according to store key', () => { - expect(mapStateToProps(state, { storeKey: 'a' }).aggregations).toBe('a'); - expect(mapStateToProps(state, { storeKey: 'b' }).aggregations).toBe('b'); - expect(mapStateToProps(state, {}).aggregations).toBe(null); - - expect(mapStateToProps(state, { storeKey: 'a' }).fields).toBe('a'); - expect(mapStateToProps(state, { storeKey: 'b' }).fields).toBe('b'); - expect(mapStateToProps(state, {}).fields).toBe(null); - - expect(mapStateToProps(state, { storeKey: 'a' }).translationContext).toBe('dt1'); - expect(mapStateToProps(state, { storeKey: 'b' }).translationContext).toBe('dt2'); - expect(mapStateToProps(state, {}).translationContext).toBe(null); - }); - - it('should return collection and templates', () => { - expect(mapStateToProps(state, {}).collection).toBe('collection'); - expect(mapStateToProps(state, {}).templates).toBe('templates'); - }); - }); -}); diff --git a/app/react/Charts/index.js b/app/react/Charts/index.js index 7a67e2dd22..5a3bd3fb37 100644 --- a/app/react/Charts/index.js +++ b/app/react/Charts/index.js @@ -2,8 +2,6 @@ import loadable from '@loadable/component'; import colorScheme from './utils/colorScheme'; import arrayUtils from './utils/arrayUtils'; -import LibraryChart from './components/LibraryChart'; -import LibraryCharts from './components/LibraryCharts'; import ExtendedTooltip from './components/ExtendedTooltip'; const Bar = loadable( @@ -25,14 +23,4 @@ const StackedDualBarChart = loadable( ) ); -export { - Bar, - ColoredBar, - ExtendedTooltip, - LibraryChart, - LibraryCharts, - Pie, - StackedDualBarChart, - colorScheme, - arrayUtils, -}; +export { Bar, ColoredBar, ExtendedTooltip, Pie, StackedDualBarChart, colorScheme, arrayUtils }; diff --git a/app/react/Markdown/utils.js b/app/react/Markdown/utils.js index 8773c39a13..682ae8182f 100644 --- a/app/react/Markdown/utils.js +++ b/app/react/Markdown/utils.js @@ -52,8 +52,6 @@ const customExtendedTags = [ 'bar', 'tooltip', 'stackeddualbarchart', - 'librarychart', - 'librarycharts', 'coloredbar', 'extendedtooltip', ]; diff --git a/package.json b/package.json index 0606d747c6..5ea40eb1da 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "uwazi", - "version": "1.195.0-rc8", + "version": "1.196.0-rc3", "description": "Uwazi is a free, open-source solution for organising, analysing and publishing your documents.", "keywords": [ "react" @@ -86,7 +86,7 @@ "cross-spawn": "^7.0.5" }, "dependencies": { - "@aws-sdk/client-s3": "3.726.0", + "@aws-sdk/client-s3": "3.726.1", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", @@ -160,7 +160,7 @@ "isomorphic-fetch": "3.0.0", "jotai": "2.11.0", "json-schema": "^0.4.0", - "json-schema-to-typescript": "^15.0.3", + "json-schema-to-typescript": "^15.0.4", "jvent": "1.0.2", "leaflet": "^1.9.4", "leaflet.gridlayer.googlemutant": "^0.14.1", @@ -250,11 +250,11 @@ "@4tw/cypress-drag-drop": "^2.2.5", "@babel/cli": "7.26.4", "@babel/core": "7.26.0", - "@babel/eslint-parser": "7.25.9", + "@babel/eslint-parser": "7.26.5", "@babel/helper-call-delegate": "^7.12.13", "@babel/helper-get-function-arity": "^7.16.7", "@babel/helper-string-parser": "^7.25.9", - "@babel/parser": "^7.26.3", + "@babel/parser": "^7.26.5", "@babel/plugin-proposal-class-properties": "^7.18.6", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/plugin-proposal-object-rest-spread": "^7.20.7", @@ -267,7 +267,7 @@ "@babel/preset-react": "^7.26.3", "@babel/preset-typescript": "^7.26.0", "@babel/register": "^7.25.9", - "@babel/traverse": "^7.26.4", + "@babel/traverse": "^7.26.5", "@cfaester/enzyme-adapter-react-18": "^0.8.0", "@chromatic-com/storybook": "^3.2.3", "@cypress/react18": "^2.0.1", @@ -351,7 +351,7 @@ "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "5.2.1", - "eslint-plugin-react": "v7.37.3", + "eslint-plugin-react": "v7.37.4", "eslint-plugin-react-hooks": "^5.1.0", "eslint-plugin-storybook": "^0.11.2", "fetch-mock": "^9.11.0", @@ -370,13 +370,13 @@ "node-polyfill-webpack-plugin": "^4.1.0", "nodemon": "^3.1.9", "plop": "^4.0.1", - "postcss": "8.4.49", + "postcss": "8.5.0", "prettier": "3.4.2", "puppeteer": "^13.5.2", "react-dnd-test-backend": "16.0.1", "redux-mock-store": "^1.5.5", "rtlcss-webpack-plugin": "4.0.7", - "sass": "1.83.1", + "sass": "1.83.4", "sass-loader": "16.0.4", "storybook": "^8.1.11", "stream-mock": "^2.0.5", diff --git a/yarn.lock b/yarn.lock index 2b090c5090..aba63c7b8b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -107,16 +107,16 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" -"@aws-sdk/client-s3@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.726.0.tgz#eb065d900c7c5a04f3bcd36f32b2801a76d6b4ab" - integrity sha512-cxn2WvOCfGrME2xygWbfj/vIf2sIdv/UbQ9zJbN4aK6rpYQf/e/YtY/HIPkejCuw2Iwqm4jfDGFqaUcwu3nFew== +"@aws-sdk/client-s3@3.726.1": + version "3.726.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.726.1.tgz#05e9ae74be18758fc9d05a053777a8bb919fb24c" + integrity sha512-UpOGcob87DiuS2d3fW6vDZg94g57mNiOSkzvR/6GOdvBSlUgk8LLwVzGASB71FdKMl1EGEr4MeD5uKH9JsG+dw== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" "@aws-sdk/client-sso-oidc" "3.726.0" - "@aws-sdk/client-sts" "3.726.0" + "@aws-sdk/client-sts" "3.726.1" "@aws-sdk/core" "3.723.0" "@aws-sdk/credential-provider-node" "3.726.0" "@aws-sdk/middleware-bucket-endpoint" "3.726.0" @@ -260,10 +260,10 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/client-sts@3.726.0": - version "3.726.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.726.0.tgz#d878419a0bac65f5bf975c4d94efad5029e46932" - integrity sha512-047EqXv2BAn/43eP92zsozPnR3paFFMsj5gjytx9kGNtp+WV0fUZNztCOobtouAxBY0ZQ8Xx5RFnmjpRb6Kjsg== +"@aws-sdk/client-sts@3.726.1": + version "3.726.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.726.1.tgz#49ab471db7e04792db24e181f8bb8c7787739b34" + integrity sha512-qh9Q9Vu1hrM/wMBOBIaskwnE4GTFaZu26Q6WHwyWNfj7J8a40vBxpW16c2vYXHLBtwRKM1be8uRLkmDwghpiNw== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" @@ -692,22 +692,22 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz#603c68a63078796527bc9d0833f5e52dd5f9224c" - integrity sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ== +"@babel/eslint-parser@7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.26.5.tgz#aa669f4d873f9cd617050cf3c40c19cd96307efb" + integrity sha512-Kkm8C8uxI842AwQADxl0GbcG1rupELYLShazYEZO/2DYjhyWXJIOUVOE3tBYm6JXzUCNJOZEzqc4rCW/jsEQYQ== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== +"@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" + integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" + "@babel/parser" "^7.26.5" + "@babel/types" "^7.26.5" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -896,12 +896,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" + integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== dependencies: - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -1691,23 +1691,23 @@ "@babel/parser" "^7.25.9" "@babel/types" "^7.25.9" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.4": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.25.9", "@babel/traverse@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" + integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== dependencies: "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" + "@babel/generator" "^7.26.5" + "@babel/parser" "^7.26.5" "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" + "@babel/types" "^7.26.5" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.16.7", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.16.7", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" + integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -2800,9 +2800,9 @@ "@types/mdx" "^2.0.0" "@mongodb-js/saslprep@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.0.tgz#022fa36620a7287d17acd05c4aae1e5f390d250d" - integrity sha512-Xfijy7HvfzzqiOAhAepF4SGN5e9leLkMvg/OPOF97XemjfVCYN/oWa75wnkc6mltMSTwY+XlbhWgUOJmkFspSw== + version "1.1.9" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz#e974bab8eca9faa88677d4ea4da8d09a52069004" + integrity sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw== dependencies: sparse-bitfield "^3.0.3" @@ -6215,9 +6215,9 @@ bser@^2.0.0: node-int64 "^0.4.0" bson@^6.2.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/bson/-/bson-6.5.0.tgz#fc4828d065e64e48ea442b1a23099b2e52f7ff0b" - integrity sha512-DXf1BTAS8vKyR90BO4x5v3rKVarmkdkzwOrnYDFdjAY694ILNDkmA3uRh1xXJEl+C1DAh8XCvAQ+Gh3kzubtpg== + version "6.10.1" + resolved "https://registry.yarnpkg.com/bson/-/bson-6.10.1.tgz#dcd04703178f5ecf5b25de04edd2a95ec79385d3" + integrity sha512-P92xmHDQjSKPLHqFxefqMxASNq/aWJMEZugpCjf+AF/pgcUpMMQCg7t7+ewko0/u8AapvF3luf/FoehddEK+sA== buffer-crc32@^1.0.0: version "1.0.0" @@ -8677,10 +8677,10 @@ eslint-plugin-react-hooks@^5.1.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854" integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw== -eslint-plugin-react@v7.37.3: - version "7.37.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.3.tgz#567549e9251533975c4ea9706f986c3a64832031" - integrity sha512-DomWuTQPFYZwF/7c9W2fkKkStqZmBd3uugfqBYLdkZ3Hii23WzZuOLUskGxB8qkSKqftxEeGL1TB2kMhrce0jA== +eslint-plugin-react@v7.37.4: + version "7.37.4" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.4.tgz#1b6c80b6175b6ae4b26055ae4d55d04c414c7181" + integrity sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ== dependencies: array-includes "^3.1.8" array.prototype.findlast "^1.2.5" @@ -11697,10 +11697,10 @@ json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-schema-to-typescript@^15.0.3: - version "15.0.3" - resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.3.tgz#a58bc3e00e4480e76a8ee79471c01233494913be" - integrity sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA== +json-schema-to-typescript@^15.0.4: + version "15.0.4" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz#a530c7f17312503b262ae12233749732171840f3" + integrity sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ== dependencies: "@apidevtools/json-schema-ref-parser" "^11.5.5" "@types/json-schema" "^7.0.15" @@ -12627,10 +12627,10 @@ n-gram@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/n-gram/-/n-gram-1.0.1.tgz" -nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== +nanoid@^3.3.8: + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare-lite@^1.4.0: version "1.4.0" @@ -13895,12 +13895,12 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.49, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: - version "8.4.49" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" - integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== +postcss@8.5.0, postcss@^8.3.11, postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.38, postcss@^8.4.47: + version "8.5.0" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.0.tgz#15244b9fd65f809b2819682456f0e7e1e30c145b" + integrity sha512-27VKOqrYfPncKA2NrFOVhP5MGAfHKLYn/Q0mz9cNQyRAKYi3VNHwYU2qKKqPCqgBmeeJ0uAFB56NumXZ5ZReXg== dependencies: - nanoid "^3.3.7" + nanoid "^3.3.8" picocolors "^1.1.1" source-map-js "^1.2.1" @@ -15127,10 +15127,10 @@ sass-loader@16.0.4: dependencies: neo-async "^2.6.2" -sass@1.83.1: - version "1.83.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846" - integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA== +sass@1.83.4: + version "1.83.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" + integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" @@ -15692,16 +15692,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -15829,14 +15820,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -17272,7 +17256,7 @@ world-countries@5.0.0: resolved "https://registry.yarnpkg.com/world-countries/-/world-countries-5.0.0.tgz#6f75ebcce3d5224d84e9117eaf0d75a7726b6501" integrity sha512-wAfOT9Y5i/xnxNOdKJKXdOCw9Q3yQLahBUeuRol+s+o20F6h2a4tLEbJ1lBCYwEQ30Sf9Meqeipk1gib3YwF5w== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -17290,15 +17274,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"